Класс-метод для Ткинтер-Монитор-Окно - PullRequest
0 голосов
/ 20 апреля 2009

Я хотел бы реализовать окно монитора, которое сообщает пользователю о текущих вычислениях. Для этого я написал небольшой класс. Но так как я хотел бы легко использовать его в разных модулях, я решил реализовать его с помощью методов класса. Это позволяет использовать его без экземпляров следующим образом:

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

Итак, метод класса, кажется, работает, а также, кажется, доступен правильно! Любая идея, что пошло не так, что она не работает с кнопкой?

Приветствия, Филипп

1 Ответ

3 голосов
/ 21 апреля 2009

Вам не нужно много методов классов, чтобы просто использовать объект в нескольких модулях.

Вместо этого рассмотрите возможность создания экземпляра во время импорта модуля, как показано здесь:

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