Search code examples
pythonclassvariablesinheritancecomposition

how can I pass variables from one class to another?


I updated this question. I'm creating two windows and trying to pass variables that created in class A to class B. Could you please point out what's the problem in my code please? Here is my method:

class Welcome:

       def __init__(self, master, csv_name_sub, csv_name_ses):
            self.entrySes = Entry(self.master, bg="LemonChiffon3")  
            self.entrySub=Entry(self.master,bg="LemonChiffon3")
            self.csv_name_sub = str(self.entrySub.get())
            self.csv_name_ses = str(self.entrySes.get())
            #here users enter some info, they are saved to be used as file name the in following class

class App(Welcome):
       def __init__(self, master):
            Welcome.__init__(self, master, csv_name_ses, csv_name_sub)  #I'm trying use this line to pass the variables from the first class 
            print('session is', self.csv_name_ses)
            print("subject is", self.csv_name_sub)
            self.resultFile = open(
            "C:\\Users\\xxx" + self.csv_name_sub + '_' + self.csv_name_ses +
        '_results.csv', 'w')
       #.....
       #other codes

def main():

    root = Tk()
    myApp = Welcome(root, csv_name_ses, csv_name_sub)
    root.mainloop()

if __name__ == '__main__':
    main()

The program can be run, but the variables csv_name_ses and csv_name_sub are not passed to class App, as they are not printed out in the class.

I have also tried the method of Composition as below, still can't solve the problem:

class Welcome:
    def __init__(self, master, csv_name_sub, csv_name_ses):
            self.entrySes = Entry(self.master, bg="LemonChiffon3")  
            self.entrySub=Entry(self.master,bg="LemonChiffon3")
            self.csv_name_sub = str(self.entrySub.get())
            self.csv_name_ses = str(self.entrySes.get())

class App:
    def __init__(self, master, csv_name_ses, csv_name_sub):
           self.csv_name_sub = csv_name_sub
           self.csv_name_ses = csv_name_ses
           self.welcomePage = Welcome(master, csv_name_ses, csv_name_sub)
           print('session is', self.welcomePage.csv_name_ses)
           print("subject is", self.welcomePage.csv_name_sub)
    self.resultFile = open(
        "C:\\Users\\xxx + self.welcomePage.csv_name_sub + '_' + self.welcomePage.csv_name_ses +
        '_resultsofPart.csv', 'w')

Solution

  • In the use of super class, to inherit var and values from the parent class, the child class need to refer to the parent class, such that Welcome.csv_name_ses.

    class Welcome:
    
       def __init__(self, master, csv_name_sub, csv_name_ses):
            self.entrySes = Entry(self.master, bg="LemonChiffon3")  
            self.entrySub=Entry(self.master,bg="LemonChiffon3")
            writeToFile()
    
       def writeToFile(self):
            Welcome.csv_name_sub = str(self.entrySub.get())
            Welcome.csv_name_ses = str(self.entrySes.get())
    
    
    class App(Welcome):
       def __init__(self, master, csv_name_ses, csv_name_sub):
            Welcome.__init__(self, master, csv_name_ses, csv_name_sub)
            self.csv_name_sub = Welcome.csv_name_sub
            self.csv_name_ses = Welcome.csv_name_ses  #parent.var
    
    def main():
    
       root = Tk()
       myApp = Welcome(root, csv_name_ses, csv_name_sub)
       root.mainloop()