метод класса для Tkinter-Monitor-Window
-
12-09-2019 - |
Вопрос
Я хотел бы реализовать окно монитора, которое сообщает пользователю о текущих вычислениях.Для этого я написал небольшой класс.Но поскольку мне хотелось бы легко использовать его в разных модулях, я решил реализовать его с помощью методов класса.Это позволяет использовать его следующим образом без экземпляров:
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")