web-dev-qa-db-ja.com

Pythonでグラフィカルダイアログをポップアップする最も簡単なクロスプラットフォームの方法は何ですか?

Pythonスクリプトでシンプルなダイアログをポップアップする最も簡単な方法が欲しい。理想的には、解決策は次のとおりです。

  • Windows、OS X、Gnome、KDEで作業する
  • どのOSでもネイティブダイアログのように見える
  • 最小限のコードが必要

シンプルな標準ダイアログをポップアップするには、最小限のコードのみが必要です。基本的には、「このテキストで標準ダイアログをポップアップします」または「質問xでダイアログをポップアップし、応答を変数yにフィードする」と言っています。

これは、他の方法ではコマンドラインで実行される単純なスクリプト用です。 GUIフレームワークについて知りたくない、または「GUIスレッドの開始、イベントハンドラーの登録、ウィンドウプロパティの設定、ループの実行」などのコードを設定する必要はありません。設定する必要はありません。ウィンドウを閉じるか、ウィンドウを閉じます。ウィンドウやボタン、チェックボックスに配置するテキストを指定すると、ユーザーがクリックした内容が返されます。それ以外はすべて自動的に処理されます。例えば:

message_box('File conversion complete')

[OK]ボタンが付いた標準ダイアログボックスの場合、または

balloon_tip('File conversion complete')

システムトレイポップアップバルーンの場合、または

format = button_box('Which file format do you want?', 'JPG', 'PNG')

そして、2つのボタンのいずれかを押し、次にformat'JPG'と等しい、または

response = text_query('What would you like to name the file?')

ボックスに入力して[OK]を押すと、response'bananas.txt'になります。他のコードは必要ありません。貧しいユーザーのための醜いコマンドラインプロンプトはありません。

ZenityとEasyGUIは答えの例として挙げました。それらは私が望むものに似ていますが、完璧ではないからです。

[ 以前にPythonフォーラム ]で質問されました]

38
endolith

EasyGUI は単一のファイルであり、Tkinterダイアログを操作する簡単な方法を提供しますが、それでも醜い非ネイティブTkinterダイアログです。

from easygui import msgbox
msgbox('Stuff')

Tkinter is ugly on UbuntuTKinter is ugly on Windows 7

以下を使用して簡単にインストールできます。

$ Sudo pip3 install --upgrade easygui

GitHubリポジトリ があり、 documentation はとても綺麗です。

以前は EasyGuiTtk と呼ばれるフォークもありましたが、残念ながらもう使用できません。

enter image description here

22
endolith

Zenity はLinuxおよび Windows で動作し、Pythonから直接呼び出すことができます。

import os
os.system('zenity --info --text="Stuff"')

ただし、質問ボックスからの戻り値は、操作のためにキャプチャする必要がありますが、これはより複雑であり、サブプロセスとの通信などについて学習する必要があります。

PyZenity フロントエンドと一緒に使用することもできます。これにより、戻り値のキャプチャが簡単になります。

from PyZenity import InfoMessage
InfoMessage('Stuff')

私はPyZenityをUbuntuとWindows XPの両方でテストしましたが、両方で動作します。

Zenity looks pretty good in GnomeZenity looks good in KDE, too, suprisinglyZenity in Windows has the wrong GTK theme

ZenityはGTK +のみであると読みましたが、GnomeとKDEで試したところ、どちらもネイティブに見えます。 Windowsへの移植はネイティブではありませんが、間違ったGTKテーマを使用しているためですか?

KDialogXdialog のような他のプログラムもあり、これらは同様のPythonフロントエンドにインターフェースされ、使用可能な実行可能ファイルをチェックして確認することができます)すべてが自動的に処理されるようにしますか?(KDialogの Rubyフロントエンド もあります。)

PyZenityがOS Xで動作するかどうかもわかりません。

14
endolith

TkInter は通常Pythonで提供されます

# File: hello1.py

from Tkinter import *

root = Tk()

w = Label(root, text="Hello, world!")
w.pack()

root.mainloop()

もっとネイティブな外観が必要な場合は、wxpythonなどをインストールする必要があります。

12
John La Rooy

PyMsgBoxモジュールはほぼ正確にこれを行います。 JavaScriptの命名規則に準拠したメッセージボックス関数に組み込みのtkinterモジュールを使用します: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/

10
Al Sweigart

背景の醜い空のウィンドウでendolithのtkMessageBox回答を拡張するには...

以下のコードは、背景ウィンドウなしでボックスをポップアップします。

import Tkinter, tkMessageBox
root = Tkinter.Tk()
root.withdraw()
tkMessageBox.showinfo("my dialog title", "my dialog message")

これは この記事 の最後にある便利なコメントから直接削除されています。 Jason(コメント者)とeffbot.orgに感謝します。

8
Russ

@ endolith、re:Windowsのzenity。

こんにちは、

「Zenity for Windows」を再パッケージ化し、正しいGTKテーマファイルを含めました。今はずっと良く見えます。 :)ダウンロードできるようになりました: http://www.placella.com/software/zenity/

スクリーンショット:

alt text
(ソース: placella.com

平和、ルスラン

6
Roccivic

wxPythonは最高のPython GUIライブラリ(IMO)であり、ネイティブウィジェットを使用します。

import wx
app = wx.PySimpleApp()
dialog = wx.MessageDialog(None, 'wxPython is awesome!', 'Dialog Box', wx.OK|wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
app.MainLoop()
5
FogleBird

別の可能性は tkMessageBox module です。これは明らかに標準ライブラリに組み込まれており、クロスプラットフォームですが、これは他のものよりも醜いです:

import tkMessageBox
tkMessageBox.showinfo('Title','Stuff') 

Tkinter is super ugly

3
endolith

pygletは、最も単純ではないかもしれませんが、別の代替手段です。そうは言っても、それはクロスプラットフォームであり、Pythonにのみ依存するため、外部依存関係はありません。その事実だけでも、他の人にそれを使用するのに十分な理由になる可能性があります。

また、マルチメディアも非常に簡単に処理できるため、画像やビデオなどを表示する場合に非常に便利です。

以下の例はドキュメントからのものです...

#!/usr/bin/python
import pyglet
window = pyglet.window.Window()
label = pyglet.text.Label('Hello, world',
                      font_name='Times New Roman',
                      font_size=36,
                      x=window.width/2, y=window.height/2,
                      anchor_x='center', anchor_y='center')

@window.event
def on_draw():
    window.clear()
    label.draw()

pyglet.app.run()
1
Foofy