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?

Carson Myers
źródło

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

user2140260
źródło
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")
Ryan Ginstrom
źródło
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!")
Lewis Cowles
źródło
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.

Jotaf
źródło
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/

Al Sweigart
źródło
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")
TY
źródło
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.

Steven
źródło
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

Arkelis
źródło
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.

HD1920
źródło
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 
Robert
źródło
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
Hexiro
źródło
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
"""
Creuil
źródło
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.

Jerry T
źródło
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
Samuel Crawford
źródło
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
Szmaragdowi pracownicy
źródło
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")
Jakiś facet
źródło