classmethod for Tkinter-Monitor-Window
我想实现一个监视窗口,报告用户正在进行的计算。为此,我写了一个小班。但是由于我想以一种简单的方式在不同的模块之间使用它,我想用类方法实现它。这允许在没有实例的情况下以以下方式使用它:
1 2 | from MonitorModule import Monitor Monitor.write("xyz") |
另外,如果我在另一个模块中使用它,其他_module.py中monitor.write()的输出将显示在同一个窗口中。
我可以在每个模块中导入,将特定的输出重定向到同一个监视器。除了一件我不明白的小事情,我还能用。我无法用我编写的特定处理程序关闭监视器窗口。我可以用非classmethod方法来完成,但不能用作为classmethod的处理程序。
看看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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) +" ") 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) +" ") 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... |
因此,类方法似乎可以工作,而且似乎也可以以正确的方式访问!知道吗,出了什么问题,按钮坏了吗?
干杯,Philipp
您不需要太多的类方法,只是为了方便跨多个模块使用对象。
而是考虑在模块导入时创建一个实例,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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) +" ") else: print str(s) def handler(self): self.is_mw = False self.mw.quit() self.mw.destroy() monitor = Monitor() |
其他模块
1 2 | from monitor import monitor monitor.write("Foo") |