Jak mogę utworzyć proste okno komunikatu w Pythonie?


119

Szukam tego samego efektu co alert()w JavaScript.

Dziś po południu napisałem prostego tłumacza internetowego, używając Twisted.web. Zasadniczo przesyłasz blok kodu Pythona za pośrednictwem formularza, a klient przychodzi, pobiera go i wykonuje. Chcę mieć możliwość tworzenia prostego komunikatu wyskakującego bez konieczności ponownego pisania całej serii standardowego kodu wxPython lub TkInter za każdym razem (ponieważ kod jest przesyłany za pośrednictwem formularza, a następnie znika).

Wypróbowałem tkMessageBox:

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

ale to otwiera kolejne okno w tle z ikoną tk. Nie chcę tego. Szukałem prostego kodu wxPython, ale zawsze wymagało to skonfigurowania klasy i wprowadzenia pętli aplikacji itp. Czy nie ma prostego, pozbawionego zaczepów sposobu tworzenia okna komunikatu w Pythonie?

Odpowiedzi:


258

Możesz użyć importu i kodu jednowierszowego w następujący sposób:

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

Lub zdefiniuj funkcję (Mbox) w ten sposób:

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)

Zwróć uwagę, że style są następujące:

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

Baw się dobrze!

Uwaga: edytowane, aby użyć MessageBoxWzamiastMessageBoxA


2
Dokładnie to, czego szukałem. OP też z tego, jak to brzmi. Należy oznaczyć jako odpowiedź!
CodeMonkey

3
Meh. Może powiedziałem za wcześnie. Otrzymuję tylko jeden znak dla tytułu i wiadomości. Dziwne ...
CodeMonkey,

18
Musiałem użyć MessageBoxW zamiast MessageBoxA.
CodeMonkey

9
@CodeMonkey w pythonie 3, użyj MessageBoxW zamiast MessageBoxA
Oliver Ni

2
Uwaga: moje wyskakujące okienko nie było w języku angielskim i można je poprawić, czytając odpowiedź użytkownika Burhan Khalid
Ari

50

Czy spojrzałeś na easygui ?

import easygui

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

7
to nie jest tkinter, nie jest dostarczany domyślnie, dziwne, kto jest zainteresowany wprowadzeniem tak prostej funkcjonalności, aby wprowadzić niepotrzebne zależności?
Tebe

7
Właściwie gekannt, easygui jest opakowaniem wokół tkintera. Tak, jest to dodatkowa zależność, ale jest to pojedynczy plik Pythona. Niektórzy programiści mogą pomyśleć, że zależność jest tego warta do implementacji martwego prostego interfejsu GUI.
Ryan Ginstrom

22

Możesz także ustawić drugie okno przed jego wycofaniem, aby ustawić swoją wiadomość

#!/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
Czy jest jakaś metoda, abyśmy nie musieli wciskać przycisku ok w tkMessageBox i przetwarzali się automatycznie?
varsha_holla

@varsha_holla Tak nie działa skrzynka wiadomości. Możesz przyjrzeć się tworzeniu standardowego okna z licznikiem czasu.
Kelly Elton,

19

Przedstawiony kod jest w porządku! Musisz tylko jawnie utworzyć „inne okno w tle” i ukryć je za pomocą tego kodu:

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

Tuż przed Twoją skrzynką wiadomości.


4
Musiałem dodać "window.destroy ()" na końcu tego, aby program wyszedł bezproblemowo.
kuzzooroo

11

Moduł PyMsgBox robi dokładnie to. Posiada funkcje okien komunikatów, które są zgodne z konwencją nazewnictwa JavaScript: alert (), confirm (), prompt () i password () (co jest prompt (), ale używa * podczas pisania). Te wywołania funkcji blokują się, dopóki użytkownik nie kliknie przycisku OK / Anuluj. Jest to wieloplatformowy, czysty moduł Pythona bez żadnych zależności.

Zainstaluj za pomocą: pip install PyMsgBox

Przykładowe użycie:

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

Pełna dokumentacja pod adresem http://pymsgbox.readthedocs.org/en/latest/


dziwne. piszesz, że nie ma żadnych zależności, ale kiedy próbuję go użyć, to się wypisujeAssertionError: Tkinter is required for pymsgbox
gówno

Powinienem to zmienić: pymsgbox nie ma żadnych zależności poza standardową biblioteką, której częścią jest tkinter. Jakiej wersji Pythona i jakiego systemu operacyjnego używasz?
Al Sweigart

Przepraszam, jestem noobem w Pythonie, myślałem, że wszystkie biblioteki Pythona są instalowane przez pip, ale w rzeczywistości część bibliotek jest instalowana w drugą stronę - za pomocą systemowego menedżera pakietów. Więc zainstalowałem python-tkza pomocą mojego menedżera pakietów. Używam Pythona 2.7 na Debianie.
shitpoet

offtopic: ale okno wiadomości utworzone przez PyMsgBox / Tk wygląda dość brzydko na moim Debianie
shitpoet

10

W systemie Windows możesz używać ctypów z biblioteką 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

Na komputerze Mac standardowa biblioteka Pythona ma moduł o nazwie EasyDialogs. Dostępna jest również wersja systemu Windows (oparta na ctypes) pod adresem http://www.averdevelopment.com/python/EasyDialogs.html

Jeśli ma to dla Ciebie znaczenie: używa natywnych dialogów i nie zależy od Tkintera, jak już wspomniano easygui, ale może nie mieć tak wielu funkcji.


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

Ostatni numer (tutaj 1) można zmienić, aby zmienić styl okna (nie tylko przyciski!):

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

Na przykład,

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

da to :

wprowadź opis obrazu tutaj


1

Posługiwać się

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

Okno główne musi zostać utworzone wcześniej. To jest dla Pythona 3. To nie jest fot wxPython, ale tkinter.


Zobacz mój komentarz dotyczący „importu *” w odpowiedzi Roberta.
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 

Ponadto, z miłości do wszystkich jest PEP8 i pythonic, odzwycz się od "import *". Jest źle, dobrze?
Jürgen A. Erhard

1

Możesz także ustawić drugie okno przed jego wycofaniem, aby ustawić swoją wiadomość

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

Uwaga: to jest odpowiedź Lewisa Cowlesa tylko w Pythonie 3ified, ponieważ tkinter zmienił się od czasu pythona 2. Jeśli chcesz, aby Twój kod był kompatybilny z hasłami wstecznymi, zrób coś takiego:

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

0

Nie najlepiej, oto moja podstawowa skrzynka wiadomości używająca tylko tkintera.

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

Importowanie formatowania jest kompletne. Czy przypadkiem jesteś starym programistą COBOL lub FORTRAN? ;-)
Jürgen A. Erhard

0

sprawdź mój moduł Pythona: pip install quickgui (wymaga wxPython, ale nie wymaga znajomości wxPython) https://pypi.python.org/pypi/quickgui

Potrafi tworzyć dowolną liczbę wejść (stosunek, pole wyboru, pole wprowadzania), automatycznie układać je na jednym GUI.


0

Najnowszą wersją okna komunikatów jest moduł prompt_box. Ma dwa pakiety: alert i komunikat. Wiadomość zapewnia większą kontrolę nad polem, ale jej wpisanie zajmuje więcej czasu.

Przykładowy kod alertu:

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

Przykładowy kod wiadomości:

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

moduł ctype z gwintowaniem

Używałem skrzynki tkinter, ale spowodowałoby to awarię kodu. nie chciałem dowiedzieć się dlaczego, więc zamiast tego użyłem modułu ctypes .

na przykład:

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

dostałem ten kod od Arkelis


Podobało mi się, że nie spowodowało to awarii kodu, więc popracowałem nad tym i dodałem wątkowanie, aby kod później działał.

przykład dla mojego kodu

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)

dla stylów przycisków i numerów ikon:

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

Możesz użyć pyautoguilub pymsgbox:

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

Używanie pymsgboxjest takie samo jak używanie pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.