我正在使用Tkinter创建一个小时间管理工具,所以我可以继续工作。我在一个方面遇到麻烦,我似乎无法工作。我正在使用错误框,以便它显示在所有其他窗口的前面。
现在,程序在一个跟踪时间的函数上启动一个新线程,并将其与用户为其任务输入的时间进行比较。一旦实时>在用户输入的时间内,它启动另一个线程来生成tkMessageBox。我试过这个没有启动新线程来生成tkMessageBox,问题是一样的。如果用户为两个单独的任务输入相同的时间,则弹出的错误会冻结。我无法专门找到有关此主题的信息...行为很奇怪,因为如果我有2个警报,让我们在0600说1,在0601说1,但我不会关闭弹出的第一个错误框并让它熬夜直到第二个警报触发,第二个警报将只替换第一个警报(如果可能,我希望弹出多个错误框)。它只是具有相同触发时间的警报,导致弹出窗口冻结。
这是我的第一个GUI程序,并且在过去24小时内才开始学习线程和GUI的概念,因此我不确定这是否是线程或tkMessageBox的问题。由于错误框的行为,我认为它是与tkMessageBox模块结合的线程模块。我正在使用的命令是:
tkMessageBox.showerror('TIMER ALERT!!!', comp_msg)
Here is the source我在那里发表评论以提供帮助。我正在谈论的tkMessageBox是第56行。
我想我不确定我是否能用弹出框做我想做的事,如果可以的话,我不知道怎么做。如果我不能,是否有另一种方法可以使用Tkinter生成多个错误类型弹出框?我只想在任何给定时间出现多个盒子。
提前致谢,我真的很感激任何帮助。
编辑:
import thread
from Tkinter import *
#Spawns Error Box. Runs in it's own thread.
def message_box(comp_msg,q): # q is an empty string because of thread module.
print "Spawning Error Box..."
eb =Toplevel()
eb.config(master=None,bg="red")
pop_l = Label(eb,text="ALERT!!!")
pop_l2=Label(eb,text=comp_msg)
pop_l.pack(pady=10,padx=10)
pop_l2.pack(pady=15,padx=10)
return eb
thread.start_new_thread(message_box,(comp_msg,""))
答案 0 :(得分:1)
tkmessageBox默认对话框为modal。您可以为此应用程序实现一个简单的无模式对话框。 Here是一个关于创建自定义对话框的好文档。
通过这种方式,您可以根据应用的需要创建任意数量的新自定义对话框,因为每个对话框都只是一个新的Toplevel。
这是一个简单的Tkinter应用程序,显示主窗口上的时钟。单击该按钮时,它会在新线程中启动新的tkMessageBox对话框。 (如果你运行它)你可以看到运行TK事件循环的主线程正在工作(因为时间正在更新),但错误框没有按预期显示。
#!/usr/bin/env python
import datetime
import threading
from Tkinter import *
import tkMessageBox
class MyApp(Frame):
def __init__(self, root=None):
if not root:
root = Tk()
self.time_var = StringVar()
self.time_var.set('starting timer ...')
self.root = root
Frame.__init__(self, root)
self.init_widgets()
self.update_time()
def init_widgets(self):
self.label = Label(self.root, textvariable=self.time_var)
self.label.pack()
self.btn = Button(self.root, text='show error', command=self.spawn_errors)
self.btn.pack()
def update_time(self):
self.time_var.set( str(datetime.datetime.now()) )
self.root.after(1000, self.update_time)
def spawn_errors(self):
for i in range(3):
t = threading.Thread(target=self.show_error)
t.start()
def show_error(self):
now = datetime.datetime.now()
tkMessageBox.showerror('Error: %s' % (str(now)), now)
if __name__ == '__main__':
app = MyApp()
app.mainloop()