Make a Tv simulator - Python
<p>I am really new to Python and I have to make a tv simulator. I have searched basically the entire net but I cant really find my answer. My problem is that we have to save the state of the tv in a file and when we reopen the programm it must retrieve its previous state i.e. channel, show, volume. I use pickle for saving the file, but it does not retrieve the previous state.  </p>

<p>Hopefully I have been adequatly specific otherwise feel free to ask me for clarification.</p>

<p>Thank you in advance </p>

<pre><code>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()  
</code></pre>

<p>Using global variables for reading is no problem, thus explaining that the <code>save</code> feature works, but assignments to globals are not automatic: You have to make your variables global or it will create local variables instead that will be lost as soon as they go out of scope (thus explaining why your state is not reloaded).</p>

<p>The global variables can be reached by adding <code>global v</code> where <code>v</code> is the variable to be seen as global in the function:</p>

<pre><code>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)
</code></pre>

<p>Simple MCVE:</p>

<pre><code>z=[1,2,3]

def load():
    #global z
    z=set()

load()

print(z)
</code></pre>

<p>prints <code>[1,2,3]</code></p>

<p>Now uncommenting <code>global z</code>, it prints <code>set([])</code>, meaning I was successfully able to change <code>z</code> in the function. </p>

python pickle