我有一些消息来源,我本周末敲定了这个应该是个人时间管理计划的工作。使用的模块有Tkinter,time,thread,textwrap和datetime。
我昨晚完成了认为它100%正常工作,因为它在我的Ubuntu盒子上运行得很好。现在我正在工作,当我使用我的Windows框时,我正在尝试使用Toplevel()小部件生成的警报窗口冻结整个程序。我不知道为什么会这样。我本周末一直在学习Tkinter和线程模块,所以我不知道windows在处理Tkinter和线程模块方面是否与ubuntu不同。我以为他们会是一样的。
在我在源代码中创建的message_box()函数上启动一个线程后出现问题。当它在我的Windows机器上运行此功能时,它不会在以下内容之后将“Starting Toplevel()”打印到控制台中:
eb = Toplevel()
命令,这让我相信由于某种原因它没有正确启动?我不知道为什么会在我的Windows机器上发生这种情况,但在我的linux机器上工作正常。我用来启动线程的命令是:
thread.start_new_thread(message_box,(comp_msg,""))
message_box功能:
#Spawns Error Box. Runs in it's own thread.
def message_box(comp_msg,q):
print "Spawning Error Box..."
eb = Toplevel(master=None)
print "Starting Toplevel()"
eb.config(bg="black")
eb.title("ALERT!")
fr = Frame(eb)
fr.configure(bg="black")
wrapped = textwrap.wrap(comp_msg, 45)
comp_msg = "\n".join(wrapped)
pop_l = Label(fr,font=("Times New Roman",50),text="ALERT!!!")
pop_l.config(bg="black",fg="red")
if len(comp_msg) < 17:
pop_l2=Label(fr,font=("Times New Roman",26),text=comp_msg)
elif len(comp_msg) < 30 and len(comp_msg) > 16:
pop_l2=Label(fr,font=("Times New Roman",18),text=comp_msg)
else:
pop_l2=Label(fr,font=("Times New Roman",16),text=comp_msg)
pop_l2.config(fg="yellow",bg="black")
pop_l3 = Label(fr,text="")
pop_l3.config(bg="black",fg="black")
pop_l.pack(pady=7,padx=10)
pop_l2.pack(padx=15)
pop_l3.pack()
fr.pack()
return eb
非常感谢任何帮助。我真的有点迷失为什么会发生这种情况,但我也是Tkinter模块,线程模块和GUI编程的新手。
答案 0 :(得分:0)
Tkinter不是线程安全的。您应该只从一个线程创建和访问小部件。