2014-01-14 1 views
0

У меня есть источник, который я забил в этот уик-энд, который должен быть личной программой управления временем для работы. Используемые модули: Tkinter, time, thread, textwrap и datetime.Почему мой виджет Toplevel() замораживает мою программу в Windows, но не ubuntu?

Я закончил его вчера вечером, думая, что он работает на 100%, потому что он отлично работал на моих ящиках Ubuntu. Теперь, когда я нахожусь на работе, когда я использую окно с окнами, окно предупреждения, которое я пытаюсь создать с помощью виджета Toplevel(), замораживает всю программу. Я понятия не имею, почему это так. В этот уик-энд я изучал только Tkinter и модуль потоков, поэтому я не знаю, обрабатывает ли Windows вещи иначе, чем ubuntu в отношении Tkinter и модуля потоков. Я предполагал, что они будут такими же.

Проблема возникает после запуска потока в функции message_box(), которую я создал в моем источнике. При запуске этой функции на моем окна машины, не печатает мой «Начиная 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, поточном модуле и программировании графического интерфейса в целом.

ответ

0

Tkinter не является потокобезопасным. Вы должны создавать и получать доступ к виджетам из одного потока.

+0

Есть ли у вас какие-либо предложения о том, как я могу заставить свою программу работать в Windows? Я серьезно запутался в том, как каждый может программировать GUI в python, когда я не могу найти способ запускать функции и графический интерфейс одновременно. вторая функция, которая контролирует время, запускается, программа ничего не сделает. Так или иначе, мне нужна моя программа, отслеживающая время и в то же время она должна принимать входные данные. Мне также сказали, что потоки - это то, как я должен это делать. Я серьезно запутался в этом вопросе. Я получаю информацию от нескольких источников, которые, кажется, противоречат друг другу :( – DuckPuncher

+0

@Wykleph: что вы подразумеваете под «контролем времени»? Если все, что вы делаете, периодически проверяет время, вам не нужно нить. может использовать 'after' для запуска чего-то каждые несколько миллисекунд, если то, что вы делаете, занимает всего несколько сотен миллисекунд. Если вам действительно нужны потоки, поместите весь свой графический интерфейс в один поток, а ваш код без GUI в другой. –

+0

Я честно не знаю, нужно ли мне отслеживать время ... Что мне нужно сделать, так это установить несколько заданных пользователем времен, которые будут запускать виджет Toplevel() для создания предупреждения типа ошибки для пользователя один раз пришло время. Думаю, ты ответил на мой вопрос, как только я спросил его по-другому. Я принимал то, что слышал от других, и пытался реализовать то, что они сказали мне. Я просто не понимал, что моя цель основана на информации это может быть не совсем точно, как вы указали. узнайте, что произойдет, когда я вернусь домой и начну работать над этим таймером. Еще раз спасибо! – DuckPuncher

Смежные вопросы