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?
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
Avez-vous regardé easygui ?
import easygui
easygui.msgbox("This is a message!", title="simple gui")
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!")
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.
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.
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/
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")
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 :
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.
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
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
"""
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
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.