目的
wxPythonモジュールを用いてテキスト入力を受け付けるウィンドウを作る。
作者はwxPython歴1時間強なので最適な手法であることは保証しない
真の目的()
- Python3では
input()
を用いればコマンドラインからユーザのテキスト入力を受けられる。 - ところがPython2ではこれは
input_raw()
という関数でなくてはいけない。
Python2系でもPython3系でも使えるGUIのテキスト取得手法がほしいなぁという背景があったりした。
ソースコード
TextCtrl
というWidgetがあるらしいが,公式のWiki?に使い方の説明がなかったのでノリで書いた。
Referenceはある。あるがこれだと経験1時間の初心者では組み方のイメージがわかない。
なんやかんやあってClass実装だがこんな感じにできた。
以下の記事さんのおかげで大変助かりました。ありがとうございました。
https://nippori30.hatenablog.com/entry/2017/09/24/220000
import wx
class GUIinput:
def __init__(self):
self.frame = wx.Frame(None, -1, "textbox")
self.frame.SetTitle('Write Text Here')
panel_ui = wx.Panel(self.frame, -1, pos=(50, 50), size=(100, 50))
# message
self.frame.label = wx.StaticText(panel_ui, -1, 'Write some message here', pos=(10, 10))
# text box
self.frame.box = wx.TextCtrl(panel_ui, -1, pos=(10, 30),style=wx.TE_PROCESS_ENTER)
self.frame.box.Bind(wx.EVT_TEXT_ENTER, self.Clicked) #text enter
# button
btn = wx.Button(panel_ui, -1, 'OK', pos=(10, 60))
btn.Bind(wx.EVT_BUTTON, self.Clicked)
self.frame.Show(True)
def Clicked(self,event):
self.text = self.frame.box.GetValue()
self.frame.Close(True)
app = wx.App()
frame = GUIinput()
app.SetTopWindow(frame.frame)
app.MainLoop()
print(frame.text)
見た目
なんかサイズ指定とか位置指定がガバイ。
Objectの高さの間隔は大体20~30pixでやればいいと思う。
疑問
- クラス実装じゃなきゃダメなのか
- もっと簡単にできないのか
- GUI手動で配置できないのか…