Как я могу создать простое окно сообщения в Python?


119

Ищу тот же эффект, что и alert()в JavaScript.

Сегодня днем ​​я написал простой веб-интерпретатор, используя Twisted.web. Вы в основном отправляете блок кода Python через форму, а клиент приходит, берет его и выполняет. Я хочу иметь возможность создавать простое всплывающее сообщение без необходимости каждый раз переписывать целую кучу шаблонного кода wxPython или TkInter (поскольку код отправляется через форму, а затем исчезает).

Я пробовал tkMessageBox:

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

но это открывает другое окно в фоновом режиме со значком tk. Я не хочу этого. Я искал простой код wxPython, но он всегда требовал настройки класса и входа в цикл приложения и т. Д. Нет ли простого, удобного способа создать окно сообщения в Python?

Ответы:


258

Вы можете использовать импорт и однострочный код следующим образом:

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
@CodeMonkey в python 3, используйте MessageBoxW вместо MessageBoxA
— Оливер Ни

2
Примечание. Мое всплывающее окно было не на английском языке, и его можно исправить, прочитав ответ
— Ари,

50

Вы смотрели easygui ?

import easygui

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

7
это не tkinter, он не поставляется по умолчанию, странно, кто заинтересован во внедрении такой простой функциональности, чтобы вывести ненужные зависимости?
— Тебе,

7
На самом деле gekannt, easygui - это оболочка для tkinter. Да, это дополнительная зависимость, но это единственный файл python. Некоторые разработчики могут подумать, что зависимость стоит того, чтобы реализовать чрезвычайно простой графический интерфейс.
— Райан Гинстром,

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

@varsha_holla Окно сообщений работает не так. Возможно, вы захотите создать стандартное окно с таймером.
— Келли Элтон

19

Код, который вы представили, в порядке! Вам просто нужно явно создать «другое окно в фоновом режиме» и скрыть его с помощью этого кода:

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

Прямо перед вашим почтовым ящиком.


4
Мне пришлось добавить «window.destroy ()» в конец этого, чтобы заставить его выйти чисто.
— kuzzooroo

11

Модуль PyMsgBox делает именно это. В нем есть функции окна сообщения, которые соответствуют соглашениям об именах JavaScript: alert (), confirm (), prompt () и password () (который является prompt (), но использует * при вводе). Эти вызовы функций блокируются до тех пор, пока пользователь не нажмет кнопку OK / Отмена. Это кроссплатформенный модуль на чистом 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
— shitpoet

Я должен это изменить: pymsgbox не имеет зависимостей вне стандартной библиотеки, частью которой является tkinter. Какая версия Python и какая у вас ОС?
— Al Sweigart

Извините, я новичок в Python, я думал, что все библиотеки python устанавливаются через него pip, но на самом деле часть библиотек устанавливается другим способом - с помощью системного диспетчера пакетов. Итак, я установил python-tkс помощью своего диспетчера пакетов. Я использую Python 2.7 в Debian.
— shitpoet

оффтоп: но окно сообщения, созданное PyMsgBox / Tk, выглядит довольно некрасиво на моем Debian
— 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")

9

На Mac в стандартной библиотеке Python есть модуль с именем EasyDialogs. Существует также версия Windows (на основе ctypes) по адресу http://www.averdevelopment.com/python/EasyDialogs.html.

Если это важно для вас: он использует собственные диалоги и не зависит от Tkinter, как уже упоминалось easygui, но у него может быть не так много функций.


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.


См. Мой комментарий о «импорте *» в ответе Роберта.
— Юрген А. Эрхард

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, откажитесь от "импорта *". Это плохо, понятно?
— Юрген А. Эрхард

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!")

Обратите внимание: это ответ Льюиса Коулза только на 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? ;-)
— Юрген А. Эрхард

0

проверьте мой модуль python: pip install quickgui (требуется wxPython, но не требует знания wxPython) https://pypi.python.org/pypi/quickgui

Может создавать любое количество входов (соотношение, флажок, поле ввода), автоматически размещать их на одном графическом интерфейсе.


0

Последняя версия окна сообщений - это модуль prompt_box. Он имеет два пакета: предупреждение и сообщение. Сообщение дает вам больший контроль над полем, но требует больше времени для ввода.

Пример кода предупреждения:

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)

я получил этот код от Аркелиса


Мне понравилось, что это не привело к сбою кода, поэтому я поработал над этим и добавил потоки, чтобы код после него запускался.

пример для моего кода

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

Вы можете использовать pyautoguiили pymsgbox:

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")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.