Comment puis-je créer une boîte de message simple en Python?

119

Je recherche le même effet qu'en alert()JavaScript.

J'ai écrit cet après-midi un simple interpréteur basé sur le Web en utilisant Twisted.web. En gros, vous soumettez un bloc de code Python via un formulaire, et le client vient le saisir et l'exécute. Je veux pouvoir créer un simple message contextuel, sans avoir à réécrire tout un tas de code standard wxPython ou TkInter à chaque fois (puisque le code est soumis via un formulaire et disparaît ensuite).

J'ai essayé tkMessageBox:

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

mais cela ouvre une autre fenêtre en arrière-plan avec une icône tk. Je ne veux pas de ça. Je cherchais du code wxPython simple mais il fallait toujours configurer une classe et entrer une boucle d'application, etc. N'y a-t-il pas de moyen simple et sans accroc de créer une boîte de message en Python?

Carson Myers
la source

Réponses:

258

Vous pouvez utiliser un code d'importation et une ligne comme celui-ci:

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

Ou définissez une fonction (Mbox) comme ceci:

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)

Notez que les styles sont les suivants:

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

S'amuser!

Remarque: modifié pour utiliser à la MessageBoxWplace deMessageBoxA

user2140260
la source
2
Exactement ce que je cherchais. L'OP aussi de ce à quoi il ressemble. Doit être marqué comme la réponse!
CodeMonkey
3
Meh. Peut-être ai-je parlé trop tôt. Je ne reçois qu'un seul caractère pour le titre et le message. Bizarre ...
CodeMonkey
18
J'ai dû utiliser MessageBoxW au lieu de MessageBoxA.
CodeMonkey
9
@CodeMonkey en python 3, utilisez MessageBoxW au lieu de MessageBoxA
Oliver Ni
2
Remarque: Ma fenêtre contextuelle n'était pas en anglais et peut être corrigée en lisant la réponse de l'
Ari
50

Avez-vous regardé easygui ?

import easygui

easygui.msgbox("This is a message!", title="simple gui")
Ryan Ginstrom
la source
7
ce n'est pas tkinter, il n'est pas livré par défaut, étrange, qui est intéressé par l'introduction de fonctionnalités aussi simples pour apporter des dépendances inutiles?
Tebe
7
En fait gekannt, easygui est un wrapper autour de tkinter. Oui, c'est une dépendance supplémentaire, mais c'est un seul fichier python. Certains développeurs peuvent penser que la dépendance en vaut la peine pour implémenter une interface graphique très simple.
Ryan Ginstrom
22

Vous pouvez également positionner l'autre fenêtre avant de la retirer afin de positionner votre message

#!/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
la source
3
Existe-t-il une méthode, de sorte que nous n'ayons pas besoin de pousser le bouton ok dans la tkMessageBox et qu'il se traite automatiquement?
varsha_holla
@varsha_holla Ce n'est pas ainsi que fonctionne la boîte de message. Vous voudrez peut-être envisager de créer une fenêtre standard avec une minuterie.
Kelly Elton
19

Le code que vous avez présenté est bien! Il vous suffit de créer explicitement "l'autre fenêtre en arrière-plan" et de la masquer, avec ce code:

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

Juste avant votre boîte de message.

Jotaf
la source
4
J'ai dû ajouter "window.destroy ()" à la fin de ceci pour le faire sortir proprement.
kuzzooroo
11

Le module PyMsgBox fait exactement cela. Il a des fonctions de boîte de message qui suivent les conventions de dénomination de JavaScript: alert (), confirm (), prompt () et password () (qui est prompt () mais utilise * lorsque vous tapez). Ces appels de fonction bloquent jusqu'à ce que l'utilisateur clique sur un bouton OK / Annuler. C'est un module Python pur et multiplateforme sans dépendances.

Installer avec: pip install PyMsgBox

Exemple d'utilisation:

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

Documentation complète sur http://pymsgbox.readthedocs.org/en/latest/

Al Sweigart
la source
étrange. vous écrivez qu'il n'a pas de dépendances, mais quand j'essaie de l'utiliser, il s'imprimeAssertionError: Tkinter is required for pymsgbox
shitpoet
Je devrais changer cela: pymsgbox n'a pas de dépendances en dehors de la bibliothèque standard, dont tkinter fait partie. Quelle version de Python et quel système d'exploitation utilisez-vous?
Al Sweigart le
Désolé, je suis noob en Python, je pensais que toutes les bibliothèques python étaient installées via pip, mais en fait, une partie des bibliothèques sont installées dans l'autre sens - en utilisant le gestionnaire de paquets système. J'ai donc installé en python-tkutilisant mon gestionnaire de paquets. J'utilise Python 2.7 sur Debian.
shitpoet
offtopic: mais la boîte de message créée par PyMsgBox / Tk semble assez moche sur mon Debian
shitpoet
10

Sous Windows, vous pouvez utiliser des ctypes avec la bibliothèque 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")
TU
la source
9

Sur Mac, la bibliothèque standard python a un module appelé EasyDialogs. Il existe également une version Windows (basée sur ctypes) à l' adresse http://www.averdevelopment.com/python/EasyDialogs.html

Si cela compte pour vous: il utilise des dialogues natifs et ne dépend pas de Tkinter comme déjà mentionné easygui, mais il peut ne pas avoir autant de fonctionnalités.

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

Le dernier numéro (ici 1) peut être changé pour changer le style de la fenêtre (pas seulement les boutons!):

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

Par exemple,

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

donnera ceci :

entrez la description de l'image ici

Arkelis
la source
1

Utilisation

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

La fenêtre principale doit être créée au préalable. Ceci est pour Python 3. Ce n'est pas pour wxPython, mais pour tkinter.

HD1920
la source
Voir mon commentaire sur "import *" sur la réponse 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
la source
Aussi, s'il vous plaît, pour l'amour de tout le PEP8 et pythonique, sevrez-vous de "import *". C'est mauvais, hein?
Jürgen A. Erhard
1

Vous pouvez également positionner l'autre fenêtre avant de la retirer afin de positionner votre message

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

Remarque: Ceci est la réponse de Lewis Cowles juste Python 3ified, puisque tkinter a changé depuis python 2. Si vous voulez que votre code soit compatible avec les backwords, faites quelque chose comme ceci:

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

Pas le meilleur, voici ma boîte de message de base en utilisant uniquement 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
la source
Vous importez le formatage est complètement dingue. Êtes-vous un ancien programmeur COBOL ou FORTRAN, par hasard? ;-)
Jürgen A. Erhard
0

consultez mon module python: pip install quickgui (nécessite wxPython, mais ne nécessite aucune connaissance de wxPython) https://pypi.python.org/pypi/quickgui

Peut créer n'importe quel nombre d'entrées (ratio, case à cocher, case d'entrée), les organiser automatiquement sur une seule interface graphique.

Jerry T
la source
0

Une version récente de la boîte de message est le module prompt_box. Il a deux packages: alerte et message. Le message vous donne un meilleur contrôle sur la boîte, mais prend plus de temps à taper.

Exemple de code d'alerte:

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

Exemple de code de message:

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
la source
0

module ctype avec threading

J'utilisais la boîte de message tkinter mais cela plantait mon code. Je ne voulais pas savoir pourquoi j'ai donc utilisé le module ctypes à la place.

par exemple:

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

j'ai ce code d' Arkelis


J'ai aimé le fait qu'il ne plante pas le code, alors j'ai travaillé dessus et ajouté un filetage pour que le code soit exécuté.

exemple pour mon code

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)

pour les styles de boutons et les numéros d'icônes:

## 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
Ouvriers d'émeraude
la source
0

Vous pouvez utiliser pyautoguiou pymsgbox:

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

Utiliser pymsgboxéquivaut à utiliser pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Un gars
la source