2009-04-20 10 views
0

Je voudrais réaliser une fenêtre de contrôle qui rend compte de l'utilisateur sur les calculs en cours. Pour ce faire, j'ai écrit un petit cours. Mais comme je voudrais l'utiliser sur différents modules de manière simple, j'ai pensé à l'implémenter avec classmethods. Cela permet de l'utiliser de la manière suivante sans instances:classmethod pour Tkinter-Monitor-Window

from MonitorModule import Monitor 
Monitor.write("xyz") 

De plus, si je l'utilise dans un autre module, la sortie de Monitor.write() au sein other_module.py sera affiché dans la même fenêtre.

Ce que je peux importer dans chaque module pour réacheminer les sorties spécifiques au même moniteur. Je l'ai eu à travailler sauf une petite chose que je ne comprends pas. Je ne peux pas fermer la fenêtre Monitor avec le gestionnaire spécifique que j'ai écrit. Je pourrais le faire avec la méthode de non-classe, mais pas avec le gestionnaire comme méthode de classe.

Regardez le 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... 

Ainsi, le classmethod semble fonctionner et semble aussi être accessible dans le droit chemin! Une idée, qu'est-ce qui a mal tourné, que ça ne marche pas avec le bouton?

Cheers, Philipp

Répondre

3

Vous n'avez pas besoin de beaucoup classmethods juste pour le rendre facile à utiliser un objet sur plusieurs modules.

plutôt envisager faire une instance au moment de l'importation du module comme indiqué ici:

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

qui fonctionne vraiment. Bien que je ne comprends toujours pas pourquoi la solution classmethod ne fonctionne pas, votre solution résout mon problème. Merci! –

Questions connexes