ฉันจะสร้างกล่องข้อความธรรมดาใน Python ได้อย่างไร


120

ฉันกำลังมองหาเอฟเฟกต์เดียวกันกับalert()ใน JavaScript

ฉันเขียนล่ามบนเว็บง่ายๆเมื่อบ่ายวันนี้โดยใช้ Twisted.web โดยทั่วไปคุณจะส่งบล็อกรหัส Python ผ่านแบบฟอร์มและไคลเอนต์ก็มาคว้าและเรียกใช้งาน ฉันต้องการที่จะสามารถสร้างข้อความป๊อปอัพง่ายๆโดยไม่ต้องเขียนโค้ดสำเร็จรูป wxPython หรือ TkInter ซ้ำทุกครั้ง (เนื่องจากรหัสถูกส่งผ่านแบบฟอร์มแล้วหายไป)

ฉันได้ลอง tkMessageBox:

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

แต่จะเปิดอีกหน้าต่างหนึ่งในพื้นหลังพร้อมไอคอน tk ฉันไม่ต้องการสิ่งนี้ ฉันกำลังมองหาโค้ด wxPython ง่ายๆ แต่ต้องตั้งค่าคลาสและเข้าสู่แอปลูปเป็นต้นไม่มีวิธีง่ายๆในการสร้างกล่องข้อความใน Python หรือไม่?

คำตอบ:


259

คุณสามารถใช้การนำเข้าและรหัสบรรทัดเดียวดังนี้:

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

หรือกำหนดฟังก์ชัน (Mbox) ดังนี้:

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)

โปรดทราบว่ารูปแบบมีดังนี้:

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

มีความสุข!

หมายเหตุ: แก้ไขเพื่อใช้MessageBoxWแทนMessageBoxA


2
สิ่งที่ฉันกำลังมองหา OP เกินไปจากสิ่งที่ดูเหมือน ควรทำเครื่องหมายเป็นคำตอบ!
CodeMonkey

3
Meh บางทีฉันอาจจะพูดเร็วเกินไป ฉันได้รับอักขระเพียงตัวเดียวสำหรับทั้งชื่อเรื่องและข้อความ แปลก ...
CodeMonkey

18
ต้องใช้ MessageBoxW แทน MessageBoxA
CodeMonkey

9
@CodeMonkey ใน python 3 ใช้ MessageBoxW แทน MessageBoxA
Oliver Ni

2
หมายเหตุ:ป๊อปอัปของฉันไม่ใช่ภาษาอังกฤษและสามารถแก้ไขได้โดยอ่านคำตอบของ
Ari

50

คุณดูeasyguiหรือยัง?

import easygui

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

7
นี่ไม่ใช่ tkinter ไม่ได้จัดส่งตามค่าเริ่มต้นแปลกใครสนใจแนะนำฟังก์ชั่นง่ายๆเช่นนี้เพื่อนำการอ้างอิงที่ไม่จำเป็น?
Tebe

7
จริงๆแล้ว easygui เป็นกระดาษห่อหุ้มรอบ tkinter ใช่มันเป็นการพึ่งพาเพิ่มเติม แต่เป็นไฟล์ python เดียว นักพัฒนาบางคนอาจคิดว่าการพึ่งพานั้นคุ้มค่าสำหรับการใช้งาน GUI ที่ไม่ซับซ้อน
Ryan Ginstrom

22

นอกจากนี้คุณสามารถวางตำแหน่งของหน้าต่างอื่นก่อนที่จะถอนออกเพื่อให้คุณวางตำแหน่งข้อความของคุณได้

#!/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
มีวิธีใดบ้างที่เราไม่จำเป็นต้อง pross ปุ่มokในtkMessageBoxและมันจะประมวลผลโดยอัตโนมัติ?
varsha_holla

@varsha_holla นั่นไม่ใช่วิธีการทำงานของกล่องข้อความ คุณอาจต้องการดูการสร้างหน้าต่างมาตรฐานด้วยตัวจับเวลา
Kelly Elton

19

รหัสที่คุณนำเสนอนั้นใช้ได้! คุณต้องสร้าง "หน้าต่างอื่น ๆ ในพื้นหลัง" อย่างชัดเจนและซ่อนไว้โดยใช้รหัสนี้:

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

ก่อนกล่องข้อความของคุณ


4
ฉันต้องเพิ่ม "window.destroy ()" ต่อท้ายสิ่งนี้เพื่อให้มันออกอย่างหมดจด
kuzzooroo

11

โมดูล PyMsgBox ทำเช่นนี้ มีฟังก์ชันกล่องข้อความที่เป็นไปตามหลักการตั้งชื่อของ JavaScript: alert (), confirm (), prompt () และ password () (ซึ่งเป็น prompt () แต่ใช้ * เมื่อคุณพิมพ์) ฟังก์ชันเหล่านี้เรียกใช้บล็อกจนกว่าผู้ใช้จะคลิกปุ่มตกลง / ยกเลิก เป็นโมดูล Python แบบข้ามแพลตฟอร์มที่ไม่มีการอ้างอิง

ติดตั้งด้วย: pip install PyMsgBox

ตัวอย่างการใช้งาน:

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

เอกสารฉบับเต็มที่http://pymsgbox.readthedocs.org/en/latest/


แปลก. คุณเขียนว่ามันไม่มีการอ้างอิง แต่เมื่อฉันพยายามใช้มันพิมพ์AssertionError: Tkinter is required for pymsgbox
shitpoet

ฉันควรเปลี่ยนสิ่งนั้น: pymsgbox ไม่มีการอ้างอิงนอกไลบรารีมาตรฐานซึ่ง tkinter เป็นส่วนหนึ่งของ คุณใช้ Python เวอร์ชันใดและระบบปฏิบัติการใด
Al Sweigart

ขออภัยฉัน noob ใน Python ฉันคิดว่า python libs ทั้งหมดถูกติดตั้งผ่านpipแต่ในความเป็นจริงแล้วส่วนหนึ่งของ libs ได้รับการติดตั้งด้วยวิธีอื่น - โดยใช้ตัวจัดการแพ็คเกจระบบ ดังนั้นฉันจึงติดตั้งpython-tkโดยใช้ตัวจัดการแพ็คเกจของฉัน ฉันใช้ Python 2.7 บน Debian
shitpoet

offtopic: แต่กล่องข้อความที่สร้างโดย PyMsgBox / Tk ดูน่าเกลียดใน Debian ของฉัน
shitpoet

10

ใน Windows คุณสามารถใช้ctypes กับไลบรารี 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

บน Mac ไลบรารีมาตรฐาน python มีโมดูลที่เรียกว่าEasyDialogs. นอกจากนี้ยังมีเวอร์ชัน windows (ตาม ctypes) ที่http://www.averdevelopment.com/python/EasyDialogs.html

หากเป็นเรื่องสำคัญสำหรับคุณ: จะใช้กล่องโต้ตอบแบบเนทีฟและไม่ได้ขึ้นอยู่กับ Tkinter เหมือนที่กล่าวไปแล้วeasyguiแต่อาจไม่มีคุณสมบัติมากนัก


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

หมายเลขสุดท้าย (ที่นี่ 1) สามารถเปลี่ยนเพื่อเปลี่ยนรูปแบบหน้าต่าง (ไม่ใช่ปุ่มเท่านั้น!):

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

ตัวอย่างเช่น,

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

จะให้สิ่งนี้ :

ใส่คำอธิบายภาพที่นี่


1

ใช้

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

ต้องสร้างหน้าต่างต้นแบบก่อน สำหรับ Python 3 นี่ไม่ใช่ fot wxPython แต่สำหรับ tkinter


ดูความคิดเห็นของฉันเกี่ยวกับ "import *" ในคำตอบของ 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 

นอกจากนี้โปรดเพื่อความรักของทุกคนคือ PEP8 และ pythonic หย่านมตัวเองออกจาก "import *" แย่จังเลยเหรอ?
Jürgen A. Erhard

1

นอกจากนี้คุณสามารถวางตำแหน่งของหน้าต่างอื่นก่อนที่จะถอนออกเพื่อให้คุณวางตำแหน่งข้อความของคุณได้

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

โปรดทราบ: นี่คือคำตอบของ Lewis Cowles เพียงแค่ Python 3ified เนื่องจาก tkinter มีการเปลี่ยนแปลงตั้งแต่ python 2 หากคุณต้องการให้โค้ดของคุณสามารถใช้ backwords ที่เข้ากันได้ให้ทำสิ่งนี้:

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

0

ยังไม่ดีที่สุดนี่คือกล่องข้อความพื้นฐานของฉันโดยใช้ 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
"""

คุณนำเข้าการจัดรูปแบบเป็นสิ่งที่ผิดพลาดอย่างสิ้นเชิง คุณเป็นโปรแกรมเมอร์ COBOL หรือ FORTRAN เก่าโดยบังเอิญหรือไม่? ;-)
Jürgen A. Erhard

0

ตรวจสอบโมดูล python ของฉัน: pip install quickgui (ต้องใช้ wxPython แต่ไม่จำเป็นต้องมีความรู้เกี่ยวกับ wxPython) https://pypi.python.org/pypi/quickgui

สามารถสร้างอินพุตจำนวนเท่าใดก็ได้ (อัตราส่วนช่องทำเครื่องหมายช่องป้อนข้อมูล) จัดเรียงโดยอัตโนมัติใน gui เดียว


0

กล่องข้อความเวอร์ชันล่าสุดคือโมดูล prompt_box มีสองแพ็คเกจ: การแจ้งเตือนและข้อความ ข้อความช่วยให้คุณควบคุมกล่องได้มากขึ้น แต่ใช้เวลาพิมพ์นานขึ้น

ตัวอย่างรหัสการแจ้งเตือน:

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

ตัวอย่างรหัสข้อความ:

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 พร้อมเธรด

ฉันใช้กล่องข้อความ tkinter แต่รหัสของฉันจะขัดข้อง ฉันไม่ต้องการทราบว่าทำไมฉันจึงใช้โมดูลctypesแทน

ตัวอย่างเช่น:

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

ฉันได้รับรหัสนั้นจากArkelis


ฉันชอบที่มันไม่ทำให้โค้ดผิดพลาดดังนั้นฉันจึงทำงานกับมันและเพิ่มเธรดเพื่อให้โค้ดหลังจากนั้นจะทำงาน

ตัวอย่างรหัสของฉัน

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)

สำหรับรูปแบบปุ่มและหมายเลขไอคอน:

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

คุณสามารถใช้pyautoguiหรือpymsgbox:

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

การใช้pymsgboxงานเหมือนกับการใช้pyautogui:

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

0

ฉันต้องเพิ่มกล่องข้อความในโปรแกรมที่มีอยู่ คำตอบส่วนใหญ่ซับซ้อนเกินไปในกรณีนี้ สำหรับ Linux บน Ubuntu 16.04 (Python 2.7.12) พร้อมการพิสูจน์อักษรในอนาคตสำหรับ Ubuntu 20.04 นี่คือรหัสของฉัน:

โปรแกรมด้านบน

from __future__ import print_function       # Must be first import

try:
    import tkinter as tk
    import tkinter.ttk as ttk
    import tkinter.font as font
    import tkinter.filedialog as filedialog
    import tkinter.messagebox as messagebox
    PYTHON_VER="3"
except ImportError: # Python 2
    import Tkinter as tk
    import ttk
    import tkFont as font
    import tkFileDialog as filedialog
    import tkMessageBox as messagebox
    PYTHON_VER="2"

ไม่ว่าจะรัน Python เวอร์ชันใดโค้ดจะใช้messagebox.สำหรับการพิสูจน์อักษรในอนาคตหรือความเข้ากันได้ย้อนหลัง ฉันต้องการเพียงแค่แทรกสองบรรทัดลงในโค้ดที่มีอยู่ด้านบน

กล่องข้อความโดยใช้เรขาคณิตของหน้าต่างหลัก

''' At least one song must be selected '''
if self.play_song_count == 0:
    messagebox.showinfo(title="No Songs Selected", \
        message="You must select at least one song!", \
        parent=self.toplevel)
    return

ฉันมีรหัสที่จะส่งคืนหากจำนวนเพลงเป็นศูนย์ ดังนั้นฉันจึงต้องแทรกสามบรรทัดระหว่างโค้ดที่มีอยู่เท่านั้น

คุณสามารถสำรองรหัสเรขาคณิตที่ซับซ้อนได้โดยใช้การอ้างอิงหน้าต่างหลักแทน:

parent=self.toplevel

ข้อดีอีกประการหนึ่งคือถ้าหน้าต่างหลักถูกย้ายหลังจากเริ่มต้นโปรแกรมกล่องข้อความของคุณจะยังคงปรากฏในตำแหน่งที่คาดเดาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.