无法更新tkinter python中的文本

a14dhokn  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(191)

每当我单击重新启动按钮更新notification1(标签)的文本时

from tkinter import *
import tkinter as tk
from multiprocessing import Process

def notify(text):
    notify_heading_text.set(f"App : {text}")
    
    
def on_restart():
    notify("This text will be updated")
    t1 = Process(target=print_hi)
    t1.daemon = True
    t1.start()
    
    
def print_hi():
    notify("Hi There")


if __name__ == '__main__':
    root = Tk()
    root.geometry('400x400')
    root.resizable(0, 0)
    global notify_heading_text
    notify_heading_text = tk.StringVar()

    notification1 = Label(height=1, textvariable=notify_heading_text, bd=0)
    notification1.pack(fill=X, side=TOP)
    notification1.configure(bg='white', fg='black', font=('Helvetica', 12, 'bold'), pady=10)
    bind3 = tk.StringVar()
    b3 = Button(root, borderwidth=0, fg="white", activebackground='#40556a', activeforeground='white', bg="black",
                textvariable=bind3, command=on_restart, font=('Helvetica', 12, 'bold'), padx=10, pady=6)
    bind3.set('Restart')
    b3.pack(side=RIGHT)

    root.mainloop()

我收到此错误

Process Process-1:
Traceback (most recent call last):
  File "C:\Users\prana\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "C:\Users\prana\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\prana\PycharmProjects\tkinter\main.py", line 18, in print_hi
    notify("Hi There")
  File "C:\Users\prana\PycharmProjects\tkinter\main.py", line 7, in notify
    notify_heading_text.set(f"App : {text}")
NameError: name 'notify_heading_text' is not defined

**on_restart()方法中的notify("This text will be updated")工作正常并更新文本,但print_hi()**方法中的相同方法不更新Tkinter窗口的文本,称'notify_heading_text'未定义,尽管它被声明为全局变量。由于某些原因,我无法使用root.after(),它更新Tkinter窗口的显示时没有错误,工作正常,但我想线程化。

hjzp0vay

hjzp0vay1#

试试看:

import tkinter as tk
from threading import Thread

def notify(text):
    label.config(text=f"App : {text}")

def on_restart():
    notify("This text will be updated")
    t1 = Thread(target=print_hi, daemon=True)
    t1.start()

def print_hi():
    notify("Hi There")

root = tk.Tk()

label = tk.Label(root, text="")
label.pack(fill="x", side="top")

button = tk.Button(root, text="Restart", command=on_restart)
button.pack()

root.mainloop()

你的代码的问题在于你使用的是multiprocessing,这会创建一个新的python进程,它有自己的内存。新的python进程找不到全局变量notify_heading_text,所以它抛出了错误。我把multiprocessing切换到threading,它现在应该可以工作了。进程中的不同线程使用相同的内存,所以这就是为什么错误不再出现的原因。
另外,为了简化代码,我替换了tk.StringVar,使用了<tkinter.Label>.config(text=<new text>)

编辑:

我在IDLE中看不到错误信息的原因是错误被写入控制台,但是在IDLE的情况下,它没有控制台。因此错误仍然存在,但是没有办法看到它。阅读这篇文章也证明了multiprocessing找不到你正在引用的全局变量。这就是为什么我大多数时候使用threading

相关问题