[ 参照リンク:Python | a + = bは必ずしもa = a + bとは限りません](https://www.imangodoc.com/224.html)
共通のGUIフレームワーク
wxPython
wxPythonをインストールします
pip install -U wxPython
C:\Users> pip install -U wxPython
Collecting wxPython
Downloading https://files.pythonhosted.org/packages/34/41/e0e109a72966f596a5b93123d94eaabd53509ef6766fa3321b4bfadbbb14/wxPython-4.0.3-cp37-cp37m-win_amd64.whl (22.7MB)
100% |████████████████████████████████| 22.7MB 819kB/s
Collecting PyPubSub (from wxPython)
Downloading https://files.pythonhosted.org/packages/ab/9e/3b50915d3346971aaa49074425788598ee4907e67c097e013f1a862bd45c/Pypubsub-4.0.0-py3-none-any.whl (63kB)
100% |████████████████████████████████| 71kB 1.5MB/s
Requirement already satisfied, skipping upgrade: six in d:\python\lib\site-packages (from wxPython) (1.11.0)
Installing collected packages: PyPubSub, wxPython
Successfully installed PyPubSub-4.0.0 wxPython-4.0.3
wxPythonの2つの基本オブジェクト、アプリケーションオブジェクトとトップレベルウィンドウ:
アプリケーションオブジェクトは、wxPythonプログラムの推進力であるメインイベントループを管理します。アプリケーションオブジェクトがない場合、wxPythonアプリケーションは実行されません。トップレベルウィンドウは通常、最も重要なデータを管理し、制御してユーザーに提示するために使用されます。
wx.Appのサブクラスを作成します
サブクラスwx.Appを定義します。定義サブクラスにOnInit()初期化メソッドを記述します。プログラムの主要部分にこのクラスのインスタンスを作成し、アプリケーションインスタンスのMainLoopメソッドを呼び出します。このメソッドは、プログラムの制御をwxPythonに移します
import wx#wxPythonをインポートします
class App(wx.App):
def OnInit(self):#初期化メソッド
frame = wx.Frame(parent = None、title = '最初のウィンドウプログラム')#トップレベルウィンドウを作成します
frame.Show()#ウィンドウを表示
return True#戻り値(ウィンドウに戻り、画面に表示)
if name == 'main':
app = App()#Appクラスをインスタンス化します
app.MainLoop()#AppクラスのMainLoop()メインループメソッドを呼び出します
結果:
wx.Appを直接使用する
通常、システムにウィンドウが1つしかない場合は、wx.Appのサブクラスを作成せずにwx.Appを直接使用できます。このクラスは、基本的なOnInit()初期化メソッドを提供します。
import wx#wxPythonをインポートします
app = wx.App()#wx.Appクラスを初期化します
frame = wx.Frame(None、title = '最初のウィンドウプログラム')#トップレベルウィンドウを定義する
frame.Show()#ウィンドウを表示
app.MainLoop()#wx.AppクラスのMainLoop()メインループメソッドを呼び出します
結果:
wx.Frameを使用する
wx.Frame(parent=None, id=-1, title="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE, name="frame")
parent:フレームの親ウィンドウ。トップレベルウィンドウの場合、この値はNoneid:新しいウィンドウのwxPythonID番号です。通常、-1に設定すると、wxPythonが新しいIDtitle:ウィンドウタイトルpos:画面上の新しいウィンドウの左上隅の位置を指定するwx.Pointオブジェクトを自動的に生成します。グラフィカルユーザーインターフェイスプログラムでは、通常(0,0)がディスプレイの左上隅です。このデフォルト値(-1、-1)は、システムがウィンドウのサイズを決定できるようにします。ウィンドウの初期サイズを指定するwx.Pythonオブジェクト、このデフォルト値(-1、-1)は、システムがウィンドウの初期サイズを決定できるようにします。サイズスタイル:ウィンドウのタイプを指定する定数。 OR操作を使用してそれらを組み合わせることができます。 name:フレームの内部名。このウィンドウを見つけるためにそれを使用することができます
サンプルコード:
import wx#wxPythonをインポートします
class MyFrame(wx.Frame):
def init(self, parent, id):
wx.Frame .__ init __(self、parent、id、title = "Create Frame"、pos =(100、100)、size =(300、300))
if name == 'main':
app = wx.App()#アプリケーションを初期化します
frame = MyFrame(parent = None、id = 1)#インスタンスMyFrameクラスとパスパラメータ
frame.Show()#ウィンドウを表示
app.MainLoop()#MainLoop()メインループメソッドを呼び出す
結果:
共通のコントロール
StaticTextテキストクラス
ウィンドウを作成した後、ウィンドウにいくつかのコントロールを追加できます。いわゆるコントロールは、頻繁に使用されるボタン、テキスト、入力ボックス、ラジオボタンなどです。
wx.StaticText(parent, id, lable, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="staticText")
親:親ウィジェットID:識別子。 -1を使用して、一意のラベルラベルを自動的に作成します。静的コントロール位置に表示されるテキストコンテンツ:ウィジェットサイズの位置であるwx.PointまたはPythonタプル:wx.SizeまたはPythonタプル、ウィジェットスタイルのサイズです:スタイルタグ名:オブジェクト名
コード例:wx.StaticTextを使用してZen ofPythonを出力します
import wx
class MyFrame(wx.Frame):
def init(self, parent, id):
wx.Frame .__ init __(self、parent、id、title = "Create StaticText class"、
pos=(100, 100), size=(600, 400))
panel = wx.Panel(self)#描画ボードを作成します
#タイトルを作成してフォントを設定する
title = wx.StaticText(panel、label = 'The Zen of Python-Tim Peters'、pos =(100、20))
font = wx.Font(16, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
title.SetFont(font)
#テキストを作成する
wx.StaticText(panel、label = '美しい方が醜いより良い'、pos =(50,50))
wx.StaticText(panel、label = '明確な方が不明瞭よりも優れている'、pos =(50、70))
wx.StaticText(panel、label = '単純な方が複雑な方が良い'、pos =(50,90))
wx.StaticText(panel、label = '複雑な方が乱雑よりも優れている'、pos =(50,110))
wx.StaticText(panel、label = 'フラットはネストよりも優れています'、pos =(50、130))
wx.StaticText(panel、label = '間隔はコンパクトよりも優れています'、pos =(50、150))
wx.StaticText(panel、label = '読みやすさは非常に重要です'、pos =(50、170))
wx.StaticText(panel、label = '特殊なケースの実用性を装ってでも、これらのルールに違反してはなりません'、pos =(50,190))
wx.StaticText(panel、label = 'これを行う必要があることが確実でない限り、すべてのエラーを含めないでください'、pos =(50、210))
wx.StaticText(panel、label = '複数の可能性がある場合は、推測しようとしないでください'、pos =(50、230))
wx.StaticText(panel、label = 'しかし、1つ、できれば唯一の明白な解決策を見つけようとします'、pos =(50、250))
wx.StaticText(panel、label = 'Pythonの父ではないため、これは簡単ではありませんが'、pos =(50、270))
wx.StaticText(panel、label = 'やらないよりはやるほうがいいかもしれませんが、考えずにやらないほうがいいです'、pos =(50、290))
wx.StaticText(panel、label = '計画を人々に説明できない場合、それは間違いなく良い計画ではありません。その逆も同様です'、pos =(50、310))
wx.StaticText(panel、label = '名前空間は素晴らしいアイデアです。もっと使用する必要があります'、pos =(50、330))
if name == 'main':
app = wx.App()#アプリケーションを初期化します
frame = MyFrame(parent = None、id = -1)#インスタンスMyFrameクラスとパスパラメータ
frame.Show()#ウィンドウを表示
app.MainLoop()#メインループメソッドを呼び出す
上記のコードでは、panel = wx.Panel(self)を使用して描画ボードを作成し、panelを親クラスとして使用してから、コンポーネントをフォームに配置します。さらに、wx.Fontクラスを使用してフォントを設定します。フォントインスタンスを作成するには、次のコンストラクターを使用する必要があります。
wx.Font(pointSize, family, style, weight, underline=False, faceName="", encoding=wx.FONTENCODING_DEFAULT)
pointSize:ポイントファミリーのフォントの整数サイズ:フォントスタイルの実際の名前を知らなくてもフォントをすばやく指定するために使用されます:フォントが傾斜しているかどうかを指定するために使用されます:フォントの下線の可視性を指定します:Windowsでのみ有効です、値がTrueの場合は下線が引かれ、Falseの場合は下線が引かれません。faceName:フォント名を指定しますencoding:実行して複数のエンコーディングの1つを選択します。ほとんどの場合、デフォルトのエンコーディングを使用できます。
結果:
TextCtrl入力テキスト
wx.TextCtrl(parent, id, value="", pos=wx.DefaultPosition, size=wx.DefaultSize,style=0,validator=wx.DefaultValidator name=wx.TextCtrlNameStr)
style:単一行wx.TextCtrlのスタイル。値は次のとおりです。
wx.TE_CENTER:コントロール内のテキストが中央に配置されますwx.TE_LEFT:コントロール内のテキストが左揃えになりますwx.TE_NOHIDESEL:テキストは常に強調表示されます(Windowsの場合のみ) .TE_PROCESS_ENTER:パラメーターが変更された場合、ユーザーがコントロールのEnterキーを押すと、テキスト入力イベントがトリガーされます。それ以外の場合、キーイベントはテキストコントロールまたはダイアログボックスwx.TE_PROCESS_TABによって管理されます。このスタイルが指定されている場合、Tabキーが押されたときに通常の文字イベントが作成されます(通常、タブ文字がテキストに挿入されます)。それ以外の場合、タブはダイアログボックスによって管理され、通常はコントロールを切り替えます。wx.TE_READONLY:テキストコントロールは読み取り専用であり、ユーザーはテキストを変更できません。wx.TE_RIGHT:コントロール内のテキストは右揃えになります。値:コントロールバリデーターに表示される最初のテキスト:受け入れられるデータのみを入力できるようにするためにデータをフィルタリングするためによく使用されます
サンプルコード:
import wx
class MyFrame(wx.Frame):
def init(self, parent, id):
wx.Frame .__ init __(self、parent、id、title = "Create TextCtrl class"、size =(400、300))
#パネルの作成
panel = wx.Panel(self)
#テキストと入力ボックスを作成する
self.title = wx.StaticText(panel、label = "ユーザー名とパスワードを入力してください"、pos =(140、20))
self.label_user = wx.StaticText(panel、label = "Username:"、pos =(50、50))
self.text_user = wx.TextCtrl(panel, pos=(100, 50), size=(235, 25), style=wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel、pos =(50、90)、label = "password:")
self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
if name == 'main':
app = wx.App()#アプリケーションを初期化します
frame = MyFrame(parent = None、id = -1)#インスタンスMyFrameクラスとパスパラメータ
frame.Show()#ウィンドウを表示
app.MainLoop()#メインループメソッドを呼び出す
結果:
ボタンボタンクラス
wx.Button(parent, id, lable, pos, size=wx.DefaultSize, style=0, validator, name="button")
wx.Buttonとwx.TextCtrlのパラメーターは基本的に同じであり、パラメーターラベルはボタンに表示されるテキストです。
サンプルコード:
import wx
class MyFrame(wx.Frame):
def init(self, parent, id):
wx.Frame .__ init __(self、parent、id、title = "Create TextCtrl class"、size =(400、300))
panel = wx.Panel(self)#パネルを作成します
#テキストと入力ボックスを作成する
self.title = wx.StaticText(panel、label = "ユーザー名とパスワードを入力してください"、pos =(140、20))
self.label_user = wx.StaticText(panel、label = "Username:"、pos =(50、50))
self.text_user = wx.TextCtrl(panel, pos=(100, 50), size=(235, 25), style=wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel、pos =(50、90)、label = "password:")
self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
self.bt_confirm = wx.Button(panel、label = 'OK'、pos =(105、130))#「OK」ボタンを作成
self.bt_cancel = wx.Button(panel、label = 'キャンセル'、pos =(195、130))#「キャンセル」ボタンを作成します
if name == 'main':
app = wx.App()#初期化
frame = MyFrame(parent = None、id = -1)#インスタンスMyFrameクラスとパスパラメータ
frame.Show()#ウィンドウを表示
app.MainLoop()#メインループメソッドを呼び出す
結果:
バインドされたイベント
ボタンをクリックすると、特定の判断を実行したり、プロンプトを表示したりするなど、システムがそれに応じて応答するようにする必要があります。Bind()メソッドを使用して、イベントハンドラーを特定のイベントにバインドできます。
bt_confirm.Bind(wx.EVT_BUTTON, OnclickSubmit)
サンプルコード:
[OK]をクリックして、パスワードが正しいかどうかなどを確認します。
import wx
class MyFrame(wx.Frame):
def init(self, parent, id):
wx.Frame .__ init __(self、parent、id、 'User Login'、size =(400、300))
#パネルを作成
panel = wx.Panel(self)
#「OK」ボタンと「キャンセル」ボタンを作成し、イベントをバインドします
self.bt_confirm = wx.Button(panel、label = 'OK')
self.bt_confirm.Bind(wx.EVT_BUTTON, self.OnclickSubmit)
self.bt_cancel = wx.Button(panel、label = 'キャンセル')
self.bt_cancel.Bind(wx.EVT_BUTTON, self.OnclickCancel)
#左揃えでテキストを作成
self.title = wx.StaticText(panel、label = "ユーザー名とパスワードを入力してください")
self.label_user = wx.StaticText(panel、label = "ユーザー名:")
self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel、label = "Password:")
self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
#コンテナを追加します。コンテナ内のコントロールは水平方向に並べて配置されます
hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
hsizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5)
hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5)
hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5)
#コンテナを追加します。コンテナ内のコントロールは垂直に並べて配置されます
vsizer_all = wx.BoxSizer(wx.VERTICAL)
vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER,
border=15)
vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP, border=15)
panel.SetSizer(vsizer_all)
def OnclickSubmit(self, event):
"" "[OK]ボタンをクリックして、メソッド" ""を実行します。
message = ""
username = self.text_user.GetValue()#入力したユーザー名を取得します
password = self.text_password.GetValue()#入力したパスワードを取得します
ユーザー名== ""またはパスワード== ""の場合:#ユーザー名またはパスワードが空かどうかを判断します
メッセージ= 'ユーザー名またはパスワードを空にすることはできません'
elif username == 'admin' and password == '123456':#ユーザー名とパスワードは正しい
メッセージ=「ログインに成功しました」
else:
message = 'ユーザー名とパスワードが一致しません'#ユーザー名またはパスワードが間違っています
wx.MessageBox(message)#プロンプトボックスをポップアップします
def OnclickCancel(self、event):#キャンセルするイベントがクリックされない場合、エラーが報告されます
"" "キャンセルボタンをクリックしてメソッド" ""を実行します
self.text_user.SetValue( "")#入力したユーザー名をクリアします
self.text_password.SetValue( "")#入力したパスワードをクリアします
if name == 'main':
app = wx.App()#初期化
frame = MyFrame(parent = None、id = -1)#インスタンスMyFrameクラスとパスパラメータ
frame.Show()#ウィンドウを表示
app.MainLoop()#メインループメソッドを呼び出す
結果:
Recommended Posts