每当我单击重新启动按钮更新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窗口的显示时没有错误,工作正常,但我想线程化。
1条答案
按热度按时间hjzp0vay1#
试试看:
你的代码的问题在于你使用的是
multiprocessing
,这会创建一个新的python进程,它有自己的内存。新的python进程找不到全局变量notify_heading_text
,所以它抛出了错误。我把multiprocessing
切换到threading
,它现在应该可以工作了。进程中的不同线程使用相同的内存,所以这就是为什么错误不再出现的原因。另外,为了简化代码,我替换了
tk.StringVar
,使用了<tkinter.Label>.config(text=<new text>)
编辑:
我在IDLE中看不到错误信息的原因是错误被写入控制台,但是在IDLE的情况下,它没有控制台。因此错误仍然存在,但是没有办法看到它。阅读这篇文章也证明了
multiprocessing
找不到你正在引用的全局变量。这就是为什么我大多数时候使用threading
。