Python'da nasıl basit bir mesaj kutusu oluşturabilirim?


119

alert()JavaScript'le aynı etkiyi arıyorum .

Bu öğleden sonra Twisted.web'i kullanarak basit bir web tabanlı tercüman yazdım. Temelde bir form aracılığıyla bir Python kodu bloğu gönderirsiniz ve müşteri gelir ve onu alır ve çalıştırır. Her seferinde bir grup standart wxPython veya TkInter kodunu yeniden yazmak zorunda kalmadan basit bir açılır pencere mesajı oluşturabilmek istiyorum (çünkü kod bir form aracılığıyla gönderilir ve sonra kaybolur).

TkMessageBox'ı denedim:

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

ancak bu arka planda tk simgesiyle başka bir pencere açar. Ben bunu istemiyorum Basit bir wxPython kodu arıyordum ama her zaman bir sınıf oluşturmayı ve bir uygulama döngüsü girmeyi vb. Gerektiriyordu. Python'da bir mesaj kutusu oluşturmanın basit, yakalanmayan bir yolu yok mu?

Yanıtlar:


258

Bunun gibi bir içe aktarma ve tek satırlık kod kullanabilirsiniz:

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

Veya şöyle bir işlev (Mbox) tanımlayın:

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)

Stillerin aşağıdaki gibi olduğuna dikkat edin:

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

İyi eğlenceler!

Not: MessageBoxWyerine kullanılmak üzere düzenlendiMessageBoxA


2
Tam olarak aradığım şey. OP de göründüğü gibi. Cevap olarak işaretlenmelidir!
CodeMonkey

3
Meh. Belki çok erken konuştum. Hem başlık hem de mesaj için sadece tek bir karakter alıyorum. Tuhaf ...
CodeMonkey

18
MessageBoxA yerine MessageBoxW kullanmak gerekiyordu.
CodeMonkey

9
@CodeMonkey python 3'te, MessageBoxA yerine MessageBoxW kullanın
Oliver Ni

2
Not: Pop-up'ım İngilizce değildi ve kullanıcı Burhan Khalid'in cevabını
Ari

50

Baktığınız easygui ?

import easygui

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

7
bu tkinter değil, varsayılan olarak gönderilmiyor, garip, gereksiz bağımlılıkları getirmek için bu kadar basit işlevsellik sunmakla kim ilgileniyor?
Tebe

7
Aslında gekannt, easygui tkinter'ın etrafındaki bir paketleyicidir. Evet, fazladan bir bağımlılık, ancak tek bir python dosyası. Bazı geliştiriciler, basit bir GUI uygulamak için bağımlılığın buna değer olduğunu düşünebilir.
Ryan Ginstrom

22

Ayrıca diğer pencereyi geri çekmeden önce konumlandırabilirsiniz, böylece mesajınızı konumlandırabilirsiniz.

#!/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'ta ok düğmesini basmamıza gerek kalmaması ve otomatik olarak işlenmesi için herhangi bir yöntem var mı ?
varsha_holla

@varsha_holla Mesaj kutusu böyle çalışmaz. Bir zamanlayıcı ile standart bir pencere oluşturmaya bakmak isteyebilirsiniz.
Kelly Elton

19

Sunduğunuz kod iyi! Sadece "arka planda diğer pencereyi" açıkça oluşturmanız ve şu kodla gizlemeniz gerekir:

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

Mesaj kutunuzdan hemen önce.


4
Temiz bir şekilde çıkması için bunun sonuna "window.destroy ()" eklemek zorunda kaldım.
kuzzooroo

11

PyMsgBox modülü tam olarak bunu yapar. JavaScript'in adlandırma kurallarını izleyen mesaj kutusu işlevlerine sahiptir: alert (), confirm (), komut istemi () ve parola () (bu komut istemidir () ancak yazarken * kullanır). Bu işlev çağrıları, kullanıcı bir Tamam / İptal düğmesine tıklayana kadar bloke edilir. Bağımlılığı olmayan, çapraz platformlu, saf bir Python modülüdür.

Şununla yükle: pip install PyMsgBox

Örnek kullanım:

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

Tam belgeler http://pymsgbox.readthedocs.org/en/latest/ adresinde


garip. bağımlılığı olmadığını yazıyorsun, ama kullanmaya çalıştığımda yazdırıyorAssertionError: Tkinter is required for pymsgbox
bok

Bunu değiştirmeliyim: pymsgbox, tkinter'ın parçası olduğu standart kitaplık dışında hiçbir bağımlılığa sahip değildir. Python'un hangi sürümünü ve hangi işletim sistemini kullanıyorsunuz?
Al Sweigart

Üzgünüm, Python'da noob'um, tüm python kitaplıklarının yüklendiğini sanıyordum pip, ama aslında kitaplıkların bir kısmı başka bir yolla kuruluyor - sistem paket yöneticisi kullanılarak. Bu yüzden python-tkpaket yöneticimi kullanarak kurdum . Debian üzerinde Python 2.7 kullanıyorum.
shitpoet

offtopic: ancak PyMsgBox / Tk tarafından oluşturulan mesaj kutusu Debian'ımda oldukça çirkin görünüyor
shitpoet

10

Windows'ta, user32 kitaplığı ile ctypes kullanabilirsiniz :

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


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

Son sayı (burada 1) pencere stilini değiştirmek için değiştirilebilir (sadece düğmeler değil!):

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

Örneğin,

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

verecek bu :

görüntü açıklamasını buraya girin


1

kullanım

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

Ana pencere daha önce oluşturulmalıdır. Bu Python 3 içindir. Bu wxPython için değil, tkinter içindir.


Robert'ın cevabında "ithalat *" hakkındaki yorumuma bakın.
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 

Ayrıca, lütfen, PEP8 ve pitonik olanların aşkı için, "ithalattan *" kendinizi uzaklaştırın. Kötü, tamam mı?
Jürgen A. Erhard

1

Ayrıca diğer pencereyi geri çekmeden önce konumlandırabilirsiniz, böylece mesajınızı konumlandırabilirsiniz.

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

Lütfen Dikkat: Bu Lewis Cowles'ın cevabı sadece Python 3ified, çünkü tkinter python 2'den beri değişti. Eğer kodunuzun backwords uyumlu olmasını istiyorsanız şuna benzer bir şey yapın:

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

0

En iyisi değil, işte sadece tkinter kullanan temel Mesaj kutum.

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

Biçimlendirmeyi içe aktarmanız tamamen çılgın. Herhangi bir şans eseri eski bir COBOL veya FORTRAN programcısı mısınız? ;-)
Jürgen A. Erhard

0

python modülümü kontrol edin: pip install quickgui (wxPython gerektirir, ancak wxPython bilgisi gerektirmez) https://pypi.python.org/pypi/quickgui

Herhangi bir sayıda girdi oluşturabilir (oran, onay kutusu, giriş kutusu), bunları tek bir gui üzerinde otomatik olarak düzenleyebilir.


0

Yeni bir mesaj kutusu sürümü, istem kutusu modülüdür. İki paketi vardır: uyarı ve mesaj. Mesaj size kutu üzerinde daha fazla kontrol sağlar, ancak yazmak daha uzun sürer.

Örnek Uyarı kodu:

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

Örnek Mesaj kodu:

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

diş açma ile ctype modülü

tkinter mesaj kutusunu kullanıyordum ama kodum çöküyordu. nedenini öğrenmek istemedim, bu yüzden onun yerine ctypes modülünü kullandım.

Örneğin:

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

o kodu Arkelis'ten aldım


Kodun çökmemesini sevdim, bu yüzden üzerinde çalıştım ve bir iş parçacığı ekledim, böylece sonraki kod çalışacaktı.

kodum için örnek

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)

düğme stilleri ve simge numaraları için:

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

Sen kullanabilirsiniz pyautoguiya pymsgbox:

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

Kullanmak pymsgbox, kullanmakla aynıdır pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.