0

私はpythonとTkinterが初めてで、助けが必要です。定義された時間にトップレベル ウィンドウにメッセージを表示するプログラムを作成しようとしています。プログラムに日付、時間、テキストを導入します。「START」ボタンを押して、トップレベル ウィンドウにメッセージが表示されるまで待ちます。スレッドを使用していないときにプログラムが機能しますが、ループが完了するまでメインウィンドウが「フリーズ」します。次に、新しいトップレベル ウィンドウにテキストが表示されます。

私がやりたいことは、メインウィンドウの「フリーズ」を取り除くことです。私のアイデアは、ループの実行にスレッドを使用することでした。しかし、うまくいきません。スレッドでループが終了すると、トップレベル ウィンドウが表示される関数を呼び出す必要があります。しかし、そうではありません。さらにプログラムフリーズ。

tkinter mainloop 内でスレッドを使用すべきではないことはわかっていますが、他の方法で「フリーズ」したメイン ウィンドウを取り除く方法がわかりません。

すべての回答に感謝します。

ラファル

ここに私のプログラムがあります:

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()
4

1 に答える 1