¿Cómo puedo crear un cuadro de mensaje simple en Python?

119

Estoy buscando el mismo efecto que alert()en JavaScript.

Esta tarde escribí un intérprete simple basado en web usando Twisted.web. Básicamente, envías un bloque de código Python a través de un formulario, y el cliente viene, lo toma y lo ejecuta. Quiero poder hacer un mensaje emergente simple, sin tener que volver a escribir un montón de código wxPython o TkInter repetitivo cada vez (ya que el código se envía a través de un formulario y luego desaparece).

Probé tkMessageBox:

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

pero esto abre otra ventana en segundo plano con un icono tk. No quiero esto. Estaba buscando un código wxPython simple, pero siempre requería configurar una clase e ingresar un bucle de aplicación, etc. ¿No existe una forma simple y sin problemas de crear un cuadro de mensaje en Python?

Carson Myers
fuente

Respuestas:

258

Puede usar un código de importación y de una sola línea como este:

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

O defina una función (Mbox) así:

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)

Tenga en cuenta que los estilos son los siguientes:

##  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

¡Que te diviertas!

Nota: editado para usar en MessageBoxWlugar deMessageBoxA

usuario2140260
fuente
2
Exactamente lo que estaba buscando. El OP también por lo que parece. ¡Debería marcarse como la respuesta!
CodeMonkey
3
Meh. Quizás hablé demasiado pronto. Solo obtengo un carácter tanto para el título como para el mensaje. Extraño ...
CodeMonkey
18
Tuve que usar MessageBoxW en lugar de MessageBoxA.
CodeMonkey
9
@CodeMonkey en python 3, use MessageBoxW en lugar de MessageBoxA
Oliver Ni
2
Nota: Mi ventana emergente no estaba en inglés y se puede corregir leyendo la respuesta del
Ari
50

¿Has mirado a easygui ?

import easygui

easygui.msgbox("This is a message!", title="simple gui")
Ryan Ginstrom
fuente
7
esto no es tkinter, no se envía de forma predeterminada, extraño, ¿quién está interesado en introducir una funcionalidad tan simple para traer dependencias innecesarias?
Tebe
7
En realidad gekannt, easygui es un envoltorio de tkinter. Sí, es una dependencia adicional, pero es un solo archivo de Python. Algunos desarrolladores pueden pensar que la dependencia vale la pena para implementar una GUI muy simple.
Ryan Ginstrom
22

También puedes colocar la otra ventana antes de retirarla para que coloques tu mensaje

#!/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!")
Lewis Cowles
fuente
3
¿Existe algún método para que no necesitemos presionar el botón ok en tkMessageBox y se procese automáticamente?
varsha_holla
@varsha_holla No es así como funciona el cuadro de mensajes. Es posible que desee considerar la creación de una ventana estándar con un temporizador.
Kelly Elton
19

¡El código que presentó está bien! Solo necesita crear explícitamente la "otra ventana en segundo plano" y ocultarla, con este código:

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

Justo antes de su buzón de mensajes.

Jotaf
fuente
4
Tuve que agregar "window.destroy ()" al final de esto para que saliera limpiamente.
kuzzooroo
11

El módulo PyMsgBox hace exactamente esto. Tiene funciones de cuadro de mensaje que siguen las convenciones de nomenclatura de JavaScript: alert (), confirm (), prompt () y password () (que es prompt () pero usa * cuando escribe). Estas llamadas de función se bloquean hasta que el usuario hace clic en un botón Aceptar / Cancelar. Es un módulo de Python puro multiplataforma sin dependencias.

Instalar con: pip install PyMsgBox

Uso de muestra:

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

Documentación completa en http://pymsgbox.readthedocs.org/en/latest/

Al Sweigart
fuente
extraño. escribe que no tiene dependencias, pero cuando trato de usarlo imprimeAssertionError: Tkinter is required for pymsgbox
shitpoet
Debo cambiar eso: pymsgbox no tiene dependencias fuera de la biblioteca estándar, de la que tkinter es parte. ¿Qué versión de Python y en qué sistema operativo estás?
Al Sweigart
Lo siento, soy un novato en Python, pensé que todas las librerías de Python se instalan pip, pero de hecho, parte de las librerías se instalan al revés: usando el administrador de paquetes del sistema. Entonces lo instalé python-tkusando mi administrador de paquetes. Estoy usando Python 2.7 en Debian.
shitpoet
offtopic: pero el cuadro de mensaje creado por PyMsgBox / Tk se ve bastante feo en mi Debian
shitpoet
10

En Windows, puede usar ctypes con la biblioteca 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")

fuente
9

En Mac, la biblioteca estándar de Python tiene un módulo llamado EasyDialogs. También hay una versión de Windows (basada en ctypes) en http://www.averdevelopment.com/python/EasyDialogs.html

Si te importa: usa diálogos nativos y no depende de Tkinter como el ya mencionado easygui, pero puede que no tenga tantas funciones.

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

El último número (aquí 1) se puede cambiar para cambiar el estilo de la ventana (¡no solo los botones!):

## 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

Por ejemplo,

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

dará esto :

ingrese la descripción de la imagen aquí

Arkelis
fuente
1

Utilizar

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

La ventana maestra debe crearse antes. Esto es para Python 3. Esto no es para wxPython, sino para tkinter.

HD1920
fuente
Vea mi comentario sobre "importar *" en la respuesta de Robert.
Jürgen A. Erhard
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 
Robert
fuente
Además, por favor, por el amor de todos, es PEP8 y pythonic, deje de "importar *". Es malo, ¿de acuerdo?
Jürgen A. Erhard
1

También puedes colocar la otra ventana antes de retirarla para que coloques tu mensaje

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

Tenga en cuenta: Esta es la respuesta de Lewis Cowles solo con Python 3ified, ya que tkinter ha cambiado desde Python 2. Si desea que su código sea compatible con backwords, haga algo como esto:

try:
    import tkinter
    import tkinter.messagebox
except ModuleNotFoundError:
    import Tkinter as tkinter
    import tkMessageBox as tkinter.messagebox
Hexiro
fuente
0

No es el mejor, aquí está mi cuadro de mensaje básico usando solo 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
"""
Creuil
fuente
Importar formato es completamente loco. ¿Es usted un antiguo programador de COBOL o FORTRAN, por casualidad? ;-)
Jürgen A. Erhard
0

echa un vistazo a mi módulo de Python: pip install quickgui (Requiere wxPython, pero no requiere conocimiento de wxPython) https://pypi.python.org/pypi/quickgui

Puede crear cualquier número de entradas (proporción, casilla de verificación, casilla de entrada), organizarlas automáticamente en una única interfaz gráfica de usuario.

Jerry T
fuente
0

Una versión reciente del cuadro de mensajes es el módulo prompt_box. Tiene dos paquetes: alerta y mensaje. El mensaje le brinda un mayor control sobre el cuadro, pero toma más tiempo escribirlo.

Ejemplo de código de alerta:

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

Ejemplo de código de mensaje:

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
Samuel Crawford
fuente
0

módulo ctype con roscado

Estaba usando el cuadro de mensajes tkinter pero bloqueaba mi código. No quería saber por qué, así que usé el módulo ctypes en su lugar.

por ejemplo:

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

obtuve ese código de Arkelis


Me gustó que no bloqueara el código, así que trabajé en él y agregué un subproceso para que se ejecutara el código posterior.

ejemplo para mi código

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)

para estilos de botones y números de iconos:

## 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
Trabajadores esmeralda
fuente
0

Puede usar pyautoguio pymsgbox:

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

Usar pymsgboxes lo mismo que usar pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Algún chico
fuente