如何在Python中创建一个简单的消息框?


119

我正在寻找与alert()JavaScript 相同的效果。

我今天下午使用Twisted.web编写了一个基于Web的简单解释器。您基本上是通过表单提交Python代码块的,客户端来抓取并执行它。我希望能够做出一个简单的弹出消息,而不必每次都重写一堆样板的wxPython或TkInter代码(因为该代码是通过表单提交的,然后消失了)。

我尝试过tkMessageBox:

import tkMessageBox
tkMessageBox.showinfo(title="Greetings", message="Hello World!")

但这会在后台用tk图标打开另一个窗口。我不要这个 我一直在寻找一些简单的wxPython代码,但是它总是需要设置一个类并进入应用程序循环等。在Python中没有简单易行的方法来制作消息框吗?

Answers:


257

您可以使用导入和单行代码,如下所示:

import ctypes  # An included library with Python install.   
ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

或定义一个函数(Mbox),如下所示:

import ctypes  # An included library with Python install.
def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxW(0, text, title, style)
Mbox('Your title', 'Your text', 1)

注意样式如下:

##  Styles:
##  0 : OK
##  1 : OK | Cancel
##  2 : Abort | Retry | Ignore
##  3 : Yes | No | Cancel
##  4 : Yes | No
##  5 : Retry | No 
##  6 : Cancel | Try Again | Continue

玩得开心!

注意:已编辑以MessageBoxW代替MessageBoxA


2
正是我想要的。从外观上看,OP也是如此。应该标记为答案!
CodeMonkey

3
嗯 也许我讲得太早了。我的标题和消息都只有一个字符。很奇怪...
CodeMonkey

18
必须使用MessageBoxW代替MessageBoxA。
CodeMonkey

9
python 3中的@CodeMonkey,使用MessageBoxW代替MessageBoxA
Oliver Ni

2
注:我的弹出是不是英文的,并且可以通过读取用户修正布尔汗哈立德的答案
阿里

50

你看过easygui吗?

import easygui

easygui.msgbox("This is a message!", title="simple gui")

7
这不是tkinter,默认情况下未提供它,很奇怪,谁对引入这种简单功能带来不必要的依赖感兴趣?
特贝2012年

7
实际上gekannt,easygui是tkinter的包装。是的,这是一个额外的依赖项,但这是一个单独的python文件。一些开发人员可能认为依赖关系对于实现简单的GUI是值得的。
瑞安·金斯特罗姆

22

另外,您可以在撤消另一个窗口之前先放置它,以便放置消息

#!/usr/bin/env python

from Tkinter import *
import tkMessageBox

window = Tk()
window.wm_withdraw()

#message at x:200,y:200
window.geometry("1x1+200+200")#remember its .geometry("WidthxHeight(+or-)X(+or-)Y")
tkMessageBox.showerror(title="error",message="Error Message",parent=window)

#centre screen message
window.geometry("1x1+"+str(window.winfo_screenwidth()/2)+"+"+str(window.winfo_screenheight()/2))
tkMessageBox.showinfo(title="Greetings", message="Hello World!")

3
有没有什么方法,这样我们就不需要在tkMessageBox中点击确定按钮,它会自动处理?
varsha_holla 2014年

@varsha_holla这不是消息框的工作方式。您可能需要研究使用计时器创建标准窗口。
凯利·艾尔顿

19

您提供的代码很好!您只需要使用以下代码显式创建“背景中的其他窗口”并将其隐藏:

import Tkinter
window = Tkinter.Tk()
window.wm_withdraw()

就在您的消息框之前。


4
我必须在此末尾添加“ window.destroy()”,以使其干净退出。
kuzzooroo 2014年

11

PyMsgBox模块正是这样做的。它具有遵循JavaScript命名约定的消息框功能:alert(),confirm(),prompt()和password()(后者是hint(),但键入时使用*)。这些函数调用将阻塞,直到用户单击“确定” /“取消”按钮为止。这是一个无依赖的跨平台纯Python模块。

安装方式: pip install PyMsgBox

用法示例:

import pymsgbox
pymsgbox.alert('This is an alert!', 'Title')
response = pymsgbox.prompt('What is your name?')

完整文档位于http://pymsgbox.readthedocs.org/en/latest/


奇怪。您写道它没有依赖性,但是当我尝试使用它时,它会打印AssertionError: Tkinter is required for pymsgbox
shitpoet19年

我应该更改一下:pymsgbox在标准库之外没有任何依赖关系,tkinter是标准库的一部分。您使用什么版本的Python和什么操作系统?
Al Sweigart'1

抱歉,我对Python不熟悉,我认为所有python库都是通过安装的pip,但实际上部分库是通过其他方式安装的-使用系统软件包管理器。因此,我python-tk使用软件包管理器进行安装。我在Debian上使用Python 2.7。
shitpoet19年

offtopic:但是在我的Debian上,由PyMsgBox / Tk创建的消息框看起来非常难看
shitpoet

10

在Windows中,可以将ctypes与user32库一起使用:

from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT
prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT)
paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0)
MessageBox = prototype(("MessageBoxA", windll.user32), paramflags)

MessageBox()
MessageBox(text="Spam, spam, spam")
MessageBox(flags=2, text="foo bar")


7
import ctypes
ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

可以更改最后一个数字(此处为1)以更改窗口样式(不仅是按钮!):

## Button styles:
# 0 : OK
# 1 : OK | Cancel
# 2 : Abort | Retry | Ignore
# 3 : Yes | No | Cancel
# 4 : Yes | No
# 5 : Retry | No 
# 6 : Cancel | Try Again | Continue

## To also change icon, add these values to previous number
# 16 Stop-sign icon
# 32 Question-mark icon
# 48 Exclamation-point icon
# 64 Information-sign icon consisting of an 'i' in a circle

例如,

ctypes.windll.user32.MessageBoxW(0, "That's an error", "Warning!", 16)

会给这个

在此处输入图片说明


1

from tkinter.messagebox import *
Message([master], title="[title]", message="[message]")

必须先创建主窗口。这是针对Python 3的。这不是wxPython,而是tkinter的。


请参阅我在Robert的回答中对“ import *”的评论。
于尔根A.艾哈德

1
import sys
from tkinter import *
def mhello():
    pass
    return

mGui = Tk()
ment = StringVar()

mGui.geometry('450x450+500+300')
mGui.title('My youtube Tkinter')

mlabel = Label(mGui,text ='my label').pack()

mbutton = Button(mGui,text ='ok',command = mhello,fg = 'red',bg='blue').pack()

mEntry = entry().pack 

另外,请大家尽情享受PEP8和pythonic,让自己断言“ import *”。不好,对吗?
于尔根A.艾哈德

1

另外,您可以在撤消另一个窗口之前先放置它,以便放置消息

from tkinter import *
import tkinter.messagebox

window = Tk()
window.wm_withdraw()

# message at x:200,y:200
window.geometry("1x1+200+200")  # remember its.geometry("WidthxHeight(+or-)X(+or-)Y")
tkinter.messagebox.showerror(title="error", message="Error Message", parent=window)

# center screen message
window.geometry(f"1x1+{round(window.winfo_screenwidth() / 2)}+{round(window.winfo_screenheight() / 2)}")
tkinter.messagebox.showinfo(title="Greetings", message="Hello World!")

请注意:这是Lewis Cowles的答案,只是Python 3ified,因为tkinter自python 2起就发生了变化。

try:
    import tkinter
    import tkinter.messagebox
except ModuleNotFoundError:
    import Tkinter as tkinter
    import tkMessageBox as tkinter.messagebox

0

并不是最好的,这是我仅使用tkinter的基本消息框。

#Python 3.4
from    tkinter import  messagebox  as  msg;
import  tkinter as      tk;

def MsgBox(title, text, style):
    box = [
        msg.showinfo,       msg.showwarning,    msg.showerror,
        msg.askquestion,    msg.askyesno,       msg.askokcancel,        msg.askretrycancel,
];

tk.Tk().withdraw(); #Hide Main Window.

if style in range(7):
    return box[style](title, text);

if __name__ == '__main__':

Return = MsgBox(#Use Like This.
    'Basic Error Exemple',

    ''.join( [
        'The Basic Error Exemple a problem with test',                      '\n',
        'and is unable to continue. The application must close.',           '\n\n',
        'Error code Test',                                                  '\n',
        'Would you like visit http://wwww.basic-error-exemple.com/ for',    '\n',
        'help?',
    ] ),

    2,
);

print( Return );

"""
Style   |   Type        |   Button      |   Return
------------------------------------------------------
0           Info            Ok              'ok'
1           Warning         Ok              'ok'
2           Error           Ok              'ok'
3           Question        Yes/No          'yes'/'no'
4           YesNo           Yes/No          True/False
5           OkCancel        Ok/Cancel       True/False
6           RetryCancal     Retry/Cancel    True/False
"""

您导入的格式完全是傻瓜。您是老COBOL或FORTRAN程序员吗?;-)
于尔根A.艾哈德

0

签出我的python模块:pip install quickgui(需要wxPython,但不需要wxPython知识) https://pypi.python.org/pypi/quickgui

可以创建任意数量的输入((比率,复选框,输入框),自动将它们排列在一个GUI上。


0

最新的消息框版本是hint_box模块。它有两个软件包:警报和消息。Message使您可以更好地控制该框,但键入时间会更长。

警报代码示例:

import prompt_box

prompt_box.alert('Hello') #This will output a dialog box with title Neutrino and the 
#text you inputted. The buttons will be Yes, No and Cancel

消息代码示例:

import prompt_box

prompt_box.message('Hello', 'Neutrino', 'You pressed yes', 'You pressed no', 'You 
pressed cancel') #The first two are text and title, and the other three are what is 
#printed when you press a certain button

0

带螺纹的ctype模块

我正在使用tkinter消息框,但它会使我的代码崩溃。我不想找出原因,所以我改用ctypes模块。

例如:

import ctypes
ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

我从Arkelis那里得到了那个代码


我喜欢它不会使代码崩溃,因此我对其进行了工作并添加了线程,以便随后的代码可以运行。

我的代码示例

import ctypes
import threading


def MessageboxThread(buttonstyle, title, text, icon):
    threading.Thread(
        target=lambda: ctypes.windll.user32.MessageBoxW(buttonstyle, text, title, icon)
    ).start()

messagebox(0, "Your title", "Your text", 1)

对于按钮样式和图标编号:

## Button styles:
# 0 : OK
# 1 : OK | Cancel
# 2 : Abort | Retry | Ignore
# 3 : Yes | No | Cancel
# 4 : Yes | No
# 5 : Retry | No
# 6 : Cancel | Try Again | Continue

## To also change icon, add these values to previous number
# 16 Stop-sign icon
# 32 Question-mark icon
# 48 Exclamation-point icon
# 64 Information-sign icon consisting of an 'i' in a circle

0

您可以使用pyautoguipymsgbox

import pyautogui
pyautogui.alert("This is a message box",title="Hello World")

使用pymsgbox与使用相同pyautogui

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.