首页 > 解决方案 > 如何查看插入到文本框中的不断更新的变量的变化

问题描述

所以我想创建一个文本框,让我可以显示不断更新的消息。但是,使用我下面的代码,它只显示变量 msg 中的第一条加载消息。我怎样才能解决这个问题?

import tkinter
import threading
import time

global msg

def gui():
    root = tkinter.Tk()

    box = tkinter.Text(width=90, height=30, font=("Lucida Console", 10))
    box.pack(pady=20)
    box.insert(tkinter.END, msg) #this updated msg should be shown

    box.configure(state=tkinter.DISABLED)
    root.mainloop()

def loop():
    global msg
    for x in range(100):
        msg = str(x)
        time.sleep(1)

if __name__ == '__main__':
    p1 = threading.Thread(target=gui)
    p2 = threading.Thread(target=loop)

    p1.start()
    p2.start()

标签: pythonpython-3.xtkinter

解决方案


  1. Text当小部件的配置为 时,您无法更改文本disabled
  2. 在您的代码中,insert(tkinter.END, msg)只会插入一次文本。您可以使用.after每次插入文本。(如果您不想在 中使用 insert 方法,您可以为您的.after绑定 a 。)StringVarbox

要解决这些问题,请尝试以下操作:

import tkinter
import threading
import time
global msg

def gui():
    def insert():
        global msg
        box.configure(state=tkinter.NORMAL)
        box.insert(tkinter.END, msg)
        box.configure(state=tkinter.DISABLED)
        root.after(1000, insert)

    root = tkinter.Tk()

    box = tkinter.Text(width=90, height=30, font=("Lucida Console", 10))
    box.pack(pady=20)
    insert()

    root.mainloop()

def loop():
    global msg
    for x in range(100):
        msg = str(x)
        time.sleep(1)

if __name__ == '__main__':
    p1 = threading.Thread(target=gui)
    p2 = threading.Thread(target=loop)

    p1.start()
    p2.start()

我不建议您使用全局变量msg。您可以考虑使用线程队列。


推荐阅读