没有窗口的Tkinter消息框?

42

我想在运行在Ubuntu上的Python脚本中展示一个信息窗口。我正在使用以下代码:

import tkMessageBox
tkMessageBox.showinfo("Say Hello", "Hello World")

这个方法可以运行,但是会出现一个空白的窗口,并在窗口顶部显示消息框。我该如何摆脱窗口,只将消息框居中显示在屏幕上 (窗口管理器为gnome 2)?

这只是为了从命令行脚本中显示一些信息(密码,所以我不想将其直接输出到控制台)。

5个回答

61

Tkinter必须要有一个根窗口。如果您没有创建根窗口,系统会自动为您创建一个。如果您不想要这个根窗口,可以先创建它然后将其隐藏:

import Tkinter as tk
root = tk.Tk()
root.withdraw()
tkMessageBox.showinfo("Say Hello", "Hello World")

你的另一个选择是不使用tkMessageBox,而是将消息放入根窗口。这种方法的优点是你可以使窗口看起来完全符合你的要求。

import Tkinter as tk
root = tk.Tk()
root.title("Say Hello")
label = tk.Label(root, text="Hello World")
label.pack(side="top", fill="both", expand=True, padx=20, pady=20)
button = tk.Button(root, text="OK", command=lambda: root.destroy())
button.pack(side="bottom", fill="none", expand=True)
root.mainloop()

(个人而言,我会选择更多面向对象的方法,但为了这个例子保持代码简洁,我尝试保持现状)


有没有办法让文本可选,这样我就可以复制它了? - user1491250
@user1491250:是的。使用文本小部件而不是标签。您可以调整边框宽度和颜色,使其看起来像标签。 - Bryan Oakley
使用第一种选项...在对话框中按下“确定”按钮时,有没有一种方法可以结束应用程序?现在,当我这样做时,对话框不会关闭(也许我应该执行root.destroy(),但我不知道如何在按下OK后立即执行它)。 - madtyn

12
为了避免在创建根窗口时出现“闪烁”,请使用这个对已接受答案的轻微变化:

为了避免在创建根窗口时出现“闪烁”,请使用这个对已接受答案的轻微变化:

import Tkinter as tk
root = tk.Tk()
root.overrideredirect(1)
root.withdraw()
tkMessageBox.showinfo("Say Hello", "Hello World")

5

对于Python 3:

import tkinter, tkinter.messagebox

def messagebox(title, text):
    root = tkinter.Tk()
    root.withdraw()
    tkinter.messagebox.showinfo(title, text)
    root.destroy()

在安装了pywin32的情况下,具有本地Windows支持:

try:
    from win32ui import MessageBox
except ImportError:
    import tkinter, tkinter.messagebox
    def MessageBox(text, title):
        root = tkinter.Tk()
        root.withdraw()
        tkinter.messagebox.showinfo(title, text)
        root.destroy()

0

这适用于Python 3

from tkinter import *
from tkinter import messagebox

root = Tk()
root.withdraw()
messagebox.showinfo("Window Title", "Your Message")

0

逐个导入消息框。例如:

from tkinter import *
import tkinter.messagebox

或者

from tkinter import messagebox

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