Wie kann ich in Python ein einfaches Meldungsfeld erstellen?


119

Ich suche den gleichen Effekt wie alert()in JavaScript.

Ich habe heute Nachmittag einen einfachen webbasierten Interpreter mit Twisted.web geschrieben. Sie senden im Grunde einen Block Python-Code über ein Formular, und der Client kommt und greift danach und führt ihn aus. Ich möchte in der Lage sein, eine einfache Popup-Nachricht zu erstellen, ohne jedes Mal eine ganze Reihe von wxPython- oder TkInter-Code neu schreiben zu müssen (da der Code über ein Formular gesendet wird und dann verschwindet).

Ich habe versucht, tkMessageBox:

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

Dies öffnet jedoch ein weiteres Fenster im Hintergrund mit einem tk-Symbol. Ich will das nicht Ich habe nach einem einfachen wxPython-Code gesucht, aber es war immer erforderlich, eine Klasse einzurichten und eine App-Schleife einzugeben usw. Gibt es keine einfache, abfangfreie Möglichkeit, ein Nachrichtenfeld in Python zu erstellen?

Antworten:


257

Sie können einen Import- und einen einzeiligen Code wie folgt verwenden:

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

Oder definieren Sie eine Funktion (Mbox) wie folgt:

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)

Beachten Sie, dass die Stile wie folgt sind:

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

Habe Spaß!

Hinweis: bearbeitet, um MessageBoxWanstelle von zu verwendenMessageBoxA


2
Genau das, wonach ich gesucht habe. Das OP auch von dem, wie es sich anhört. Sollte als Antwort markiert werden!
CodeMonkey

3
Meh. Vielleicht habe ich zu früh gesprochen. Ich bekomme nur ein einziges Zeichen für Titel und Nachricht. Seltsam ...
CodeMonkey

18
Musste MessageBoxW anstelle von MessageBoxA verwenden.
CodeMonkey

9
@ CodeMonkey in Python 3, verwenden Sie MessageBoxW anstelle von MessageBoxA
Oliver Ni

2
Hinweis: Mein Popup war nicht in Englisch und kann durch Lesen der Antwort
Ari

50

Hast du dir easygui angesehen ?

import easygui

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

7
Dies ist kein tkinter, es wird nicht standardmäßig ausgeliefert, seltsam, wer ist daran interessiert, solch einfache Funktionen einzuführen, um unnötige Abhängigkeiten zu schaffen?
Tebe

7
Eigentlich gekannt, ist easygui ein Wrapper um tkinter. Ja, es ist eine zusätzliche Abhängigkeit, aber es ist eine einzelne Python-Datei. Einige Entwickler denken möglicherweise, dass sich die Abhängigkeit für die Implementierung einer absolut einfachen GUI lohnt.
Ryan Ginstrom

22

Sie können auch das andere Fenster positionieren, bevor Sie es zurückziehen, damit Sie Ihre Nachricht positionieren

#!/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
Gibt es eine Methode, so dass wir nicht die Pross braucht ok - Taste in der tkMessageBox und verarbeitet automatisch?
varsha_holla

@varsha_holla So funktioniert die Message Box nicht. Vielleicht möchten Sie ein Standardfenster mit einem Timer erstellen.
Kelly Elton

19

Der Code, den Sie präsentiert haben, ist in Ordnung! Sie müssen nur das "andere Fenster im Hintergrund" explizit erstellen und mit diesem Code ausblenden:

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

Direkt vor Ihrer Messagebox.


4
Ich musste am Ende "window.destroy ()" hinzufügen, damit es sauber beendet wurde.
Kuzzooroo

11

Das PyMsgBox-Modul macht genau das. Es verfügt über Meldungsfeldfunktionen, die den Namenskonventionen von JavaScript entsprechen: alert (), verify (), prompt () und password () (dies ist prompt (), verwendet jedoch *, wenn Sie eingeben). Diese Funktionsaufrufe werden blockiert, bis der Benutzer auf die Schaltfläche OK / Abbrechen klickt. Es ist ein plattformübergreifendes, reines Python-Modul ohne Abhängigkeiten.

Installieren mit: pip install PyMsgBox

Beispielnutzung:

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

Vollständige Dokumentation unter http://pymsgbox.readthedocs.org/en/latest/


seltsam. Sie schreiben, dass es keine Abhängigkeiten hat, aber wenn ich versuche, es zu verwenden, druckt esAssertionError: Tkinter is required for pymsgbox
shitpoet

Ich sollte das ändern: pymsgbox hat keine Abhängigkeiten außerhalb der Standardbibliothek, zu der tkinter gehört. Auf welcher Python-Version und unter welchem ​​Betriebssystem arbeiten Sie?
Al Sweigart

Entschuldigung, ich bin kein Anfänger in Python. Ich dachte, dass alle Python-Bibliotheken über installiert werden pip, aber tatsächlich wird ein Teil der Bibliotheken auf die andere Weise installiert - mithilfe des Systempaket-Managers. Also habe ich python-tkmit meinem Paketmanager installiert . Ich verwende Python 2.7 unter Debian.
Shitpoet

offtopic: aber das von PyMsgBox / Tk erstellte Nachrichtenfeld sieht auf meinem Debian
shitpoet am

10

In Windows können Sie ctypes mit der user32-Bibliothek verwenden :

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

Unter Mac verfügt die Python-Standardbibliothek über ein Modul namens EasyDialogs. Es gibt auch eine (ctypes-basierte) Windows-Version unter http://www.averdevelopment.com/python/EasyDialogs.html

Wenn es Ihnen wichtig ist: Es verwendet native Dialoge und hängt nicht wie bereits erwähnt von Tkinter ab easygui, verfügt jedoch möglicherweise nicht über so viele Funktionen.


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

Die letzte Nummer (hier 1) kann geändert werden, um den Fensterstil zu ändern (nicht nur Schaltflächen!):

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

Beispielsweise,

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

geben diese :

Geben Sie hier die Bildbeschreibung ein


1

Verwenden

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

Das Hauptfenster muss vorher erstellt werden. Dies ist für Python 3. Dies ist nicht für wxPython, sondern für tkinter.


Siehe meinen Kommentar zu "import *" zu Roberts Antwort.
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 

Bitte entwöhnen Sie sich aus Liebe zu PEP8 und Python von "import *". Es ist schlecht, m'kay?
Jürgen A. Erhard

1

Sie können auch das andere Fenster positionieren, bevor Sie es zurückziehen, damit Sie Ihre Nachricht positionieren

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

Bitte beachten Sie: Dies ist Lewis Cowles 'Antwort nur Python 3ified, da sich tkinter seit Python 2 geändert hat. Wenn Sie möchten, dass Ihr Code mit Backwords kompatibel ist, gehen Sie wie folgt vor:

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

0

Nicht das Beste, hier ist meine grundlegende Nachrichtenbox, in der nur tkinter verwendet wird.

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

Sie importieren Formatierung ist völlig verrückt. Sind Sie zufällig ein alter COBOL- oder FORTRAN-Programmierer? ;-)
Jürgen A. Erhard

0

Schauen Sie sich mein Python-Modul an: pip install quickgui (Erfordert wxPython, erfordert jedoch keine Kenntnisse von wxPython) https://pypi.python.org/pypi/quickgui

Kann eine beliebige Anzahl von Eingaben (Verhältnis, Kontrollkästchen, Eingabefeld) erstellen und diese automatisch auf einer einzelnen Benutzeroberfläche anordnen.


0

Eine aktuelle Version des Meldungsfelds ist das Modul prompt_box. Es hat zwei Pakete: Alarm und Nachricht. Mit der Nachricht haben Sie eine bessere Kontrolle über die Box, die Eingabe dauert jedoch länger.

Beispiel Warncode:

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

Beispiel für einen Nachrichtencode:

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

ctype-Modul mit Threading

Ich habe die tkinter-Nachrichtenbox verwendet, aber sie würde meinen Code zum Absturz bringen. Ich wollte nicht herausfinden, warum, also habe ich stattdessen das Modul ctypes verwendet.

beispielsweise:

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

Ich habe diesen Code von Arkelis bekommen


Ich mochte es, dass es den Code nicht zum Absturz brachte, also arbeitete ich daran und fügte ein Threading hinzu, damit der Code danach ausgeführt wurde.

Beispiel für meinen 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)

für Schaltflächenstile und Symbolnummern:

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

Sie können verwenden pyautoguioder pymsgbox:

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

Verwenden pymsgboxist dasselbe wie Verwenden von pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.