Как я могу создать простое окно сообщения в 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.