【问题标题】:Unable to insert data in Listbox of tkinter无法在 tkinter 的列表框中插入数据
【发布时间】: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


【解决方案1】:

您是否尝试过使用 tk 标签?他们可以像这样提供可变信息:

        label = tk.Label(textvariable=recMsg)
        label.pack(side="left") #<--- i presume you may want to use grid here

【讨论】:

  • 如果我使用标签,那么聊天中的最后一条消息将被新消息替换。这不是一个好的解决方案
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2021-09-03
相关资源
最近更新 更多