2009-04-20 5 views
0

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

Antwort

3

Sie brauchen nicht viel Class nur, um es einfach ein Objekt über mehrere Module zu verwenden.

betrachten stattdessen eine Instanz bei Modul Import Zeit machen wie hier gezeigt:

import Tkinter 

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

monitor = Monitor() 

other_module.py

from monitor import monitor 
monitor.write("Foo") 
+0

das wirklich funktioniert. Obwohl ich immer noch nicht verstehe, warum die Klassenmethode nicht funktioniert, löst Ihre Lösung mein Problem. Vielen Dank! –