teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2018/07/17 07:37

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -66,8 +66,8 @@
66
66
 
67
67
  適材適所かと。私なら画面項目(パネル、ラベル、ボタン)はローカル変数にはしないです。
68
68
 
69
- 0. イベント…同じ種類の物(ラベル、テキストボックス)などに対して同じ処理をたい時。
69
+ 0. イベント…同じ種類の物(ラベル、テキストボックス)などに対してイベント発生時に同じ処理を行いたい時。
70
- 引数にイベントオブジェクトが渡されるので、同じ処理をできます。
70
+ 引数にイベント発生元が渡されるので、同じ処理をできます。
71
71
 
72
72
  0. インスタンス変数…イベント発生元以外の項目に対してなんらかの処理を行いたい時(質問文の場合)
73
73
 

2

from functools import partial

2018/07/17 07:37

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -58,4 +58,77 @@
58
58
  if __name__ == "__main__":
59
59
  main()
60
60
 
61
- ```
61
+ ```
62
+
63
+ ---
64
+
65
+ > クラス内でメソッド間でボタン等の値を取得させようと思ったら、ローカル変数のような書き方は、始めからしない方が良いのでしょうか?
66
+
67
+ 適材適所かと。私なら画面項目(パネル、ラベル、ボタン)はローカル変数にはしないです。
68
+
69
+ 0. イベント…同じ種類の物(ラベル、テキストボックス)などに対して同じ処理をしたい時。
70
+ 引数にイベントオブジェクトが渡されるので、同じ処理をできます。
71
+
72
+ 0. インスタンス変数…イベント発生元以外の項目に対してなんらかの処理を行いたい時(質問文の場合)
73
+
74
+ 回答には書きませんでしたが、3,functools#partialを使った手法もあります。
75
+
76
+ ```Python
77
+ # -*- coding: utf-8 -*-
78
+ import wx
79
+ import os
80
+ from functools import partial
81
+
82
+ class MainFrame(wx.Frame):
83
+
84
+ def __init__(self):
85
+ wx.Frame.__init__(self, None, wx.ID_ANY, 'logplot')
86
+ panel = wx.Panel(self, wx.ID_ANY)
87
+ panel.SetBackgroundColour(wx.Colour(128, 128, 128))
88
+
89
+ #button
90
+ button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'Line/Log')
91
+ button_1.Bind(wx.EVT_TOGGLEBUTTON, self.button_click)
92
+
93
+ # comboboxとbuttonの宣言順を変えている点に注意
94
+ #combobox
95
+ combobox_1 = wx.ComboBox(panel, wx.ID_ANY, 'select ScanList', choices = ("1","2","3"), style = wx.CB_READONLY)
96
+ combobox_1.Bind(wx.EVT_TEXT, partial(self.Ontext, btn=button_1))
97
+
98
+ #Text
99
+ text_1 = wx.StaticText(panel, wx.ID_ANY, )
100
+
101
+ vbox_1 = wx.BoxSizer(wx.VERTICAL)
102
+ vbox_1.Add(combobox_1, 0, wx.LEFT | wx.RIGHT, 10)
103
+ vbox_1.Add(button_1, 0, wx.RIGHT, 10)
104
+ vbox_1.Add(text_1, 0, wx.RIGHT, 10)
105
+
106
+ panel.SetSizer(vbox_1)
107
+
108
+ def button_click(self, event):
109
+ button_1 = event.GetEventObject()
110
+ if button_1.GetValue():
111
+ button_1.SetLabel("Log")
112
+ else:
113
+ button_1.SetLabel("Line")
114
+ print(button_1.GetValue())
115
+
116
+ def Ontext(self, event, btn):
117
+ print(btn.GetValue())
118
+ combobox_1 = event.GetEventObject()
119
+ print(combobox_1.GetValue())
120
+
121
+
122
+ #モジュール空間の汚染を避けるためにスコープを切る
123
+ def main() -> None:
124
+ app = wx.App()
125
+ MainFrame().Show()
126
+ app.MainLoop()
127
+
128
+
129
+ if __name__ == "__main__":
130
+ main()
131
+
132
+ ```
133
+ ◇参考情報
134
+ [functools.partial](https://docs.python.jp/3/library/functools.html#functools.partial)

1

追記

2018/07/17 07:35

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -2,7 +2,7 @@
2
2
  button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'Line/Log')
3
3
  ```
4
4
 
5
- スコープを変更してローカル変数からインスタンス変数にすればよいかと。
5
+ 変数:`button_1`のスコープをローカル変数からインスタンス変数に変更すればよいかと。
6
6
 
7
7
  ```Python
8
8
  # -*- coding: utf-8 -*-