У меня есть простая программа с двумя классами, одна управляет релейной платой через serial.serial соединение. Другой класс предназначен для графического интерфейса, который будет отправлять команды классу реле, а затем отображать состояние платы реле.настроить объект tkinter из отдельного класса
У меня возникла проблема с отправкой сообщений из класса реле классу tkinter. Сообщения появляются только после завершения команды реле. Я сократил свою программу ниже. Test.test() представляет функцию в моем классе ретрансляции, где в качестве класса MainWindow используется мой графический интерфейс.
Someone указал, что используется threading для обработки сообщений, передаваемых между классами. Это мой единственный вариант? Я еще не добрался до нитей.
from Tkinter import *
import time
import ScrolledText
class Test():
def test(self):
main.textboxupdate(" test start ")
time.sleep(2)
main.textboxupdate(" test middle ")
time.sleep(2)
main.textboxupdate(" test end ")
class MainWindow(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
self.canvas = Canvas(width=1200,height=700)
self.canvas.pack(expand=YES,fill=BOTH)
self.frame = Frame(self.canvas)
self.TextBox = ScrolledText.ScrolledText(self.frame)
self.open = Button(self.frame, text="Open Cover",
command=test.test)
def createtextbox(self, statusmsg):
self.frame.place(x=0,y=0)
self.TextBox.config(state = NORMAL)
self.TextBox.insert(END, statusmsg,('error'))
self.TextBox.config(state = 'disabled', height = 2, width = 35)
self.TextBox.see(END)
self.TextBox.grid(columnspan=2, rowspan = 1)
self.open.grid()
def textboxupdate(self, statusmsg):
statusmsg = statusmsg +'\n'
self.TextBox.config(state = NORMAL)
self.TextBox.insert(END, statusmsg,('error'))
self.TextBox.config(state = 'disabled', height = 10, width = 50)
self.TextBox.see(END)
test = Test()
root = Tk()
main = MainWindow(root)
main.createtextbox('Startup\n')
root.mainloop()
Так что друг просто решил это для меня. Мне нужно self.update_idletasks() в конце функции MainWindow.textboxupdate(). – Oman
Это не исправление, это обходное решение. Вызов 'sleep' в gui в корне ошибочен. –