web-dev-qa-db-fra.com

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

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

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

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 ça. Je cherchais du code wxPython simple, mais il fallait toujours configurer une classe, entrer une boucle d'application, etc. N'existe-t-il pas de moyen simple et sans accroc de créer une boîte de message en Python?

95
Carson Myers

Vous pouvez utiliser un code d'importation et de ligne unique comme ceci:

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 MessageBoxW à la place de MessageBoxA

209
user2140260

Avez-vous regardé easygui ?

import easygui

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

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!")
21
Lewis Cowles

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

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

Juste avant votre boîte de message.

19
Jotaf

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

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

9
Steven

Le module PyMsgBox fait exactement cela. Il a des fonctions de boîte de message qui suivent les conventions de nommage de JavaScript: alert (), confirm (), Prompt () et password () (qui est Prompt () mais utilise * lorsque vous tapez). Ces appels de fonction sont bloqués jusqu'à ce que l'utilisateur clique sur un bouton OK/Annuler. C'est un module purement Python multiplate-forme, sans dépendance.

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/

9
Al Sweigart

Sous Windows, vous pouvez utiliser 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")
9
YOU
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 :

enter image description here

5
Arkelis

Utilisation

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

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

1
HD1920
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 
1
Robert

Pas le meilleur, voici ma boîte de message de base 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 __== '__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
"""
0
Creuil

Une version récente de la boîte de message est le module Prompt_box. Il a deux paquets: alerte et message. Message vous donne un plus grand 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
0
Samuel Crawford

découvrez mon module python: pip install quickgui (requiert wxPython, mais aucune connaissance de wxPython) https://pypi.python.org/pypi/quickgui

Peut créer un nombre quelconque d'entrées (ratio, case à cocher, zone de saisie), les organiser automatiquement sur une seule interface graphique.

0
Jerry T