質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3595閲覧

【wxpython】コンボボックスとトグルボタンの値をテキストボックスに表示させたい。

yamatail

総合スコア77

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/05 05:47

編集2018/07/17 06:41

前提・実現したいこと

wxpythonでGUiを作成中です。

GUIにはコンボボックスとトグルボタンとStaticTextを配置しました。

コンボボックスでOntextイベントを行う際
コンボボックス内のテキストと同時にトグルボタンのステータス(TRUE or FALSE)も取得させたいです。

以下、コードになります。

python

1import wx 2import os 3 4class MainFrame(wx.Frame): 5 6 def __init__(self): 7 wx.Frame.__init__(self, None, wx.ID_ANY, 'logplot') 8 panel = wx.Panel(self, wx.ID_ANY) 9 panel.SetBackgroundColour(wx.Colour(128, 128, 128)) 10 11 #combobox 12 combobox_1 = wx.ComboBox(panel, wx.ID_ANY, 'select ScanList', choices = ("1","2","3"), style = wx.CB_READONLY) 13 combobox_1.Bind(wx.EVT_TEXT, self.Ontext) 14 15 #button 16 button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'Line/Log') 17 button_1.Bind(wx.EVT_TOGGLEBUTTON, self.button_click) 18 19 #Text 20 text_1 = wx.StaticText(panel, wx.ID_ANY, ) 21 22 vbox_1 = wx.BoxSizer(wx.VERTICAL) 23 vbox_1.Add(combobox_1, 0, wx.LEFT | wx.RIGHT, 10) 24 vbox_1.Add(button_1, 0, wx.RIGHT, 10) 25 vbox_1.Add(text_1, 0, wx.RIGHT, 10) 26 27 panel.SetSizer(vbox_1) 28 29 def button_click(self, event): 30 button_1 = event.GetEventObject() 31 if button_1.GetValue(): 32 button_1.SetLabel("Log") 33 else: 34 button_1.SetLabel("Line") 35 print(button_1.GetValue()) 36 37 def Ontext(self, event): 38 #print(button_1.GetValue()) 39 combobox_1 = event.GetEventObject() 40 print(combobox_1.GetValue()) 41 42if __name__ == '__main__': 43 app = wx.App() 44 MainFrame().Show() 45 app.MainLoop() 46 47

###分からないこと
・statictextにコンボボックスの値とトグルボタンの値を受け渡す方法
イメージは、Ontext()イベントでコンボボックスをマウスのホイールでころころするとその都度コンボボックスのテキスト値とトグルボタンの値を読み取って表示させることです。

補足情報(FW/ツールのバージョンなど)

windows 7 professional 64bit
python3.6
wxpython
matplotlib

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python

1button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'Line/Log')

変数:button_1のスコープをローカル変数からインスタンス変数に変更すればよいかと。

Python

1# -*- coding: utf-8 -*- 2import wx 3import os 4 5class MainFrame(wx.Frame): 6 7 def __init__(self): 8 wx.Frame.__init__(self, None, wx.ID_ANY, 'logplot') 9 panel = wx.Panel(self, wx.ID_ANY) 10 panel.SetBackgroundColour(wx.Colour(128, 128, 128)) 11 12 #combobox 13 combobox_1 = wx.ComboBox(panel, wx.ID_ANY, 'select ScanList', choices = ("1","2","3"), style = wx.CB_READONLY) 14 combobox_1.Bind(wx.EVT_TEXT, self.Ontext) 15 16 #button 17 self.button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'Line/Log') 18 self.button_1.Bind(wx.EVT_TOGGLEBUTTON, self.button_click) 19 20 #Text 21 text_1 = wx.StaticText(panel, wx.ID_ANY, ) 22 23 vbox_1 = wx.BoxSizer(wx.VERTICAL) 24 vbox_1.Add(combobox_1, 0, wx.LEFT | wx.RIGHT, 10) 25 vbox_1.Add(self.button_1, 0, wx.RIGHT, 10) 26 vbox_1.Add(text_1, 0, wx.RIGHT, 10) 27 28 panel.SetSizer(vbox_1) 29 30 def button_click(self, event): 31 button_1 = event.GetEventObject() 32 if button_1.GetValue(): 33 button_1.SetLabel("Log") 34 else: 35 button_1.SetLabel("Line") 36 print(button_1.GetValue()) 37 38 def Ontext(self, event): 39 print(self.button_1.GetValue()) 40 combobox_1 = event.GetEventObject() 41 print(combobox_1.GetValue()) 42 43 44#モジュール空間の汚染を避けるためにスコープを切る 45def main() -> None: 46 app = wx.App() 47 MainFrame().Show() 48 app.MainLoop() 49 50 51if __name__ == "__main__": 52 main() 53

クラス内でメソッド間でボタン等の値を取得させようと思ったら、ローカル変数のような書き方は、始めからしない方が良いのでしょうか?

適材適所かと。私なら画面項目(パネル、ラベル、ボタン)はローカル変数にはしないです。

  1. イベント…同じ種類の物(ラベル、テキストボックス)などに対してイベント発生時に同じ処理を行いたい時。

引数にイベント発生元が渡されるので、同じ処理をできます。

  1. インスタンス変数…イベント発生元以外の項目に対してなんらかの処理を行いたい時(質問文の場合)

回答には書きませんでしたが、3,functools#partialを使った手法もあります。

Python

1# -*- coding: utf-8 -*- 2import wx 3import os 4from functools import partial 5 6class MainFrame(wx.Frame): 7 8 def __init__(self): 9 wx.Frame.__init__(self, None, wx.ID_ANY, 'logplot') 10 panel = wx.Panel(self, wx.ID_ANY) 11 panel.SetBackgroundColour(wx.Colour(128, 128, 128)) 12 13 #button 14 button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'Line/Log') 15 button_1.Bind(wx.EVT_TOGGLEBUTTON, self.button_click) 16 17 # comboboxとbuttonの宣言順を変えている点に注意 18 #combobox 19 combobox_1 = wx.ComboBox(panel, wx.ID_ANY, 'select ScanList', choices = ("1","2","3"), style = wx.CB_READONLY) 20 combobox_1.Bind(wx.EVT_TEXT, partial(self.Ontext, btn=button_1)) 21 22 #Text 23 text_1 = wx.StaticText(panel, wx.ID_ANY, ) 24 25 vbox_1 = wx.BoxSizer(wx.VERTICAL) 26 vbox_1.Add(combobox_1, 0, wx.LEFT | wx.RIGHT, 10) 27 vbox_1.Add(button_1, 0, wx.RIGHT, 10) 28 vbox_1.Add(text_1, 0, wx.RIGHT, 10) 29 30 panel.SetSizer(vbox_1) 31 32 def button_click(self, event): 33 button_1 = event.GetEventObject() 34 if button_1.GetValue(): 35 button_1.SetLabel("Log") 36 else: 37 button_1.SetLabel("Line") 38 print(button_1.GetValue()) 39 40 def Ontext(self, event, btn): 41 print(btn.GetValue()) 42 combobox_1 = event.GetEventObject() 43 print(combobox_1.GetValue()) 44 45 46#モジュール空間の汚染を避けるためにスコープを切る 47def main() -> None: 48 app = wx.App() 49 MainFrame().Show() 50 app.MainLoop() 51 52 53if __name__ == "__main__": 54 main() 55

◇参考情報
functools.partial

投稿2018/07/17 07:00

編集2018/07/17 07:37
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamatail

2018/07/17 07:18

すごい。出来ました! クラス内でメソッド間でボタン等の値を取得させようと思ったら、ローカル変数のような書き方は、始めからしない方が良いのでしょうか?
yamatail

2018/07/17 07:44

ご丁寧にありがとうございました。 大変助かりました。 functools.partialも勉強しようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問