2015-03-26 4 views
0

Я новичок в python и Tkinter, и мне нужна помощь. Я пытаюсь написать программу, которая покажет окно верхнего уровня с сообщением в определенное время. Я вводил дату, час и текст для программирования. Нажмите кнопку «СТАРТ» и подождите, пока не появится окно верхнего уровня с сообщением. Работа с программой, когда я не использую нить, но главное окно «заморозить» до тех пор, пока цикл не будет выполнен. Затем появляется новое окно верхнего уровня с текстом.Не удается запустить окно Toplevel

Что бы я хотел сделать, это избавиться от «замораживания» главного окна. Моя идея состояла в том, чтобы использовать thread для выполнения цикла. Но это не работает. Когда цикл завершен в потоке, он должен вызывать функцию, которая вызывает окно Toplevel. Но это не так. Кроме того, программа замораживается.

Я знаю, что я не должен использовать поток в mainkop tkinter, но я не могу понять, как иначе я могу избавиться от «замораживания» главного окна.

Благодарим вас за все ваши ответы.

Рафал

вот моя программа:

from Tkinter import * 
import time 
import calendar 
import datetime 
import thread 

class Okienka(object): 
    def __init__(self, master): 

    self.rok = Label(master, text = "Podaj rok: ") 
    self.rok.grid(row = 0, sticky = E) 
    self.miesiac = Label(master, text = "Podaj miesiac w formacie XX: ") 
    self.miesiac.grid(row = 1, sticky = E) 
    self.dzien = Label(master, text = "Podaj dzien w formacie XX: ") 
    self.dzien.grid(row = 2, sticky = E) 
    self.godzina = Label(master, text = "Podaj godzine w formacie XX:XX: ") 
    self.godzina.grid(row = 3, sticky = E) 
    self.przyp = Label(master, text = "Tekst przypomnienia: ") 
    self.przyp.grid(columnspan = 2) 

    self.erok = Entry(master, width = 4) 
    self.erok.grid(row = 0 ,column = 1) 
    self.emiesiac = Entry(master, width = 2) 
    self.emiesiac.grid(row = 1 ,column = 1) 
    self.edzien = Entry(master, width = 2) 
    self.edzien.grid(row = 2 ,column = 1) 
    self.egodzina = Entry(master, width = 5) 
    self.egodzina.grid(row = 3 ,column = 1) 
    self.eprzyp = Text(master, width = 50, heigh = 10, font = ("Helvetica",10)) 
    self.eprzyp.grid(columnspan = 2) 

    self.button1 = Button(master, text = "START", fg = "red", command = watek) 
    self.button1.grid(columnspan = 2) 

def watek(): 
    thread.start_new_thread(Czas,()) 

def Czas(): 
    data = "{0}-{1}-{2} {3}".format(c.erok.get(), c.emiesiac.get(), c.edzien.get(), c.egodzina.get()) 

    while True: 
     aktualny_czas = datetime.datetime.today() 
     czas_str = time.strftime(str(aktualny_czas)) 
     czas_str = czas_str[:16] 
     print czas_str 

     if data == czas_str:   
      okienko() 
     break 

def okienko(): 
     komunikat = c.eprzyp.get("1.0","end-1c")   
     top = Toplevel() 
     top.title("Przypomnienie") 
     msg = Message(top, text = komunikat) 
     msg.pack()  

root = Tk() 
c = Okienka(root) 
root.mainloop() 

ответ

0

Уничтожая корневое окно в приложении Tkinter фактически означает уничтожение (замораживание) весь application не только корень окна. Корневое окно является основным окном для приложения; он первый всплывает и должен быть последним до . Если я правильно понял, ваше приложение не имеет фактического главного окна : если второе окно открывается из начального окна, закрытие начального окна не должно покидать приложение. Я прав?

Если я, то способ сделать это с помощью Tkinter (или tcl/tk) - создать поддельный корень и скрыть его. Это окно будет использоваться только для выхода из приложения, когда последнее окно закрыто:

+0

Я не понимаю, что вы имеете в виду. Я попытался уничтожить root в функции, которая вызывает окно верхнего уровня, и я получил некоторые результаты (два пустых окна появились:/и приложение умерло). В общем, идея заключается в том, чтобы цикл работал в backgroud после нажатия кнопки «START». Когда цикл завершен, появляется всплывающее окно с сообщением, которое было определено в главном окне. – pazzdzioh