Вопрос

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

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

Кроме того, если я использую его в другом модуле, вывод Монитор.write() в пределах другой_модуль.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...

Итак, метод класса, похоже, работает и доступен правильным способом!Есть идеи, что пошло не так, что кнопка не работает?

Приветствую, Филипп

Это было полезно?

Решение

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

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

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

другой_модуль.py

from monitor import monitor
monitor.write("Foo")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top