wxPythonで複数のウィンドウを表示する

2021年6月6日日曜日

Python wxPython

t f B! P L

今回やること

wxPythonで複数のウィンドウを表示させる方法を紹介します。
そのままwx.Frameで複数表示させることもできるし、wx.Dialogで複数表示させることもできます。

そのまま2つ表示させてみる

import wx
app = wx.App(False)
frame1 = wx.Frame(None,-1,"ウィンドウ1")
panel1 = wx.Panel(frame1,-1)
lbl = wx.StaticText(panel1,-1,"ウィンドウ1のパネルです")
frame1.Show(True)
frame2 = wx.Frame(None,-1,"ウィンドウ2")
panel2 = wx.Panel(frame2,-1)
btn = wx.Button(panel2,-1,"ウィンドウ2のボタンです")
frame2.Show(True)
app.MainLoop()
複数のウィンドウを表示させる

このように連続してウィンドウを表示させるようにしました。
app.MainLoop()は一番最後にしないといけません。

ボタンのクリック動作で表示させる

import wx
class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,"メインウィンドウ")
        panel = wx.Panel(self,-1)
        button = wx.Button(panel,-1,"もう一つのウィンドウを表示")
        button.Bind(wx.EVT_BUTTON,self.OnButton)  #クリックされたらOnButtonに渡すようにする
        self.Show(True)
    def OnButton(self,event):
        #ウィンドウの表示
        #多重起動を防止
        if self.FindWindowByName('もうひとつのウィンドウ') is None:
            SubFrame()
        else:
            wx.MessageBox("既に表示されてます")
class SubFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,"もうひとつのウィンドウ")
        panel = wx.Panel(self,-1)
        lbl = wx.StaticText(panel,-1,"もうひとつのウィンドウです",pos=(20,20))
        self.Show(True)
if __name__ == "__main__":
    app = wx.App(0)
    MainFrame()
    app.MainLoop()

ボタンを押すことで、新しいウィンドウが表示されるようになりました。また、多重起動も防止することができました。

ダイアログを表示

ウィンドウではなくダイアログを表示させます。ダイアログが表示されると、後ろのメインウィンドウをいじれなくなります。
ここが、普通のウィンドウとの違いです。

import wx
class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,"メインウィンドウ")
        panel = wx.Panel(self,-1)
        button = wx.Button(panel,-1,"ダイアログを表示")
        button.Bind(wx.EVT_BUTTON,self.OnButton)  #クリックされたらOnButtonに渡すようにする
        self.Show(True)
    def OnButton(self,event):
        SubFrame() #ダイアログを表示させる
class SubFrame(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self,None,-1,"ダイアログ")
        panel = wx.Panel(self,-1)
        lbl = wx.StaticText(panel,-1,"ダイアログです",pos=(20,20))
        self.ShowModal() #裏のウィンドウをいじれなくるために、ShowModal()にしている
if __name__ == "__main__":
    app = wx.App(0)
    MainFrame()
    app.MainLoop()
複数のウィンドウを表示

見た目はさっきのと似てますが、裏のメインウィンドウがいじれなくなるところが違います。

どのような場面で使えるか

「設定」のダイアログを出すときや、単純にもうひとつのツールを起動するために、もうひとつのウィンドウを呼び出すなどに使えます。


動作環境
Python 3.9.1
Windows 10
64bit
wxPython 4.1.1a1

おすすめ:

wxPythonの今スグ使えるサンプル集18個!GUI開発をマスターしよう!

今回はwxPythonのサンプルを18個紹介したいと思います。
wxPythonはウィジェットが豊富で自由度が高いので、応用するといろいろなツールが作成できます。


よくわからないことや、感想などはコメントお願いします!

このブログを検索

要望について

ブログのレイアウトやテーマについての提案をいただきました。現在qooqテーマを適応中です。 語尾を自動でつけるプログラムを作りたいという要望をいただきました。是非紹介したいですがどの言語でどのようなプログラムかなど、お問い合わせフォームで詳しく教えてください!

最近の出来事

最近の出来事
寿司打お勧め75位♪(練習モードだけど)

アンケート

Welcome!

「プログラミング独学ブログ」へようこそ。 Yakinyといいます。幅広い範囲で投稿していますので、ぜひ過去の記事も見てみてください!!コメントも大歓迎です!更新がとまってしまって申し訳ございません

お問い合わせ

名前

メール *

メッセージ *

QooQ