Tkinter-Monitor-Window的classmethod

时间:2009-04-20 14:20:00

标签: python tkinter class-method

我想实现一个监控窗口,用于报告用户正在进行的计算。为此我写了一个小班。但是我想以简单的方式在不同的模块中使用它,我想用classmethods实现它。这允许在没有实例的情况下以下列方式使用它:

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

另外,如果我在其他模块中使用它, other_module.py Monitor.write()的输出将显示在同一窗口中。

我可以在每个模块中导入以将特定输出重定向到同一个监视器。除了一件我不理解的小事,我才开始工作。我无法使用我编写的特定处理程序关闭Monitor窗口。我可以使用非类方法,但不能将处理程序作为类方法。

查看代码:

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

所以,这种类方法似乎有效,而且似乎也可以正确的方式访问!任何想法,出了什么问题,它不适用于按钮?

干杯,菲利普

1 个答案:

答案 0 :(得分:3)

您不需要很多类方法就可以轻松地跨多个模块使用对象。

而是考虑在模块导入时创建一个实例,如下所示:

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