首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同时产生多个tkMessageBox.showerror?

如何同时产生多个tkMessageBox.showerror?
EN

Stack Overflow用户
提问于 2014-01-13 07:03:08
回答 1查看 611关注 0票数 0

我正在创建一个时间管理工具,使用Tkinter,这样我就可以继续工作。我在一个似乎无法工作的方面遇到了困难。我正在使用错误框,以便将其显示在所有其他窗口的前面。

现在,该程序在一个跟踪时间的函数上启动一个新线程,并将其与用户为其任务输入的时间进行比较。一旦实时>用户输入的时间,它将启动另一个线程来生成tkMessageBox。我尝试过这样做,但没有启动一个新线程来生成tkMessageBox,问题也是一样的。如果用户为两个单独的任务输入相同的时间,则会弹出错误。我很难找到关于这个话题的信息。这种行为很奇怪,因为如果我有2个警报,比如0600有1个,0601有一个,但我不关闭弹出的第一个错误框,让它一直保持到第二个警报触发时,第二个警报就会替换第一个警报(如果可能的话,我希望多个错误框弹出)。不过,只有具有相同触发时间的警报才会导致弹出冻结。

这是我的第一个GUI程序,只是在过去的24小时才开始学习线程和GUI的概念,所以我不确定这是线程问题还是tkMessageBox问题。由于错误框的行为,我认为它是与tkMessageBox模块相结合的线程模块。我使用的命令是:

代码语言:javascript
复制
tkMessageBox.showerror('TIMER ALERT!!!', comp_msg)

这是来源,我在里面放了一些评论来帮助你。我说的tkMessageBox是第56行。

我想我不确定我是否能用弹出框做我想做的事,如果可以的话,我不知道怎么做。如果我做不到,有没有其他方法可以用Tkinter生成多个错误类型的弹出框?我只想让多个盒子在任何时候都能出现。

提前谢谢,我真的很感谢你的帮助。

编辑:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 07:36:15

tkmessageBox默认对话框为模式。您可以为此应用程序实现一个简单的无模式对话框。这里是一个关于创建自定义对话框的好文档。

通过这种方式,您可以根据应用程序的需要创建任意多个新的自定义对话框,因为每个对话框都只是一个新的Toplevel。

下面是一个简单的Tkinter应用程序,显示主窗口上的时钟。单击该按钮时,它将在新线程中启动新的tkMessageBox对话框。(如果您运行它),您可以看到运行TK事件循环的主线程正在工作(因为时间正在更新),但是错误框并没有像预期的那样显示。

代码语言:javascript
复制
#!/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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21085618

复制
相关文章

相似问题

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