Tkinter 中的非阻塞信息对话框

mem*_*elf 7 python tkinter

我需要一个简单的信息框来显示一些状态输出,我也可以使用print. 我发现的最简单的可能性如下:

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

from tkMessageBox import showinfo    
showinfo('some caption', 'some info')
Run Code Online (Sandbox Code Playgroud)

这个实现的唯一问题是我的程序(不是用 Tkinter 编写的)不会继续运行,直到showinfo按下消息框的“确定”按钮。也就是说,showinfo对话框将被阻止。

因此我的问题有没有一种简单的方法可以实现showinfo非阻塞?Tkinter 中是否有非阻塞的替代消息框实现?我可以想到显示帮助页面的典型用例 - 窗口应该打开并且主程序继续正常运行。

EDIT1:这是我想出的一个简单的帮助窗口,但不幸的是它没有出现,除非我启动一个不同的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()
Run Code Online (Sandbox Code Playgroud)

这就是我调用窗口的方式:

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

是否需要为窗口设置某种属性或事件?如果我调用root.mainloop()该窗口将显示,但随后我的 GUI 再次被阻止。

Mik*_*oll 2

不要使用 tkMessageBox,因为它不允许太多配置。只需创建您自己的自定义对话框,看起来就像一个对话框。本页讨论了很多有关创建自定义 Tkinter 对话框的内容