【发布时间】:2019-02-06 05:00:58
【问题描述】:
我正在使用在 receiveText() 函数中调用的“on_message”函数来接收来自 MQTT 服务器的传入消息。
正在接收的消息在打印语句中得到反映,但无法插入到列表框中。
虽然使用相同的代码行,但它被插入到 sendText() 函数中。
代码:
class chat_UI:
def __init__(self, roots, nameLogin, friendLogin):
roots.title("Chat window")
self.nameLogin = nameLogin
self.friendLogin = friendLogin
self.scrollbar = Scrollbar(roots) # To see through previous messages.
self.msg_list = Listbox(roots, height=30, width=100, yscrollcommand=self.scrollbar.set)
self.msg_list.grid(row=0, column=0, columnspan=1)
self.scrollbar.grid(sticky = W)
self.msg_list.grid(sticky = E)
#self.msg_list.see(END)
Label(roots, text="Enter Message").grid(row=1,column=0)
self.entry_field = Entry(roots,width=20)
self.entry_field.grid(row=1, column=1)
self.sendB = Button(roots, text='Send', command=self.sendText)
self.sendB.grid(row=2, column = 1, pady=4, sticky=W)
t1 = threading.Thread(target=self.recieveText,args=(friendLogin, nameLogin))
t1.start()
#t1.join()
def sendText(self):
nameLogin = self.nameLogin
friendLogin = self.friendLogin
self.message = self.entry_field.get()
#self.msg_list.insert(END, (self.friendLogin + ": " + recMsg))
self.msg_list.insert(END, (self.nameLogin + ": " + self.message))
mqtt_connect(nameLogin).publish(("techieChat/" + nameLogin), str(self.message), qos = 0)
def on_message(client, userdata, msg):
print("In on messafe fn")
global recMsg
recMsg = str(msg.payload)
print("message in chat_ui on_mesg fn: " + recMsg)
self.msg_list.insert(END, recMsg)
def recieveText(self, friendLogin, nameLogin):
print("message in receive text message: " + recMsg)
client = mqtt_connect(friendLogin)
client.subscribe("techieChat/" + friendLogin)
client.on_message = chat_UI.on_message
chat_UI 类正在从其他类实例化
self.newWindow = Toplevel(self.roots)
chat_UI(self.newWindow, nameLogin, friendLogin)
【问题讨论】:
-
“无法在列表框中插入。” 是什么意思?你的意思是你没有得到任何错误,但数据只是消失了吗?或者,你得到一个错误?如果是这样,错误是什么?通常错误会告诉你想要的问题是什么。
-
嗨@Bryan,我没有收到任何错误,只是没有插入数据。甚至我在插入的时候使用了try-catch但是没有报错,代码也没有进入catch异常。
-
mainloop正在运行吗?您不会在代码中的任何地方显示它正在运行。无论如何,在 tkinter 中使用线程是很困难的,并且尝试从创建根窗口之外的任何线程访问 tkinter 小部件通常是行不通的。 -
是的,主循环正在运行---->>>> if name == 'main':roots = Tk() b = 注册(根)roots.mainloop()
-
线程中调用的receiveText()函数也直接在chat_UI类的init函数中调用。即使那样,它也不起作用。
标签: python-3.x function class tkinter mqtt