2017-05-23 7 views
0

Ich habe diese Frage aktualisiert. Ich erstelle zwei Fenster und versuche, Variablen, die in Klasse A erstellt wurden, an Klasse B zu übergeben. Könntest du bitte auf das Problem in meinem Code hinweisen? Hier ist meine Methode:Wie kann ich Variablen von einer Klasse zur anderen übergeben?

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() 

Das Programm kann ausgeführt werden, aber die Variablen csv_name_ses und csv_name_sub sind nicht auf class App weitergegeben, wie sie in der Klasse nicht ausgedruckt werden.

Ich habe auch die Methode der Composition wie unten versucht, kann immer noch nicht das Problem lösen:

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') 

Dank!

+0

Akzeptieren Sie sie als Argumente (es gibt mehrere Methoden) und rufen Sie die Basisklasse auf. Sie möchten auch eine Instanz 'App' * erstellen, die eine Unterklasse von * 'Willkommen' ist - es gibt nur eine * Instanz *, die in einem Unterklassenszenario erstellt wurde und es ist verwirrend, an "an Klasse übergeben" zu denken. Oder ist es vielleicht besser, dass "Willkommen" eine Unterklasse der App ist? Oder vielleicht wäre es einfacher und weniger verwirrend, die Komposition zu verwenden? – user2864740

+0

Danke für Ihren Kommentar und Vorschlag. Ich habe versucht, Komposition zu verwenden, kann aber die Variablen in der Unterklasse immer noch nicht verwenden. Ich habe in der Frage auf den neuesten Stand gebracht, würdest du es mir bitte ansehen? Danke – Kay

Antwort

0

Bei der Verwendung von super class, var und Werten aus der übergeordneten Klasse zu erben, muß die untergeordnete Klasse auf die übergeordneten Klasse beziehen, so dass 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() 
0

Das Problem ist, dass die Welcome-Klasse 3 Argumente benötigt, um instanziert zu werden, und Sie geben nur einen, der "root" ist.

+0

Danke, ich habe zwei andere Variablen hinzugefügt und das Programm kann jetzt ausgeführt werden. Aber 'csv_name_sub' und' csv_name_ses' gehen immer noch nicht in die zweite Klasse über, da die Werte nicht in der zweiten Klasse gedruckt werden können. Weißt du, was ist der Fehler in Bezug auf dieses Problem mit passierenden Variablen? Vielen Dank! – Kay

0

Da die Konstruktorfunktion der Klasse Welcome__init__(self, master, csv_name_sub, csv_name_ses) ist, müssen Sie auch einen Wert für csv_name_sub und csv_name_ses angeben, um diese Klasse zu instanziieren. Da Sie nicht tatsächlich sind die übergebenen Werte von csv_name_sub und csv_name_ses (siehe die ersten vier Zeilen in der __init__ Funktion Ihrer Welcome Klasse), dies könnte eine Lösung sein, die funktionieren:

class Welcome: 

    def __init__(self, master): 
     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) 
     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 
+0

Danke für deine Antwort. Aber es übergibt nicht die Variablen in 'class App'. Und ich verstehe nicht wirklich, was Sie mit den Pässen meinen, die Werte werden nicht wirklich verwendet, da ich sie nur bei der Benennung meines Dokuments verwende. Unterscheidet sich das von anderen Nutzungsarten? – Kay

1

Standard verwenden Argumente und or zu init die self Felder:

class Welcome: 

    def __init__(self, master, csv_name_sub=None, csv_name_ses=None): 
     self.entrySes = Entry(self.master, bg="LemonChiffon3") 
     self.entrySub=Entry(self.master,bg="LemonChiffon3") 
     self.csv_name_sub = csv_name_sub or str(self.entrySub.get()) 
     self.csv_name_ses = csv_name_ses or str(self.entrySes.get()) 
+0

Danke für deinen Vorschlag. Ich habe versucht, 'csv_name_sub = None',' csv_name_ses = None' zu ​​verwenden, aber die Variablen können immer noch nicht von 'class Welcome' in' class App' gehen. Haben Sie eine genauere Erklärung, warum ich hier 'None' hinzufügen soll? Vielen Dank! – Kay

Verwandte Themen