Pythonで簡単なメッセージボックスを作成するにはどうすればよいですか?


119

alert()JavaScript と同じ効果を探しています。

今日の午後、Twisted.webを使用して簡単なWebベースのインタープリターを作成しました。基本的に、フォームを介してPythonコードのブロックを送信すると、クライアントが来てそれを取得し、実行します。ボイラープレートのwxPythonまたはTkInterコードの束全体を毎回書き直す必要なしに、単純なポップアップメッセージを作成できるようにしたいと思います(コードがフォームから送信されてから消えるため)。

私はtkMessageBoxを試しました:

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

ただし、これにより、tkアイコンが付いた別のウィンドウがバックグラウンドで開きます。これは欲しくない。いくつかの単純なwxPythonコードを探していましたが、常にクラスの設定とアプリループの開始などが必要でした。Pythonでメッセージボックスを作成する簡単で簡単な方法はありませんか?

回答:


257

次のようなインポートと1行のコードを使用できます。

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 2013年

3
ええ。おそらく私はあまりにも早く話しました。タイトルとメッセージの両方に1文字しか表示されません。奇妙な...
CodeMonkey

18
MessageBoxAの代わりにMessageBoxWを使用する必要がありました。
CodeMonkey 2013年

9
Python 3の@ CodeMonkey、MessageBoxAの代わりにMessageBoxWを使用
Oliver Ni

2
注:ポップアップは英語ではなかったため、ユーザーBurhan Khalidの回答を
Ari

50

easyguiを見ましたか?

import easygui

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

7
これはtkinterではありません、デフォルトでは出荷されていません、奇妙です、不必要な依存関係をもたらすためにそのような単純な機能を導入することに興味があるのは誰ですか?
テベ

7
実際、gekannt、easyguiはtkinterのラッパーです。はい、追加の依存関係ですが、単一のpythonファイルです。一部の開発者は、非常に単純なGUIを実装するために、依存関係に価値があると考えているかもしれません。
Ryan Ginstrom 2013年

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 14

@varsha_hollaこれはメッセージボックスの動作方法ではありません。タイマー付きの標準ウィンドウの作成を検討することをお勧めします。
ケリーエルトン

19

あなたが提示したコードは大丈夫です!次のコードを使用して、「バックグラウンドの別のウィンドウ」を明示的に作成して非表示にするだけです。

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

メッセージボックスの直前。


4
このウィンドウの最後に「window.destroy()」を追加して、問題なく終了する必要がありました。
kuzzooroo 2014年

11

PyMsgBoxモジュールはまさにこれを行います。JavaScriptの命名規則に準拠したメッセージボックス関数があります。alert()、confirm()、prompt()、password()(prompt()ですが、入力時に*を使用します)。これらの関数呼び出しは、ユーザーが[OK] / [キャンセル]ボタンをクリックするまでブロックされます。依存関係のないクロスプラットフォームの純粋な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とどのOSを使用していますか?
Al Sweigart

申し訳ありませんが、私はPythonの初心者です。すべてのpythonライブラリはからインストールされると思いましたpipが、実際にはライブラリの一部がシステムパッケージマネージャを使用して別の方法でインストールされています。そこでpython-tk、パッケージマネージャーを使用してインストールしました。DebianでPython 2.7を使用しています。
shitpoet

offtopic:しかし、PyMsgBox / Tkによって作成されたメッセージボックスは、私のDebianではかなり醜く見えます
shitpoet

10

Windowsでは、user32ライブラリで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")


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用です。これはwxPythonのためではなく、tkinter用です。


Robertの回答の「import *」に関する私のコメントを参照してください。
ユルゲン・A.エアハルト

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であるため、「インポート*」をやめてください。悪いですよね?
ユルゲン・A.エアハルト

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

注:tkinterはpython 2以降変更されているため、これはルイスカウルズのPython 3に対応した回答です。コードをバックワード互換にしたい場合は、次のようにします。

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プログラマーですか?;-)
ユルゲンA.エアハルト

0

私のpythonモジュールをチェックしてください:pip install quickgui(wxPythonが必要ですが、wxPythonの知識は必要ありません) https://pypi.python.org/pypi/quickgui

任意の数の入力(比率、チェックボックス、入力ボックス)を作成し、それらを単一のGUIに自動配置できます。


0

最近のメッセージボックスバージョンは、prompt_boxモジュールです。これには、アラートとメッセージの2つのパッケージがあります。メッセージを使用すると、ボックスをより細かく制御できますが、入力に時間がかかります。

アラートコードの例:

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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.