Tkinter中的非阻塞信息对话框

8

我需要一个简单的信息框来显示一些状态输出,我可以使用print命令将其转储到控制台。我发现最简单的可能性是以下内容:

import Tkinter as tk
root = tk.Tk()
root.withdraw()

from tkMessageBox import showinfo    
showinfo('some caption', 'some info')

这种实现的唯一问题是,我的程序(不是用Tkinter编写的)将不会继续运行,直到按下showinfo消息框的“ok”按钮。也就是说,showinfo对话框将被阻止。
因此,我的问题是:有没有一种简单的方法使showinfo不阻塞?在Tkinter中是否有其他非阻塞的消息框实现?我可以想到一个典型的使用场景是显示帮助页面 - 窗口应该打开,主程序继续正常运行。
编辑1:这里有一个简单的帮助窗口,但不幸的是,它不会显示出来,除非我启动不同的tkMessageBox或类似的对象:
class TextInfo(object):

    def __init__(self, parent, window_title = 'window', textfield = 'a text field', label = None):

        self.top = tk.Toplevel(parent)
        self.parent = parent
        self.window_title = window_title
        self.textfield = textfield

        # set window title
        if window_title:
            self.top.title(window_title)

        # add label if given
        if label:
            tk.Label(self.top, text=window_title).grid(row=0)

        # create the text field
        self.textField = tk.Text(self.top, width=80, height=20, wrap=tk.NONE)
        if textfield:
            self.textField.insert(1.0, textfield)
        self.textField.grid(row=1)

        # create the ok button
        b = tk.Button(self.top, text="OK", command=self.ok)
        b.grid(row=2)

    def ok(self):
        self.top.destroy()

这是我调用窗口的方式:

root = tk.Tk()
root.withdraw()
TextInfo(self.root, window_title, textfield, label)  
# don't call root.mainloop() here, because this will lead to blocking.

我需要设置某种窗口属性或事件才能让窗口显示出来吗?如果我调用root.mainloop(),窗口会显示出来,但是我的GUI又会被阻塞。


Dialog(以及派生的DialogBox)在其Show方法中执行不可配置的全局抓取,因此,除了子类化并使用替代Show方法之外,您无法使Dialog非阻塞。请参见http://perlmonks.org/?node_id=836513以获取Perl实现。 - Joran Beasley
@JoranBeasley,那么在Tkinter中没有一种“帮助页面”对话框会弹出并停留在那里吗? - memyself
1个回答

2
不要使用tkMessageBox,因为它没有太多的配置选项。只需创建自己的自定义对话框,使其看起来像一个。这个页面详细介绍了如何创建自定义Tkinter对话框。

谢谢!我已经编写了一些代码,但不幸的是,它只能在控制台上运行 - 无法通过我的GUI运行。不知何故,只有当我启动一个“正式”的Tkinter窗口时,我的Tkinter对话框才会显示出来。你知道我的实现有什么问题吗? - memyself
你可能需要在后台运行适当的GUI。我认为你可以在显示对话框时隐藏主GUI,然后再次显示它。这个链接展示了一种实现方法:http://www.daniweb.com/software-development/python/threads/243559/need-help-tkinter-hide-window-then-show - Mike Driscoll
我不使用Tkinter作为我的主要GUI。你的解决方案不起作用 :( - memyself
只需在不同的线程中启动应用程序的Tkinter部分,或者使用子进程即可。 - Mike Driscoll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接