我是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()
答案 0 :(得分:1)
使用全局变量进行读取是没有问题的,因此解释了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:
z=[1,2,3]
def load():
#global z
z=set()
load()
print(z)
打印[1,2,3]
现在取消注释global z
,它会打印set([])
,这意味着我已成功更改了函数中的z
。