würde Ich mag ein Monitorfenster realisieren, die den Benutzer über die laufenden Berechnungen berichtet. Dazu habe ich eine kleine Klasse geschrieben. Aber da ich es gerne über verschiedene Module auf einfache Art nutzen würde, dachte ich mir, es mit Klassenmethoden zu implementieren. Dies ermöglicht es, in der folgenden Art und Weise zu verwenden, ohne Instanzen:Class für Tkinter-Monitorfenster
from MonitorModule import Monitor
Monitor.write("xyz")
Auch, wenn ich es in einem anderen Modul zu verwenden, die Ausgabe von Monitor.write() innerhalb other_module.py wird angezeigt das gleiche Fenster.
Diese I in jedem Modul importieren können bestimmte Ausgänge auf dem gleichen Monitor umzuleiten. Ich habe es zur Arbeit gebracht, außer einer kleinen Sache, die ich nicht verstehe. Ich kann das Monitor-Fenster nicht mit dem spezifischen Handler schließen, den ich geschrieben habe. Ich könnte es mit der Nicht-Klassenmethode machen, aber nicht mit dem Handler als Klassenmethode.
Blick auf dem Code:
import Tkinter
class Monitor_non_classmothod_way(object):
def __init__(self):
self.mw = Tkinter.Tk()
self.mw.title("Messages by NeuronSimulation")
self.text = Tkinter.Text(self.mw, width = 80, height = 30)
self.text.pack()
self.mw.protocol(name="WM_DELETE_WINDOW", func=self.handler)
self.is_mw = True
def write(self, s):
if self.is_mw:
self.text.insert(Tkinter.END, str(s) + "\n")
else:
print str(s)
def handler(self):
self.is_mw = False
self.mw.quit()
self.mw.destroy()
class Monitor(object):
@classmethod
def write(cls, s):
if cls.is_mw:
cls.text.insert(Tkinter.END, str(s) + "\n")
else:
print str(s)
@classmethod
def handler(cls):
cls.is_mw = False
cls.mw.quit()
cls.mw.destroy()
mw = Tkinter.Tk()
mw.title("Messages by NeuronSimulation")
text = Tkinter.Text(mw, width = 80, height = 30)
text.pack()
mw.protocol(name="WM_DELETE_WINDOW", func=handler)
close = handler
is_mw = True
a = Monitor_non_classmothod_way()
a.write("Hello Monitor one!")
# click the close button: it works
b = Monitor()
Monitor.write("Hello Monitor two!")
# click the close button: it DOESN'T work, BUT:
# >>> Monitor.close()
# works...
So scheint der Class und auch in der richtigen Art und Weise zugänglich zu sein scheint zu funktionieren! Irgendeine Idee, was schief gelaufen ist, dass es mit dem Knopf nicht funktioniert?
Cheers, Philipp
das wirklich funktioniert. Obwohl ich immer noch nicht verstehe, warum die Klassenmethode nicht funktioniert, löst Ihre Lösung mein Problem. Vielen Dank! –