मैं पायथन में एक साधारण संदेश बॉक्स कैसे बना सकता हूं?


119

मैं के रूप में एक ही प्रभाव के लिए देख रहा हूँ alert() जावास्क्रिप्ट में के में ।

मैंने आज दोपहर Twisted.web का उपयोग करते हुए एक साधारण वेब-आधारित दुभाषिया लिखा। आप मूल रूप से एक फॉर्म के माध्यम से पायथन कोड का एक ब्लॉक सबमिट करते हैं, और क्लाइंट आता है और इसे पकड़ लेता है और निष्पादित करता है। मैं हर बार बॉयलरप्लेट wxPython या TkInter कोड के एक पूरे समूह को फिर से लिखने के बिना, एक साधारण पॉपअप संदेश बनाने में सक्षम होना चाहता हूं (क्योंकि कोड एक फॉर्म के माध्यम से प्रस्तुत किया जाता है और फिर गायब हो जाता है)।

मैंने tkMessageBox आज़माया है:

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

लेकिन यह एक आइकन के साथ पृष्ठभूमि में एक और विंडो खोलता है। मुझे यह नहीं चाहिए। मैं कुछ सरल wxPython कोड की तलाश कर रहा था, लेकिन यह हमेशा एक कक्षा स्थापित करने और ऐप लूप आदि में प्रवेश करने की आवश्यकता है। क्या पायथन में एक संदेश बॉक्स बनाने का कोई सरल, कैच-मुक्त तरीका नहीं है?

जवाबों:


257

आप इस तरह एक आयात और एक लाइन कोड का उपयोग कर सकते हैं:

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
ठीक वही जो मेरे द्वारा खोजा जा रहा था। ओपी को भी यह कैसा लगता है। उत्तर के रूप में चिह्नित किया जाना चाहिए!
कोडमोंकी

3
भावहीन। शायद मैंने भी जल्द ही बोल दिया। मुझे केवल शीर्षक और संदेश दोनों के लिए एक ही चरित्र मिल रहा है। अजीब ...
CodeMonkey

18
MessageBoxA के बजाय MessageBoxW का उपयोग करना पड़ा।
कोडमोंकी

9
@ अजगर 3 में अजगर, MessageBoxA के बजाय MessageBoxW का उपयोग करें
ओलिवर नी

2
नोट: मेरा पॉपअप अंग्रेजी में नहीं था, और उपयोगकर्ता बुरहान खालिद के उत्तर
एर

50

क्या आपने आसानई पर ध्यान दिया है ?

import easygui

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

7
यह स्पष्ट नहीं है, यह डिफ़ॉल्ट रूप से शिप नहीं किया गया है, अजीब है, जो अनावश्यक निर्भरता लाने के लिए इस तरह की सरल कार्यक्षमता को शुरू करने में रुचि रखते हैं?
तेबे

7
वास्तव में gekannt, easygui टिक्कटर के आसपास एक आवरण है। हां, यह एक अतिरिक्त निर्भरता है, लेकिन यह एक एकल अजगर फ़ाइल है। कुछ डेवलपर्स सोच सकते हैं कि मृत-सरल जीयूआई को लागू करने के लिए निर्भरता इसके लायक है।
रयान गिंस्ट्रोम

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
क्या कोई विधि है, ताकि हमें tkMessageBox में ठीक बटन पर मुकदमा चलाने की आवश्यकता न हो और यह स्वचालित रूप से प्रक्रिया करे?
varsha_holla

@varsha_holla यह संदेश बॉक्स का काम नहीं है। आप टाइमर के साथ एक मानक विंडो बनाने पर गौर करना चाहते हैं।
केली एल्टन

19

आपके द्वारा प्रस्तुत कोड ठीक है! आपको बस स्पष्ट रूप से "पृष्ठभूमि में अन्य खिड़की" बनाने और इसे इस कोड के साथ छिपाने की आवश्यकता है:

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

आपके मैसेजबॉक्स से ठीक पहले।


4
मुझे "window.destroy ()" को इसके अंत तक जोड़ना था ताकि इसे साफ-सफाई से बाहर निकाला जा सके।
कुजूरू

11

PyMsgBox मॉड्यूल बिल्कुल यही करता है। इसमें संदेश बॉक्स फ़ंक्शन हैं जो जावास्क्रिप्ट के नामकरण सम्मेलनों का पालन करते हैं: चेतावनी (), पुष्टिकरण (), शीघ्र () और पासवर्ड () (जो शीघ्र है () लेकिन उपयोग करते समय * का उपयोग करता है)। जब तक उपयोगकर्ता ओके / कैंसल बटन पर क्लिक नहीं करता, तब तक ये फ़ंक्शन कॉल ब्लॉक होता है। यह एक क्रॉस-प्लेटफ़ॉर्म, शुद्ध पायथन मॉड्यूल है जिसमें कोई निर्भरता नहीं है।

इसके साथ स्थापित करें: 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

मुझे यह बदलना चाहिए कि: मानक लाइब्रेरी के बाहर जिमगबॉक्स की कोई निर्भरता नहीं है, जो कि टिक्चर का हिस्सा है। पायथन का कौन सा संस्करण और आप किस ओएस पर हैं?
अल स्वेगार्ट

क्षमा करें, मैं पायथन में नॉब हूँ, मैंने सोचा था कि सभी अजगर लिबास के माध्यम से स्थापित होते हैं pip, लेकिन वास्तव में लिबास का हिस्सा दूसरे तरीके से स्थापित किया जाता है - सिस्टम पैकेज मैनेजर का उपयोग करना। इसलिए मैंने python-tkअपने पैकेज मैनेजर का उपयोग करके इंस्टॉल किया । मैं डेबियन पर पायथन 2.7 का उपयोग कर रहा हूं।
shitpoet

ऑफटॉपिक: लेकिन PyMsgBox / Tk द्वारा बनाया गया संदेश बॉक्स मेरे डेबियन पर बहुत बदसूरत दिखता है
shitpoet

10

विंडोज में, आप उपयोगकर्ता 32 लाइब्रेरी के साथ ctypes का उपयोग कर सकते हैं :

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

मैक पर, अजगर मानक पुस्तकालय में एक मॉड्यूल होता है जिसे कहा जाता है EasyDialogsHttp://www.averdevelopment.com/python/EasyDialogs.html पर एक (ctypes आधारित) विंडोज़ संस्करण भी है

यदि यह आपके लिए मायने रखता है: यह देशी संवादों का उपयोग करता है और पहले से ही उल्लेख की तरह टिंकर पर निर्भर नहीं करता है 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]")

मास्टर विंडो को पहले बनाना होगा। यह पायथन 3 के लिए है। यह fot wxPython नहीं है, बल्कि टिंकर के लिए है।


रॉबर्ट के जवाब पर "आयात *" के बारे में मेरी टिप्पणी देखें।
जुरगेन ए। एरहार्ड

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 के प्यार के लिए, अपने आप को "आयात *" से दूर करें। यह बुरा है, m'kay?
जुरगेन ए। इरहार्ड

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

कृपया ध्यान दें: यह लेविस काउल्स का जवाब है, जो सिर्फ पायथन 3 के बाद से है, क्योंकि अजगर 2 से बदल गया है।

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

आप आयात स्वरूपण पूरी तरह से bonkers हैं। क्या आप किसी भी संयोग से पुराने COBOL या FORTRAN प्रोग्रामर हैं? ;-)
जुरगेन ए। इरहार्ड

0

मेरे अजगर मॉड्यूल की जाँच करें: पाइप स्थापित करें quickgui (wxPython की आवश्यकता है, लेकिन wxPython के ज्ञान की आवश्यकता नहीं है) https://pypi.python.org/pypi/quickgui

किसी भी संख्या में इनपुट बना सकते हैं, (अनुपात, चेकबॉक्स, इनपुटबॉक्स), ऑटो उन्हें एक ही gui पर व्यवस्थित करते हैं।


0

एक हालिया संदेश बॉक्स संस्करण, प्रॉम्प्ट_बॉक्स मॉड्यूल है। इसके दो पैकेज हैं: अलर्ट और संदेश। संदेश आपको बॉक्स पर अधिक नियंत्रण देता है, लेकिन टाइप करने में अधिक समय लेता है।

उदाहरण चेतावनी कोड:

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)

मुझे वह कोड अर्केलिस से मिला


मुझे पसंद आया कि यह कोड को क्रैश नहीं करता था इसलिए मैंने इस पर काम किया और एक थ्रेडिंग को जोड़ा ताकि कोड चलने के बाद।

मेरे कोड के लिए उदाहरण

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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.