制作电视模拟器Python

2024-10-02 16:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python很陌生,我必须制作一个电视模拟器。我基本上搜索了整个网络,但我真的找不到我的答案。我的问题是,我们必须将电视的状态保存在一个文件中,当我们重新打开节目时,它必须检索它以前的状态,即频道、节目、音量。我使用pickle保存文件,但它不检索以前的状态。在

希望我已经非常具体,否则请随时要求我澄清。在

提前谢谢你

class Television(object):
    currentState = []

    def __init__(self,volume,channel,show):
        self.volume=volume
        self.channel=channel
        self.show=show

    def changeChannel(self,choice):

        self.channel=choice 
        return self.channel

    def increaseVolume(self,volume):
        if volume in range(0,9):
            self.volume+=1
        return self.volume

    def decreaseVolume(self,volume):
        if volume in range(1,10):            
            self.volume-=1        
        return self.volume

    #def __str__(self):
        #return "[channel: %s show: %s,volume: %s]" % (self.channel, self.show, self.volume)
    def __str__(self):
        return  "Channel: "+str(self.channel)+\
                "\nShow: "+ str(self.show)+\
                "\nVolume: "+ str(self.volume)
                                #printing object, state = "print(object)"
    def getState(self):         
        return self.volume

    def setState (self,channel,show):
        self.volume=5
        self.channel=channel[1]
        self.show=show[1]


#####################################################################

from tvsimulator import* 

import pickle, os.path

#from builtins import int

channel = ["1. Mtv","2. Tv 3","2. Svt","4. Kanal4"]

show = ["Music is life", "Har du tur i karlek?", "Pengar ar inte allt","Vem vill inte bli miljonar"]

volume = 5

global myTv

livingRoomTv = Television(channel,show,volume)

kitchenTv = Television(channel,show,volume)  




def saveFile(): 

    with open("tvState.pkl",'wb') as outfile:

        pickle.dump(livingRoomTv,outfile)
        pickle.dump(kitchenTv,outfile)

def importFile():       

    with open("tvState.pkl",'rb') as infile:

        livingRoomTv = pickle.load(infile)
        kitchenTv = pickle.load(infile)


def channelMenu(myTv):    
    for i in channel:
        print(i)                
    choice =int(input(print("Which channel do you want?")))
    choice = channel[choice-1]                    
    myTv.changeChannel(choice)
    selection =myTv.changeChannel(choice) 
    return selection   


def methodSelection(myTv):  

    print("1: Change channel")
    print("2: Volume Up")
    print("3: Volume Down")
    print("4: Return to main menu")       
    choice = int(input(print("\nPleas make a selection from the above list\n")))   
    print(myTv)
    try:                    
        if choice ==1:   
            channelMenu(myTv)
            print(myTv)          
            methodSelection(myTv)
        if choice ==2:
            myTv.increaseVolume(volume)
            print(myTv)
            methodSelection(myTv)
        if choice ==3:
            myTv.decreaseVolume(volume)
            print(myTv)
            methodSelection(myTv)
        if choice ==4:
            mainMenu()
    except:
        print("Wrong selection, please try again")




def mainMenu(): 

    print("1: Livingroom Tv")
    print("2: Kitchen TV")
    print("3: Exit\n")    
    choice = int(input(print("Please make a selection from the above list")))          
    try:              
        if choice == 1:
            print("Living room\n")       
            print(livingRoomTv)
            myTv = livingRoomTv        
            methodSelection(myTv)       
        if choice == 2:
            print("Kitchen\n")      
            print(kitchenTv)
            myTv=kitchenTv        
            methodSelection(myTv)        
        if choice == 3:
            saveFile()
            print("Tv Shut Down")
            exit
    except:
        print("Wrong selection, please try again")



def startUp():

    if os.path.isfile("tvState.pkl"):
        print("Tv restored to previous state")
        importFile()
        kitchenTv.getState()
        livingRoomTv.getState()
        mainMenu()               

    else:
        print("Welcome")
        kitchenTv.setState(channel, show)
        livingRoomTv.setState(channel, show)
        saveFile()
        mainMenu()    

startUp()  

Tags: selfreturnifdefshowchannelpickleprint
1条回答
网友
1楼 · 发布于 2024-10-02 16:23:09

使用全局变量进行读取没有问题,因此可以解释save特性可以工作,但是全局变量的赋值不是自动的:必须使变量全局化,否则它将创建局部变量,一旦变量超出范围,这些变量就会丢失(从而解释为什么不重新加载状态)。在

全局变量可以通过添加global v来实现,其中v是要在函数中被视为全局变量的变量:

def importFile():       
    global livingRoomTv # link to the global variable
    global kitchenTv    # link to the global variable

    with open("tvState.pkl",'rb') as infile:

        livingRoomTv = pickle.load(infile)
        kitchenTv = pickle.load(infile)

简单MCVE:

^{pr2}$

打印[1,2,3]

现在取消了global z的注释,它打印set([]),这意味着我成功地改变了函数中的z。在

相关问题 更多 >