关于python:Tkinter-Monitor-Window的classmethod

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")