我是python和Tkinter的新手,我需要一些帮助。我尝试编写一个程序,它将在定义的时间显示带有消息的顶层窗口。我将日期,小时和文字介绍给程序。按" START"按钮并等待,直到出现带有消息的顶层窗口。 当我不使用线程时,程序工作,但主窗口"冻结"直到循环完成。然后新的顶层窗口出现文本。
我想做的是摆脱"冷冻"主窗口。我的想法是使用线程执行循环。但它不起作用。当循环在一个线程中完成时,它应该调用导致Toplevel窗口出现的函数。但事实并非如此。程序冻结。
我知道我不应该在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()
答案 0 :(得分:0)
销毁Tkinter应用程序中的根窗口实际上意味着破坏(冻结)整个application,而不仅仅是根窗口。根窗口是主要的 申请窗口;它是第一个弹出,必须是最后一个 走。如果我理解正确,您的应用程序没有实际的主要内容 窗口:如果从初始窗口打开第二个窗口,则关闭 初始窗口不应该退出应用程序。我是对的吗?
如果我是,使用Tkinter(或tcl / tk)的方法就是创建一个伪root 窗口并隐藏它。该窗口仅用于退出应用程序时 最后一个窗口关闭: