首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法运行Toplevel窗口

无法运行Toplevel窗口
EN

Stack Overflow用户
提问于 2015-03-26 17:12:32
回答 1查看 298关注 0票数 0

我是python和Tkinter的新手,需要一些帮助。我试着写一个程序,它将在定义的时间显示带有消息的顶层窗口。我在程序中引入了日期、小时和文本。按下“开始”按钮,等待出现带有消息的顶层窗口。程序工作时,我不使用线程,但主窗口“冻结”,直到循环完成。然后出现新的带有文本的顶层窗口。

我想要做的是摆脱“冻结”主窗口。我的想法是使用线程来执行循环。但它不起作用。当一个线程中的循环结束时,它应该调用函数,该函数会导致Toplevel窗口出现。但事实并非如此。此外,程序冻结。

我知道我不应该在tkinter主循环中使用线程,但我不知道如何以其他方式摆脱“冻结”主窗口。

谢谢你所有的回答。

Rafal

下面是我的程序:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2015-03-26 17:22:46

销毁Tkinter应用程序中的根窗口实际上意味着销毁(冻结)整个application,而不仅仅是根窗口。根窗口是应用程序的主窗口;它是第一个弹出的,也必须是最后一个弹出的。如果我理解正确的话,您的应用程序没有实际的主窗口:如果从初始窗口打开第二个窗口,则关闭初始窗口不应退出应用程序。我说的对吗?

如果是,使用Tkinter (或tcl/tk)的方法是创建一个假的根窗口并隐藏它。此窗口仅用于在最后一个窗口关闭时退出应用程序:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29274626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档