Come posso creare una semplice finestra di messaggio in Python?


119

Sto cercando lo stesso effetto alert()di JavaScript.

Ho scritto un semplice interprete basato sul web questo pomeriggio usando Twisted.web. Fondamentalmente si invia un blocco di codice Python tramite un modulo, e il client arriva, lo prende e lo esegue. Voglio essere in grado di creare un semplice messaggio popup, senza dover riscrivere ogni volta un sacco di codice boilerplate wxPython o TkInter (poiché il codice viene inviato tramite un modulo e poi scompare).

Ho provato tkMessageBox:

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

ma questo apre un'altra finestra sullo sfondo con un'icona tk. Non lo voglio. Stavo cercando un semplice codice wxPython, ma richiedeva sempre la creazione di una classe e l'inserimento di un ciclo di app, ecc. Non esiste un modo semplice e senza problemi per creare una finestra di messaggio in Python?

Risposte:


258

Puoi usare un codice di importazione e una riga come questo:

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

Oppure definisci una funzione (Mbox) in questo modo:

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)

Nota gli stili sono i seguenti:

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

Divertiti!

Nota: modificato per utilizzare al MessageBoxWposto diMessageBoxA


2
Esattamente quello che stavo cercando. Anche l'OP da quello che sembra. Dovrebbe essere contrassegnato come risposta!
CodeMonkey

3
Meh. Forse ho parlato troppo presto. Ricevo solo un singolo carattere sia per il titolo che per il messaggio. Strano ...
CodeMonkey

18
Ho dovuto usare MessageBoxW invece di MessageBoxA.
CodeMonkey

9
@CodeMonkey in python 3, usa MessageBoxW invece di MessageBoxA
Oliver Ni

2
Nota: il mio popup non era in inglese e può essere corretto leggendo la risposta
Ari

50

Hai guardato easygui ?

import easygui

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

7
questo non è tkinter, non è fornito di default, strano, chi è interessato a introdurre funzionalità così semplici da portare dipendenze non necessarie?
Tebe

7
In realtà gekannt, easygui è un involucro attorno a tkinter. Sì, è una dipendenza extra, ma è un singolo file Python. Alcuni sviluppatori potrebbero pensare che la dipendenza valga la pena per implementare una GUI semplicissima.
Ryan Ginstrom

22

Inoltre puoi posizionare l'altra finestra prima di ritirarla in modo da posizionare il tuo messaggio

#!/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
Esiste un metodo, in modo che non abbiamo bisogno di prossimizzare il pulsante ok nel tkMessageBox e si elabora automaticamente?
varsha_holla

@varsha_holla Non è così che funziona la finestra di messaggio. Potresti voler creare una finestra standard con un timer.
Kelly Elton

19

Il codice che hai presentato va bene! Devi solo creare esplicitamente "l'altra finestra in background" e nasconderla, con questo codice:

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

Subito prima della tua casella dei messaggi.


4
Ho dovuto aggiungere "window.destroy ()" alla fine di questo per farlo uscire in modo pulito.
kuzzooroo

11

Il modulo PyMsgBox fa esattamente questo. Ha funzioni di casella di messaggio che seguono le convenzioni di denominazione di JavaScript: alert (), confirm (), prompt () e password () (che è prompt () ma usa * quando digiti). Queste chiamate di funzione si bloccano finché l'utente non fa clic su un pulsante OK / Annulla. È un modulo Python multipiattaforma, puro senza dipendenze.

Installa con: pip install PyMsgBox

Utilizzo del campione:

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

Documentazione completa su http://pymsgbox.readthedocs.org/en/latest/


strano. scrivi che non ha dipendenze, ma quando provo a usarlo stampaAssertionError: Tkinter is required for pymsgbox
shitpoet

Dovrei cambiarlo: pymsgbox non ha dipendenze al di fuori della libreria standard, di cui tkinter fa parte. Quale versione di Python e quale sistema operativo utilizzi?
Al Sweigart

Mi dispiace, non sono un principiante in Python, pensavo che tutte le librerie di Python fossero installate tramite pip, ma in realtà parte delle librerie vengono installate nell'altro modo - utilizzando il gestore dei pacchetti di sistema. Quindi ho installato python-tkusando il mio gestore di pacchetti. Sto usando Python 2.7 su Debian.
shitpoet

offtopic: ma la finestra di messaggio creata da PyMsgBox / Tk sembra piuttosto brutta sulla mia Debian
shitpoet

10

In Windows, puoi usare ctypes con la libreria 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

Su Mac, la libreria standard di python ha un modulo chiamato EasyDialogs. C'è anche una versione per Windows (basata su ctypes) su http://www.averdevelopment.com/python/EasyDialogs.html

Se è importante per te: usa dialoghi nativi e non dipende da Tkinter come il già citato easygui, ma potrebbe non avere tante funzionalità.


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

L'ultimo numero (qui 1) può essere modificato per cambiare lo stile della finestra (non solo i pulsanti!):

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

Per esempio,

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

darà questo :

inserisci qui la descrizione dell'immagine


1

Uso

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

La finestra principale deve essere creata prima. Questo è per Python 3. Questo non è per wxPython, ma per tkinter.


Vedi il mio commento su "import *" sulla risposta di 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 

Inoltre, per favore, per l'amore di tutto il PEP8 e il pitonico, allontanati da "import *". Va male, ok?
Jürgen A. Erhard

1

Inoltre puoi posizionare l'altra finestra prima di ritirarla in modo da posizionare il tuo messaggio

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

Nota: questa è la risposta di Lewis Cowles solo Python 3ified, dal momento che tkinter è cambiato da Python 2. Se vuoi che il tuo codice sia compatibile con le backword, fai qualcosa del genere:

try:
    import tkinter
    import tkinter.messagebox
except ModuleNotFoundError:
    import Tkinter as tkinter
    import tkMessageBox as tkinter.messagebox

0

Non il migliore, ecco la mia casella di messaggio di base che utilizza 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
"""

La formattazione dell'importazione è completamente folle. Sei un vecchio programmatore COBOL o FORTRAN, per caso? ;-)
Jürgen A. Erhard

0

controlla il mio modulo python: pip install quickgui (richiede wxPython, ma non richiede alcuna conoscenza di wxPython) https://pypi.python.org/pypi/quickgui

Può creare qualsiasi numero di input, (rapporto, casella di controllo, casella di input), disporli automaticamente su una singola interfaccia grafica.


0

Una versione recente della finestra di messaggio è il modulo prompt_box. Ha due pacchetti: avviso e messaggio. Il messaggio ti dà un maggiore controllo sulla casella, ma richiede più tempo per digitare.

Codice di avviso di esempio:

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

Codice messaggio di esempio:

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

modulo ctype con threading

stavo usando la casella dei messaggi di tkinter ma il mio codice si sarebbe bloccato. Non volevo scoprire perché così ho usato invece il modulo ctypes .

per esempio:

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

ho ricevuto quel codice da Arkelis


Mi piaceva che non si bloccasse il codice, quindi ci ho lavorato e ho aggiunto un thread in modo che il codice dopo sarebbe stato eseguito.

esempio per il mio codice

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)

per gli stili dei pulsanti e i numeri delle icone:

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

Puoi usare pyautoguio pymsgbox:

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

Usare pymsgboxè lo stesso che usare pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.