wxPythonは自由度が高く、ウィジェットが豊富なので、応用するといろいろなツールが作れます。
※当サンプルで、sample.pngを扱います。以下の画像を名前を付けて保存で、ファイル名を「sample.png」とし、スクリプトと同じフォルダに入れておいてください ※一応著作権フリーなんで自由に使ってください。
目次:
1.シンプルサンプル
2.Sizerを利用した配置
3.ウィジェットの表示/非表示
4.チェックボックス
5.ラジオボタン
6.色選択ダイアログ
7.メニューバーを使う
8.ファイルダイアログを使う
9.フォントダイアログを使う
10.コンボボックスを使う
11.MediaCtrlを使う
12.WebViewを使う
13.有効無効
14.ListCtrlでファイル一覧
15.Bitmap
16.ListCtrlでアイコン表示
17.StaticTextをボタンとして使う
18.右クリックメニュー
19.カーソルの変化
1.シンプルサンプル
import wx
def onButton(event):
#ボタンのクリックイベント
text = textctrl.GetValue() #TextCtrlの文字列を取得
wx.MessageBox(text + "さんこんにちは!","Hello",wx.ICON_INFORMATION) #メッセージボックスに表示
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #TextCtrlやButtonなどを設置するためのPanelを生成
textctrl = wx.TextCtrl(panel,-1,"名前",pos=(5,5),size=(300,-1)) #TextCtrl
button = wx.Button(panel,-1,"Click Me!",pos=(5,30)) #Button
button.Bind(wx.EVT_BUTTON,onButton) #クリックイベントを指定
frame.Show(True)
app.MainLoop()
2.Sizerを利用した配置
import wx
def onButton(event):
#ボタンのクリックイベント
text = textctrl.GetValue() #TextCtrlの文字列を取得
wx.MessageBox(text + "さんこんにちは!","Hello",wx.ICON_INFORMATION) #メッセージボックスに表示
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #TextCtrlやButtonなどを設置するためのPanelを生成
textctrl = wx.TextCtrl(panel,-1,"名前") #TextCtrl
button = wx.Button(panel,-1,"Click Me!") #Button
button.Bind(wx.EVT_BUTTON,onButton) #クリックイベントを指定
#レイアウト調整のためにSizerを使用
#BoxSizerを使うとpos=()などの設定もいらずに
#配置できる
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(textctrl,0,wx.EXPAND)
sizer.Add(button,0)
panel.SetSizer(sizer)
frame.Show(True)
app.MainLoop()
サンプル1と変わっていないように見えて、少し変わっています。TextCtrlはウィンドウサイズを変更しても横に引き延ばされるようになっています。
また、pos=()などの設定もしていません。
3.ウィジェットの表示 / 非表示
import wx
def onButton(event):
#ボタンのクリックイベント
textctrl.Show() #○○.Show()で表示 / 再表示 できる
sizer.Layout() #念のためSizerでレイアウトを再構成しておく。
#Sizerを利用していない場合この関数は不要。
def onButton2(event):
#ボタンのクリックイベント
textctrl.Hide() #○○.Hide()で非表示にできる
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #TextCtrlやButtonなどを設置するためのPanelを生成
textctrl = wx.TextCtrl(panel,-1,"名前") #TextCtrl
button = wx.Button(panel,-1,"表示") #Button
button.Bind(wx.EVT_BUTTON,onButton) #クリックイベントを指定
button2 = wx.Button(panel,-1,"非表示") #Button
button2.Bind(wx.EVT_BUTTON,onButton2) #クリックイベントを指定
#レイアウト調整のためにSizerを使用
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(textctrl,0,wx.EXPAND)
sizer.Add(button,0)
sizer.Add(button2,0)
panel.SetSizer(sizer)
frame.Show(True)
app.MainLoop()
表示 / 非表示を切り替えることができる
4.チェックボックス
import wx
def onButton(event):
text = "Xiaomi:" + str(checkbox.GetValue())
text += "\noppo:" + str(checkbox2.GetValue())
text += "\nSamsung:" + str(checkbox3.GetValue())
text += "\nSONY:" + str(checkbox4.GetValue())
text += "\nGoogle:" + str(checkbox5.GetValue())
wx.MessageBox(text,"タイトル",wx.ICON_INFORMATION)
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #TextCtrlやButtonなどを設置するためのPanelを生成
checkbox = wx.CheckBox(panel,-1,"Xiaomi") #チェックボックス
checkbox2 = wx.CheckBox(panel,-1,"oppo")
checkbox3 = wx.CheckBox(panel,-1,"Samsung")
checkbox4 = wx.CheckBox(panel,-1,"SONY")
checkbox5 = wx.CheckBox(panel,-1,"Google")
button = wx.Button(panel,-1,"確認") #ボタン
button.Bind(wx.EVT_BUTTON,onButton) #クリックイベントを設定する
sizer = wx.BoxSizer(wx.VERTICAL) #Sizerでレイアウト調整
sizer.Add(checkbox)
sizer.Add(checkbox2)
sizer.Add(checkbox3)
sizer.Add(checkbox4)
sizer.Add(checkbox5)
sizer.Add(button)
panel.SetSizer(sizer)
frame.Show(True)
app.MainLoop()
ラジオボタン
import wx
def onButton(event):
text = "Xiaomi:" + str(checkbox.GetValue())
text += "\noppo:" + str(checkbox2.GetValue())
text += "\nSamsung:" + str(checkbox3.GetValue())
text += "\nSONY:" + str(checkbox4.GetValue())
text += "\nGoogle:" + str(checkbox5.GetValue())
wx.MessageBox(text,"タイトル",wx.ICON_INFORMATION)
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #TextCtrlやButtonなどを設置するためのPanelを生成
checkbox = wx.RadioButton(panel,-1,"Xiaomi") #ラジオボタン
checkbox2 = wx.RadioButton(panel,-1,"oppo")
checkbox3 = wx.RadioButton(panel,-1,"Samsung")
checkbox4 = wx.RadioButton(panel,-1,"SONY")
checkbox5 = wx.RadioButton(panel,-1,"Google")
button = wx.Button(panel,-1,"確認") #ボタン
button.Bind(wx.EVT_BUTTON,onButton) #クリックイベントを設定する
sizer = wx.BoxSizer(wx.VERTICAL) #Sizerでレイアウト調整
sizer.Add(checkbox)
sizer.Add(checkbox2)
sizer.Add(checkbox3)
sizer.Add(checkbox4)
sizer.Add(checkbox5)
sizer.Add(button)
panel.SetSizer(sizer)
frame.Show(True)
app.MainLoop()
6.色選択ダイアログ
import wx
def onButton(event):
dialog = wx.ColourDialog(frame) #カラーダイアログを表示
if dialog.ShowModal()==wx.ID_OK:
color = dialog.GetColourData().GetColour()
lbl.SetForegroundColour(color) #ラベルの文字色に設定
frame.Refresh() #これがないと反映されない
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #TextCtrlやButtonなどを設置するためのPanelを生成
lbl = wx.StaticText(panel,-1,"テキストです。",pos=(5,5)) #ラベルを配置
button = wx.Button(panel,-1,"色を選択",pos=(5,30))
button.Bind(wx.EVT_BUTTON,onButton) #ボタンのクリックイベント
frame.Show(True)
app.MainLoop()
7.メニューバーを使う
import wx
import sys
def SelectMenu(event):
ID = event.GetId()
if ID == 0:
wx.MessageBox("あいうえお","あ",wx.ICON_WARNING)
elif ID == 1:
sys.exit()
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(350,150)) #ウィンドウを生成
#今回はウィジェットを配置しないためpanelを設置しない
menuBar = wx.MenuBar() #メニューバーを作成
FileMenu = wx.Menu() #新しくメニューを作成
FileMenu.Append(0,"あいうえお") #項目の追加
FileMenu.AppendSeparator() #セパレーターを追加
FileMenu.Append(1,"終了 (&X)") #項目の追加
menuBar.Append(FileMenu,"ファイル (&F)") #メニューバーにメニューを追加
frame.SetMenuBar(menuBar) #これがないとメニューバーが表示されない
frame.Bind(wx.EVT_MENU,SelectMenu) #メニューの選択イベント
frame.Show(True)
app.MainLoop()
8.ファイルダイアログを使う
import wx
import sys
def SelectMenu(event):
ID = event.GetId()
if ID == 0:
dialog = wx.FileDialog(frame,"Select File",wildcard="All Files (*.*) | *.*"
,style=wx.FD_OPEN |wx.FD_FILE_MUST_EXIST)
if dialog.ShowModal()==wx.ID_OK:
path = dialog.GetPath()
file = open(path,"r",encoding="UTF-8",errors="ignore")
textctrl.SetValue(file.read())
file.close()
elif ID == 1:
dialog = wx.FileDialog(frame,"Select File",wildcard="All Files (*.*) | *.*"
,style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
if dialog.ShowModal()==wx.ID_OK:
path = dialog.GetPath()
file = open(path,"w",encoding="UTF-8",errors="ignore")
file.write(textctrl.GetValue())
file.close()
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(400,300)) #ウィンドウを生成
textctrl = wx.TextCtrl(frame,-1,style=wx.TE_MULTILINE) #panelではなくframeに設置しちゃうことで全体に引きのばされる
menuBar = wx.MenuBar() #メニューバーを作成
FileMenu = wx.Menu() #新しくメニューを作成
FileMenu.Append(0,"開く") #項目の追加
FileMenu.AppendSeparator() #セパレーターを追加
FileMenu.Append(1,"保存") #項目の追加
menuBar.Append(FileMenu,"ファイル (&F)") #メニューバーにメニューを追加
frame.SetMenuBar(menuBar) #これがないとメニューバーが表示されない
frame.Bind(wx.EVT_MENU,SelectMenu) #メニューの選択イベント
frame.Show(True)
app.MainLoop()
ファイルの読み込みに関しては別の記事を参考にしてください。
Pythonでファイルを読み込む / 書き込む / エンコードを検出する
9.フォントダイアログを使う
import wx
import sys
def onButton(event):
dialog = wx.FontDialog(frame)
if dialog.ShowModal()==wx.ID_OK:
textctrl.SetFont(dialog.GetFontData().GetChosenFont())
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(400,300)) #ウィンドウを生成
panel = wx.Panel(frame,-1)
textctrl = wx.TextCtrl(panel,-1,size=(300,-1),pos=(5,5))
button = wx.Button(panel,-1,"フォントを変える",pos=(5,30))
button.Bind(wx.EVT_BUTTON,onButton)
frame.Show(True)
app.MainLoop()
10.コンボボックスを使う
import wx
import sys
def onButton(event):
wx.MessageBox(combobox.GetValue(),"aiueo",wx.ICON_INFORMATION)
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(400,300)) #ウィンドウを生成
panel = wx.Panel(frame,-1)
combobox = wx.ComboBox(panel,-1,choices=["Android","iOS","Harmony OS"],size=(300,-1),pos=(5,5))
#選択肢以外選択できないようにするには以下のように
#combobox = wx.ComboBox(panel,-1,choices=["Android","iOS","Harmony OS"],size=(300,-1),pos=(5,5),
# style=wx.CB_READONLY)
combobox.SetValue("Android")
button = wx.Button(panel,-1,"ボタン",pos=(5,30))
button.Bind(wx.EVT_BUTTON,onButton)
frame.Show(True)
app.MainLoop()
11.MediaCtrlを使う
これについては次のサイトで解説しております。
wxPythonで動画プレイヤーを作成してみる
wx.MediaCtrl
wx.MediaCtrl
12.WebViewを使う
import wx
import wx.html2
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,"サンプル",size=(500,300))
self.webveiw = wx.html2.WebView.New(self,-1,backend=wx.html2.WebViewBackendEdge)
self.webveiw.LoadURL("https://youtube.com")
app = wx.App(0)
MyFrame().Show(True)
app.MainLoop()
13.有効無効
import sys
import wx
class MyFrame(wx.Frame):
def onRadio1(self,event):
self.textctrl.Enable()
def onRadio2(self,event):
self.textctrl.Disable()
def __init__(self):
wx.Frame.__init__(self,None,-1,"タイトル")
panel = wx.Panel(self,-1)
radio1 = wx.RadioButton(panel,-1,"テキストボックスを有効にする")
radio1.Bind(wx.EVT_RADIOBUTTON,self.onRadio1)
self.textctrl = wx.TextCtrl(panel,-1,"")
radio2 = wx.RadioButton(panel,-1,"テキストボックスを無効にする")
radio2.Bind(wx.EVT_RADIOBUTTON,self.onRadio2)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(radio1)
sizer.Add(self.textctrl)
sizer.Add(radio2)
panel.SetSizer(sizer)
app = wx.App(0)
frame = MyFrame()
frame.Show(True)
app.MainLoop()
14.ListCtrlでファイル一覧
次の記事で紹介しております。
wxPythonで簡単なファイルマネージャーを作成する
wx.ListCtrl
wx.ListCtrl
15.Bitmap
import wx
import sys
def onButton(event):
wx.MessageBox("クリックされました!","ああ")
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(1000,700)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #パネルを作成
img = wx.StaticBitmap(panel,-1,wx.Bitmap("sample.png")) #これがBitmap(ラベル版)
img2 = wx.BitmapButton(panel,-1,wx.Bitmap("sample.png"),pos=(0,300)) #これがBitmap(ボタン版)
img2.Bind(wx.EVT_BUTTON,onButton)
frame.Show(True)
app.MainLoop()
BitmapButtonについてですが、つがいがってはほとんどButtonと同じです。
16.ListCtrlでアイコンの表示
import wx
import sys
def onItem(event):
index = listctrl.GetFirstSelected()
text = listctrl.GetItemText(index)
wx.MessageBox(text)
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(1000,700)) #ウィンドウを生成
listctrl = wx.ListCtrl(frame,-1,style=wx.LC_ICON)
listctrl.Bind(wx.EVT_LIST_ITEM_SELECTED,onItem)
imagelist = wx.ImageList(32,32) #イメージリスト
imagelist.Add(wx.Icon("sample.png",wx.BITMAP_TYPE_PNG))
imagelist.Add(wx.Icon("sample.png",wx.BITMAP_TYPE_PNG))
listctrl.AssignImageList(imagelist, wx.IMAGE_LIST_NORMAL) #割り当て
listctrl.InsertItem(0,"アイテム1",0)
listctrl.InsertItem(0,"アイテム2",0)
frame.Show(True)
app.MainLoop()
17.StaticTextをボタンとして使う
import wx
import sys
def onButton(event):
wx.MessageBox("おされた")
app = wx.App(0)
frame = wx.Frame(None,-1,"サンプルタイトル",size=(500,400)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #パネルを作成
button = wx.StaticText(panel,-1,"ボタン(風ラベル)", pos = (5,5)) #ラベル作成
button.SetBackgroundColour("YELLOW") #背景色の設定
button.Bind(wx.EVT_LEFT_DOWN, onButton) #クリックイベントを設定
frame.Show(True)
app.MainLoop()
18.右クリックメニュー
import wx
import sys
def showMenu(event):
frame.PopupMenu(menu)
def selectMenu(event):
Id = event.GetId()
if Id == 0:
wx.MessageBox("切り取り")
elif Id == 1:
wx.MessageBox("コピー")
elif Id == 2:
wx.MessageBox("貼り付け")
elif Id == 3:
wx.MessageBox("元に戻す")
app = wx.App(0)
frame = wx.Frame(None,-1,"右クリックしてー",size=(500,400)) #ウィンドウを生成
panel = wx.Panel(frame,-1) #パネルを作成
panel.Bind(wx.EVT_RIGHT_DOWN,showMenu)
menu = wx.Menu()
menu.Append(0,"切り取り")
menu.Append(1,"コピー")
menu.Append(2,"貼り付け")
menu.AppendSeparator()
menu.Append(3,"元に戻す")
menu.Bind(wx.EVT_MENU,selectMenu)
frame.Show(True)
app.MainLoop()
19.カーソルの変化
import wx import sys app = wx.App() frame = wx.Frame(None,-1,"カーソルがあれになります",size=(500,400)) #ウィンドウを生成 panel = wx.Panel(frame,-1) #パネルを作成 frame.SetCursor(wx.Cursor(wx.CURSOR_WAIT)) frame.Show(True) app.MainLoop()
ざっとしかチェックしてないんで、なんか不具合あったらコメントで。
さいごに
GUI開発は大変だけどなかなか楽しいものです。皆さんもこれを参考に、GUI開発を楽しんでいきませんか?












0 件のコメント:
コメントを投稿