2009-04-20 44 views
0

我想實現一個監視窗口,向用戶報告正在進行的計算。爲此我寫了一個小課。但是,因爲我想以一種簡單的方式在不同的模塊中使用它,所以我想用classmethods來實現它。這允許使用它以下面的方式無實例:也Tkinter-Monitor-Window的classmethod

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

,如果我的其它模塊中使用它,Monitor.write()的輸出內other_module.py將顯示在同一個窗口。

這我可以在每個模塊導入重定向特定的輸出到同一個顯示器。除了一件我不明白的東西外,我找到了它。我無法關閉與我寫的特定處理程序的監視器窗口。我可以用非類方法來做到這一點,但不能用處理器作爲類方法。

看代碼:

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

所以,類方法似乎工作,也似乎是在正確的方式訪問!任何想法,出了什麼問題,它不適用於按鈕?

乾杯,菲利普

回答

3

你並不需要太多的classmethods只是爲了可以很容易地跨越多個模塊的目標。

而是考慮在模塊導入時作出的實例如下所示:

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

,真正起作用。雖然我仍不明白爲什麼classmethod解決方案無法正常工作,但您的解決方案解決了我的問題。謝謝! – 2009-04-22 08:24:38

相關問題