auf das Attribut einer Klasse zugreift Ich habe eine Hauptdatei, die hauptsächlich die GUI (Tkinter-Code) enthält. Ein Fenster mit Label
, einem Text
Bereich, in dem der Text aktualisiert wird, und einer Button
.Python: Wie man von einem Modul
# ~/main.py
import Tkinter
import buttonevent
from itertools import cycle
msglist = ['main_msg1\n', 'main_msg2\n', 'main_msg3\n', 'main_msg4\n']
class Root(object):
def __init__(self, master):
self.msglist = cycle(msglist)
self.master = master
self.frame1 = Tkinter.Frame(master)
self.frame1.pack()
Root.status = Tkinter.StringVar()
self.status_info = Tkinter.Label(self.frame1, textvariable=Root.status)
self.status_info.pack()
Root.status.set("Set by constructor")
self.frame2 = Tkinter.Frame(master)
self.frame2.pack()
Root.textinfo = Tkinter.Text(self.frame2, width=20, height=10)
Root.textinfo.insert(Tkinter.END, 'message 1')
Root.textinfo.config(font='Arial')
Root.textinfo.pack()
Root.textinfo.config(bg=master.cget('bg'), relief=Tkinter.SUNKEN)
Root.textinfo.configure(state='disabled')
self.frame3 = Tkinter.Frame(master)
self.frame3.pack()
self.button = Tkinter.Button(self.frame3, text='Ok', command=self.ok)
self.button.pack()
def ok(self):
text_info(self.msglist.next())
buttonevent.do_event()
buttonevent.do_stuff()
def text_info(msg):
Root.textinfo.configure(state='normal')
Root.textinfo.insert(Tkinter.END, msg)
Root.textinfo.see(Tkinter.END)
Root.textinfo.configure(state='disabled')
if __name__ == '__main__':
root = Tkinter.Tk()
main_window = Root(root)
root.mainloop()
Die Benutzeraktionen sind in einer anderen Datei definiert.
Zuvor war der Code in einer einzigen Datei, jetzt versuche ich, es als eine multiple Datei basierend auf seiner Funktionalität zu schreiben. Wenn der Benutzer etwas tut, wird eine Nachricht im Bereich Text
angezeigt. Da das Feld Text
Nachricht anzeigt und einige Gemeinsamkeiten während jeder Anzeige/Aktivität/Aktualisierung aufweist, habe ich eine Funktion dafür in der Hauptdatei als text_info
erstellt.
Sagen Sie, wenn ich eine andere Nachricht auf dem Text
Feld senden möchte, um von einer anderen Datei zu aktualisieren, .. zum Beispiel von der Datei buttonevent.py
, wie kann ich es erreichen.
, wenn ich es laufen bekomme ich Fehler als
$ python main.py
do_msg1
Exception in Tkinter callback
Traceback (most recent call last):
File "/home/miniconda2/lib/python2.7/lib-tk/Tkinter.py", line 1537, in __call__
return self.func(*args)
File "main.py", line 38, in ok
buttonevent.do_event()
File "/home/buttonevent.py", line 14, in do_event
main.text_info(xx)
File "/home/main.py", line 51, in text_info
Root.textinfo.configure(state='normal')
AttributeError: type object 'Root' has no attribute 'textinfo'
- Wie kann ich eine Funktion in der Haupt-py-Datei aus einer anderen py-Datei aufrufen.
- was der beste Weg ist, würde ich die Verwendung eines
class
oderfunction
für dietext_info
in dermain.py
Datei - machen Wenn dies Code nicht der richtige Weg ist, bitte korrigieren Sie mich.
'textinfo' ist ein Klasse-Attribut, das nicht eingestellt ist, bis Sie mindestens eine Instanz der Root-Klasse initialisiert haben .. Sie müssen eine Instanz der Root-Klasse in Ihrer ursprünglichen Datei, bevor Sie erstellen kann die Funktion text_info verwenden. Der Code in der Methode "__init__" wird niemals ausgeführt, wenn nicht mindestens ein Objekt instanziiert wird. Aha. Das Problem ist, dass Sie haben 'if __name__ == '__main __':' was bedeutet, dass alles danach nicht ausgeführt wird, wenn Sie Main importieren ... –