为什么我的Toplevel()小部件在Windows上冻结我的程序而不是ubuntu?

时间:2014-01-14 02:41:27

标签: python windows multithreading ubuntu tkinter

我有一些消息来源,我本周末敲定了这个应该是个人时间管理计划的工作。使用的模块有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

Full source

非常感谢任何帮助。我真的有点迷失为什么会发生这种情况,但我也是Tkinter模块,线程模块和GUI编程的新手。

1 个答案:

答案 0 :(得分:0)

Tkinter不是线程安全的。您应该只从一个线程创建和访问小部件。

相关问题