Bagaimana cara membuat kotak pesan sederhana dengan Python?

119

Saya mencari efek yang sama seperti alert()di JavaScript.

Saya menulis juru bahasa berbasis web sederhana sore ini menggunakan Twisted.Web. Anda pada dasarnya mengirimkan blok kode Python melalui formulir, dan klien datang dan mengambilnya serta menjalankannya. Saya ingin dapat membuat pesan popup sederhana, tanpa harus menulis ulang sejumlah besar kode wxPython atau TkInter boilerplate setiap saat (karena kode dikirimkan melalui formulir dan kemudian menghilang).

Saya sudah mencoba tkMessageBox:

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

tapi ini membuka jendela lain di latar belakang dengan ikon tk. Saya tidak menginginkan ini. Saya mencari beberapa kode wxPython sederhana tetapi selalu diperlukan untuk menyiapkan kelas dan memasuki loop aplikasi, dll. Apakah tidak ada cara sederhana dan mudah untuk membuat kotak pesan dengan Python?

Carson Myers
sumber

Jawaban:

258

Anda dapat menggunakan impor dan kode baris tunggal seperti ini:

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

Atau tentukan fungsi (Mbox) seperti ini:

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)

Perhatikan gayanya sebagai berikut:

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

Selamat bersenang-senang!

Catatan: diedit untuk digunakan, MessageBoxWbukanMessageBoxA

pengguna2140260
sumber
2
Persis apa yang saya cari. OP juga dari apa yang terdengar. Harus ditandai sebagai jawabannya!
CodeMonkey
3
Meh. Mungkin saya berbicara terlalu cepat. Saya hanya mendapatkan satu karakter untuk judul dan pesan. Aneh ...
CodeMonkey
18
Harus menggunakan MessageBoxW, bukan MessageBoxA.
CodeMonkey
9
@CodeMonkey di python 3, gunakan MessageBoxW daripada MessageBoxA
Oliver Ni
2
Catatan: Popup saya tidak dalam bahasa Inggris, dan dapat dikoreksi dengan membaca jawaban
Ari
50

Pernahkah Anda melihat easygui ?

import easygui

easygui.msgbox("This is a message!", title="simple gui")
Ryan Ginstrom
sumber
7
ini bukan masalah, tidak dikirimkan secara default, aneh, siapa yang tertarik dengan memperkenalkan fungsionalitas sederhana untuk membawa ketergantungan yang tidak perlu?
Tebe
7
Sebenarnya gekannt, easygui adalah pembungkus tkinter. Ya, ini adalah ketergantungan ekstra, tetapi ini adalah file python tunggal. Beberapa pengembang mungkin berpikir bahwa ketergantungan itu sepadan untuk menerapkan GUI yang sangat sederhana.
Ryan Ginstrom
22

Anda juga dapat memposisikan jendela lain sebelum menariknya sehingga Anda memposisikan pesan Anda

#!/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
sumber
3
Apakah ada metode apa pun, sehingga kita tidak perlu memproses tombol ok di tkMessageBox dan memprosesnya secara otomatis?
varsha_holla
@varsha_holla Itu bukan cara kerja kotak pesan. Anda mungkin ingin melihat ke dalam membuat jendela standar dengan timer.
Kelly Elton
19

Kode yang Anda berikan baik-baik saja! Anda hanya perlu secara eksplisit membuat "jendela lain di latar belakang" dan menyembunyikannya, dengan kode ini:

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

Tepat sebelum kotak pesan Anda.

Jotaf
sumber
4
Saya harus menambahkan "window.destroy ()" di akhir ini untuk membuatnya keluar dengan bersih.
kuzzooroo
11

Modul PyMsgBox melakukan hal ini. Ini memiliki fungsi kotak pesan yang mengikuti konvensi penamaan JavaScript: alert (), confirm (), prompt () dan password () (yang merupakan prompt () tetapi menggunakan * saat Anda mengetik). Panggilan fungsi ini memblokir sampai pengguna mengklik tombol OK / Cancel. Ini adalah modul Python murni lintas platform tanpa ketergantungan.

Instal dengan: pip install PyMsgBox

Penggunaan sampel:

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

Dokumentasi lengkap di http://pymsgbox.readthedocs.org/en/latest/

Al Sweigart
sumber
aneh. Anda menulis bahwa itu tidak memiliki ketergantungan, tetapi ketika saya mencoba menggunakannya, cetakannyaAssertionError: Tkinter is required for pymsgbox
shitpoet
Saya harus mengubahnya: pymsgbox tidak memiliki dependensi di luar pustaka standar, di mana tkinter merupakan bagiannya. Versi Python apa dan OS apa yang Anda gunakan?
Al Sweigart
Maaf, saya noob di Python, saya pikir semua python libs diinstal melalui pip, tetapi pada kenyataannya sebagian dari lib diinstal dengan cara lain - menggunakan manajer paket sistem. Jadi saya menginstal python-tkmenggunakan manajer paket saya. Saya menggunakan Python 2.7 di Debian.
shitpoet
offtopic: tetapi kotak pesan yang dibuat oleh PyMsgBox / Tk terlihat sangat jelek di Debian saya
shitpoet
10

Di Windows, Anda dapat menggunakan ctypes dengan pustaka 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")
KAMU
sumber
9

Di Mac, pustaka standar python memiliki modul bernama EasyDialogs. Ada juga versi windows (berbasis ctypes) di http://www.averdevelopment.com/python/EasyDialogs.html

Jika penting bagi Anda: ini menggunakan dialog asli dan tidak bergantung pada Tkinter seperti yang telah disebutkan easygui, tetapi mungkin tidak memiliki banyak fitur.

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

Angka terakhir (di sini 1) dapat diubah untuk mengubah gaya jendela (tidak hanya tombol!):

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

Sebagai contoh,

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

akan memberikan ini :

masukkan deskripsi gambar di sini

Arkelis
sumber
1

Menggunakan

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

Jendela master harus dibuat sebelumnya. Ini untuk Python 3. Ini bukan untuk wxPython, tapi untuk tkinter.

HD1920
sumber
Lihat komentar saya tentang "import *" pada jawaban 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 
Robert
sumber
Juga, mohon, untuk cinta semua PEP8 dan pythonic, lepaskan diri Anda dari "import *". Itu buruk, oke?
Jürgen A. Erhard
1

Anda juga dapat memposisikan jendela lain sebelum menariknya sehingga Anda memposisikan pesan Anda

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

Harap Dicatat: Ini adalah jawaban Lewis Cowles hanya untuk Python 3ified, karena tkinter telah berubah sejak python 2. Jika Anda ingin kode Anda menjadi kata kunci yang dapat digabungkan, lakukan sesuatu seperti ini:

try:
    import tkinter
    import tkinter.messagebox
except ModuleNotFoundError:
    import Tkinter as tkinter
    import tkMessageBox as tkinter.messagebox
Hexiro
sumber
0

Bukan yang terbaik, ini kotak Pesan dasar saya hanya dengan menggunakan 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
"""
Creuil
sumber
Anda mengimpor format benar-benar gila. Apakah Anda seorang programmer COBOL atau FORTRAN lama? ;-)
Jürgen A. Erhard
0

lihat modul python saya: pip install quickgui (Memerlukan wxPython, tetapi tidak memerlukan pengetahuan tentang wxPython) https://pypi.python.org/pypi/quickgui

Dapat membuat sejumlah masukan, (rasio, kotak centang, kotak masukan), mengaturnya secara otomatis pada satu gui.

Jerry T
sumber
0

Versi kotak pesan terbaru adalah modul prompt_box. Ini memiliki dua paket: peringatan dan pesan. Pesan memberi Anda kontrol yang lebih besar atas kotak, tetapi membutuhkan waktu lebih lama untuk mengetik.

Contoh Kode peringatan:

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

Contoh kode pesan:

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
sumber
0

modul ctype dengan threading

saya menggunakan kotak pesan tkinter tetapi itu akan merusak kode saya. saya tidak ingin mencari tahu mengapa jadi saya menggunakan modul ctypes sebagai gantinya.

sebagai contoh:

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

saya mendapat kode itu dari Arkelis


Saya suka bahwa itu tidak merusak kode jadi saya mengerjakannya dan menambahkan threading sehingga kode setelahnya akan berjalan.

contoh untuk kode saya

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)

untuk gaya tombol dan nomor 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
Pekerja Emerald
sumber
0

Anda dapat menggunakan pyautoguiatau pymsgbox:

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

Menggunakan pymsgboxsama dengan menggunakan pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Beberapa pria
sumber