Làm cách nào để tạo một hộp thư đơn giản bằng Python?


119

Tôi đang tìm kiếm hiệu ứng tương tự như alert()trong JavaScript.

Chiều nay, tôi đã viết một trình thông dịch dựa trên web đơn giản bằng Twisted.web. Về cơ bản, bạn gửi một khối mã Python thông qua một biểu mẫu và khách hàng đến và lấy nó và thực thi nó. Tôi muốn có thể tạo một thông báo bật lên đơn giản mà không cần phải viết lại hàng loạt mã wxPython hoặc TkInter viết sẵn mỗi lần (vì mã được gửi qua biểu mẫu và sau đó biến mất).

Tôi đã thử tkMessageBox:

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

nhưng điều này sẽ mở ra một cửa sổ khác trong nền với biểu tượng tk. Tôi không muốn điều này. Tôi đang tìm kiếm một số mã wxPython đơn giản nhưng nó luôn yêu cầu thiết lập một lớp và nhập vòng lặp ứng dụng, v.v. Có cách nào đơn giản, dễ hiểu để tạo hộp thông báo bằng Python không?

Câu trả lời:


257

Bạn có thể sử dụng một mã nhập và một dòng như sau:

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

Hoặc xác định một hàm (Mbox) như sau:

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)

Lưu ý các kiểu như sau:

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

Chúc vui vẻ!

Lưu ý: đã chỉnh sửa để sử dụng MessageBoxWthay vìMessageBoxA


2
Chính xác những gì tôi đang tìm kiếm. OP cũng vậy từ những gì nó phát ra âm thanh. Nên được đánh dấu là câu trả lời!
CodeMonkey

3
Meh. Có lẽ tôi đã nói quá sớm. Tôi chỉ nhận được một ký tự duy nhất cho cả tiêu đề và tin nhắn. Weird ...
CodeMonkey

18
Phải sử dụng MessageBoxW thay vì MessageBoxA.
CodeMonkey

9
@CodeMonkey trong python 3, sử dụng MessageBoxW thay vì MessageBoxA
Oliver Ni

2
Lưu ý: Cửa sổ bật lên của tôi không phải bằng tiếng Anh và có thể sửa lại bằng cách đọc câu trả lời của
Ari

50

Bạn đã nhìn vào easygui chưa?

import easygui

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

7
Đây không phải là tkinter, nó không được vận chuyển theo mặc định, thật lạ, ai quan tâm đến việc giới thiệu chức năng đơn giản như vậy để mang lại những phụ thuộc không cần thiết?
Tebe

7
Thực ra gekannt, easygui là một trình bao bọc xung quanh tkinter. Có, đó là một phụ thuộc bổ sung, nhưng đó là một tệp python duy nhất. Một số nhà phát triển có thể nghĩ rằng sự phụ thuộc là đáng giá để triển khai một GUI đơn giản.
Ryan Ginstrom

22

Ngoài ra, bạn có thể định vị cửa sổ khác trước khi rút nó để bạn định vị tin nhắn của mình

#!/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
Có phương pháp nào để chúng ta không cần đưa nút ok trong tkMessageBox và nó tự động xử lý không?
varsha_holla

@varsha_holla Đó không phải là cách hộp thư hoạt động. Bạn có thể muốn xem xét việc tạo một cửa sổ tiêu chuẩn với bộ hẹn giờ.
Kelly Elton

19

Mã bạn trình bày là tốt! Bạn chỉ cần tạo rõ ràng "cửa sổ khác trong nền" và ẩn nó, với mã này:

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

Ngay trước hộp thư của bạn.


4
Tôi đã phải thêm "window.destroy ()" vào cuối phần này để làm cho nó thoát sạch.
kuzzooroo

11

Mô-đun PyMsgBox thực hiện chính xác điều này. Nó có các hàm hộp thông báo tuân theo các quy ước đặt tên của JavaScript: alert (), xác nhận (), prompt () và mật khẩu () (là prompt () nhưng sử dụng * khi bạn nhập). Các lệnh gọi hàm này sẽ chặn cho đến khi người dùng nhấp vào nút OK / Cancel. Đó là một mô-đun Python thuần túy, đa nền tảng không có phụ thuộc.

Cài đặt bằng: pip install PyMsgBox

Sử dụng mẫu:

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

Tài liệu đầy đủ tại http://pymsgbox.readthedocs.org/en/latest/


lạ lùng. bạn viết rằng nó không có phụ thuộc, nhưng khi tôi cố gắng sử dụng nó nó inAssertionError: Tkinter is required for pymsgbox
shitpoet

Tôi nên thay đổi điều đó: pymsgbox không có phụ thuộc nào bên ngoài thư viện chuẩn, mà tkinter là một phần của. Phiên bản Python nào và bạn đang sử dụng hệ điều hành nào?
Al Sweigart

Xin lỗi, tôi là noob trong Python, tôi nghĩ rằng tất cả các lib python đều được cài đặt thông qua pip, nhưng trên thực tế, một phần của lib được cài đặt theo cách khác - sử dụng trình quản lý gói hệ thống. Vì vậy, tôi đã cài đặt python-tkbằng trình quản lý gói của mình. Tôi đang sử dụng Python 2.7 trên Debian.
shitpoet

Offtopic: nhưng hộp thư được tạo ra bởi PyMsgBox / Tk trông khá xấu xí trên tôi Debian
shitpoet

10

Trong Windows, bạn có thể sử dụng ctypes với thư viện 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

Trên Mac, thư viện tiêu chuẩn python có một mô-đun được gọi EasyDialogs. Ngoài ra còn có phiên bản windows (dựa trên ctypes) tại http://www.averdevelopment.com/python/EasyDialogs.html

Nếu nó quan trọng với bạn: nó sử dụng các hộp thoại gốc và không phụ thuộc vào Tkinter như đã đề cập easygui, nhưng nó có thể không có nhiều tính năng.


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

Số cuối cùng (ở đây 1) có thể được thay đổi để thay đổi kiểu cửa sổ (không chỉ các nút!):

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

Ví dụ,

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

sẽ cho cái này :

nhập mô tả hình ảnh ở đây


1

Sử dụng

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

Cửa sổ chính phải được tạo trước đó. Đây là dành cho Python 3. Đây không phải là fot wxPython, mà là tkinter.


Xem nhận xét của tôi về "nhập khẩu *" trên câu trả lời của 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 

Ngoài ra, xin vui lòng, vì tình yêu của tất cả là PEP8 và pythonic, hãy từ bỏ "nhập khẩu *". Nó tồi tệ, tôi được không?
Jürgen A. Erhard

1

Ngoài ra, bạn có thể định vị cửa sổ khác trước khi rút nó để bạn định vị tin nhắn của mình

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

Xin lưu ý: Đây là câu trả lời của Lewis Cowles chỉ là Python 3ified, vì tkinter đã thay đổi kể từ python 2. Nếu bạn muốn mã của mình trở thành backword có thể nghe được, hãy làm như sau:

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

0

Không phải là tốt nhất, đây là hộp Thư cơ bản của tôi chỉ sử dụng 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
"""

Bạn nhập định dạng là hoàn toàn khó. Bạn có phải là một lập trình viên COBOL hay FORTRAN cũ không? ;-)
Jürgen A. Erhard

0

kiểm tra mô-đun python của tôi: pip install quickgui (Yêu cầu wxPython, nhưng không yêu cầu kiến ​​thức về wxPython) https://pypi.python.org/pypi/quickgui

Có thể tạo bất kỳ số lượng đầu vào nào, (tỷ lệ, hộp kiểm, hộp nhập), tự động sắp xếp chúng trên một gui duy nhất.


0

Một phiên bản hộp thư gần đây là mô-đun prompt_box. Nó có hai gói: cảnh báo và tin nhắn. Tin nhắn cung cấp cho bạn quyền kiểm soát tốt hơn đối với hộp, nhưng mất nhiều thời gian hơn để nhập.

Mã cảnh báo mẫu:

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

Mã tin nhắn mẫu:

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

mô-đun ctype với luồng

tôi đang sử dụng hộp thư tkinter nhưng nó sẽ làm hỏng mã của tôi. Tôi không muốn tìm hiểu lý do tại sao nên tôi đã sử dụng mô-đun ctypes để thay thế.

ví dụ:

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

tôi nhận được mã đó từ Arkelis


Tôi thích rằng nó không làm hỏng mã vì vậy tôi đã làm việc trên nó và thêm một luồng để mã sau đó sẽ chạy.

ví dụ cho mã của tôi

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)

cho các kiểu nút và số biểu tượng:

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

Bạn có thể sử dụng pyautoguihoặc pymsgbox:

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

Sử dụng pymsgboxgiống như sử dụng pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.