純粋なPython GUIライブラリ?
質問
Pythonには多くのGUIライブラリがあります:tkinter、wxWidgets、pyGTKなど。しかし、これらすべてのGUIをインストールする必要があり、非常に重いため、前述のGUIライブラリを中継するエンドユーザーGUI Pythonアプリをデプロイするのは少し複雑です。
最近、私はpythonの組み込み ctypes
モジュールについて考えました。理論的には、Windowsでは ctypes
( windll.user32.CreateWindowEx
など)、MacOSではネイティブpyObjC、およびpyGTK / pyQtを使用する純粋なPython GUIライブラリを作成できますgnome / kde。そのようなライブラリは存在しますか?そうでない場合、この考えのどこが間違っていると思いますか?
解決
最小の労力と最良の結果を得るには、これらの既存のGUIライブラリを使用してアプリをデプロイするために必要なことを学習することです。
他のヒント
Python 2.7および3.1以降、Tkはより良くなります。
http://docs.python。 org / dev / whatsnew / 2.7.html#ttk-themed-widgets-for-tk
" Tcl / Tk 8.5には、基本的なTkウィジェットを再実装するテーマウィジェットのセットが含まれていますが、よりカスタマイズ可能な外観を備えているため、ネイティブプラットフォームのウィジェットにより似ています。このウィジェットセットは元々Tileと呼ばれていましたが、Tcl / Tckリリース8.5に追加されるとTtk(“テーマTk”)に名前が変更されました。
TkinterはPython標準配布の一部であり、デフォルトでインストールされます。そもそもグラフィカル表示があるすべてのpythonインストールでこれを見つけることを期待してください。
「pure python gui library」の概念最終的にはシステムレベルの呼び出しとウィジェットを使用するため、ctypesを使用する可能性がありますが、アイデアを実装し始めると最終的にwxPythonになるという事実は変わりません
主に間違っているのは、GTK、Tk、Wx、QT、およびそれらのilkのメーカーによってすでに行われている車輪を再発明していることです。純粋なpython GUIは技術的に実現可能であり、 anygui などのプロジェクトは同様のことを試みましたが、これを行うことで利益を得ます。
ネイティブツールキットは、基盤となるプラットフォーム(ネイティブダイアログなど)の違いをより適切にカバーします。これは、ツールキットを使用すると、プラットフォーム固有のコードはほとんど必要としない移植可能なアプリケーションを作成できることを意味します。このほとんどは、基礎となるツールキットによって抽象化されます。
Windowsでのpy2exeやLinuxメソッドなどの配布メカニズムにより、アプリケーションにDLLをバンドルできるため、必要なネイティブコンポーネントをドロップするインストーラーを作成できます。ただし、これを行うための一般的なクロスプラットフォームの方法は実際にはないため、プラットフォームごとに個別のインストーラーを維持する必要があります。
1つには、これらのライブラリはすべて異なる抽象化を使用しているため、それらすべてで機能するものはすべて、最小公分母の機能セットをサポートし、またはそれぞれを最大限に活用するよう努めます。
" heavyweight。"の意味がわからない
wxは各プラットフォームでネイティブコントロールを使用し、想像できるほどPythonで簡単に使用できます。結局のところ、GUIは複雑になる可能性があるため、GUI APIは複雑です。
wxは、ウィンドウを構築するのに必要な労力と、画面に表示されるものの品質が優れていると思います。あなたが自分で何かをうまく転がす可能性は低いと思います。
ホイールを発明しないということだと思います。それは機能しますが、なぜそれを行う必要がありますか?あなたが言及したすべてのGUIライブラリは安定しており、多かれ少なかれ防弾です。
純粋なpythonライブラリを実装するいくつかの実験があると想像できます。しかし、私はそれを見たことがありません。 GUIのすべては大変な作業であり、純粋なpythonライブラリにはそれほど多くの読者はいません。
多くの設定を必要としないように、tkinterの軽量なラッパーはどうですか? PySimpleGUI はtkinterの上に構築されているため、tkinterが実行されているすべての場所で実行されます。
tkinterと比較して使用することの利点は、必要なコードの量です。 PySimpleGUIプログラムは非常にコンパクトになる傾向があります。
利用可能な多くのウィジェットを使用したカスタムレイアウトを示す例です。
それを生成するコードは最後にあります。多くのコードのように見えるかもしれませんが、それだけです。同じことを行うには、ページとtkinterコードのページが必要です。
import PySimpleGUI as sg
sg.ChangeLookAndFeel('GreenTan')
# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
['&Help', '&About...'], ]
# ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue', justification='center', size=(10, 1))],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]
layout = [
[sg.Menu(menu_def, tearoff=True)],
[sg.Text('(Almost) All widgets in one Window!', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Here is some text.... and a place to enter text')],
[sg.InputText('This is my text')],
[sg.Frame(layout=[
[sg.Checkbox('Checkbox', size=(10,1)), sg.Checkbox('My second checkbox!', default=True)],
[sg.Radio('My first Radio! ', "RADIO1", default=True, size=(10,1)), sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')],
[sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
sg.Multiline(default_text='A second multi-line', size=(35, 3))],
[sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)),
sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
[sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
[sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
sg.Frame('Labelled Group',[[
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
sg.Column(column1, background_color='lightblue')]])],
[sg.Text('_' * 80)],
[sg.Text('Choose A Folder', size=(35, 1))],
[sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]]
window = sg.Window('Everything bagel', default_element_size=(40, 1), grab_anywhere=False).Layout(layout)
button, values = window.Read()