如何使用python圖形化界面wxPython


GUI庫主要有三類:tkinter,wxPython和PyQt5,下面主要是針對wxPython的使用說明。

下面的操作均在win10 + pycharm上進行

  1. wxPython的安裝:

    pip install wxPython
    

    同時還安裝了兩個依賴包:six和pillow

  2. 簡單使用:
    變量app就是我們的程序。

    其次一定要注意大小寫,尤其是Show的S

    import wx
    app = wx.App()
    frame = wx.Frame(None, title = "Hello,world!")
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:
    成功示例截圖

  3. 進一步,我們可以添加一個按鈕:
    通過定義一個MyFrame類來實現,這個類繼承自wx.Frame類。

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            self.button = wx.Button(self, label = "hello")
    
    app = wx.App()
    frame = MyFrame(None, title = "Hello,world!")
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:

    成功示例截圖

  4. 但有一個問題,這個按鈕太大了,布滿了整個界面,所以我們可以進一步設置按鈕的大小和布局:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            self.btn1 = wx.Button(self, label="hello1", pos=(10, 50), size=(100, 50))
            self.btn2 = wx.Button(self, label="hello2", pos=(120, 50), size=(100, 50))
    
    app = wx.App()
    frame = MyFrame(None, title="Hello,world!")
    frame.Show()
    app.MainLoop()
    

    其中,pos是位置參數,第一個表示與左邊界的為距離,第二個表示與上邊界的距離;size是按鈕的大小參數,第一個表示寬度,第二個表示高度。

    有一點需要注意,這個按鈕是絕對布局下的按鈕,也就是說無論你把窗口變多大多小,按鈕都不會隨着窗口的大小變化

  5. 我們雖然有按鈕了,此時還需要加入焦點:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            panel = wx.Panel(self)
            self.btn1 = wx.Button(panel, label="hello1", pos=(10, 50), size=(100, 50))
            self.btn2 = wx.Button(panel, label="hello2", pos=(120, 50), size=(100, 50))
    
    app = wx.App()
    frame = MyFrame(None, title="Hello,world!")
    frame.Show()
    app.MainLoop()	
    

    運行后的界面如下所示:

    成功示例截圖
    我們通過加入了wx.Panel從而可以使用鼠標點擊對應按鈕,或者使用Tab鍵來移動到下一個按鈕。

  6. 現在點擊也可以了,但是沒有反應還不行,所以我們將按鈕和對應的事件進行綁定,也就是響應按鈕事件:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            panel = wx.Panel(self)
            self.btn1 = wx.Button(panel, label="hello1", pos=(10, 50), size=(100, 50))
            self.btn2 = wx.Button(panel, label="hello2", pos=(120, 50), size=(100, 50))
            self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
            self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
        def OnButton1(self, event):
            print("Hello,world!")
        def OnButton2(self, event):
                print("Hello,world!Hello,world!")
    
    app = wx.App()
    frame = MyFrame(None, title="Hello,world!")
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:

    成功示例截圖

  7. 下面介紹一些控件的使用:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            panel = wx.Panel(self)
    
            self.static_text = wx.StaticText(panel, label="靜態文本", pos=(10, 10))
    
            self.text_1 = wx.TextCtrl(panel, value="文本框", pos=(10, 40))
            self.text_2 = wx.TextCtrl(panel, value="密碼框", style=wx.TE_PASSWORD, pos=(10, 70))
            self.text_3 = wx.TextCtrl(panel, value="只讀文本框", style=wx.TE_READONLY, pos=(10, 100))
            self.text_4 = wx.TextCtrl(panel, value="多行\n文本框", style=wx.TE_MULTILINE, pos=(10, 130))
    
            self.btn1 = wx.Button(panel, label="修改窗口標題", pos=(200, 10))
            self.btn2 = wx.Button(panel, label="修改靜態文本內容", pos=(200, 40))
            self.btn3 = wx.Button(panel, label="修改文本框內容", pos=(200, 70))
            self.btn4 = wx.Button(panel, label="修改只讀文本框內容", pos=(200, 100))
    
            self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
            self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
            self.Bind(wx.EVT_BUTTON, self.OnButton3, self.btn3)
            self.Bind(wx.EVT_BUTTON, self.OnText1, self.btn4)
    
        def OnButton1(self, event):
            self.Title += 'Hello'
        def OnButton2(self, event):
            self.static_text.Label += 'Hi'
        def OnButton3(self, event):
            self.text_1.Value = 'Good'
            self.text_2.Value = 'GOOD'
            self.text_3.Value = 'Good\nbetter\nbest'
            self.text_4.Value = 'GOOD\nBetter\nBest'
        def OnText1(self, event):
            self.text_3.Value = self.text_1.Value
    
    app = wx.App()
    frame = MyFrame(None, title="Multi_Text", size=(500, 300))
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:
    成功示例截圖

  8. 接下來我們看一下加入圖片控件的使用:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            self.bitmap = wx.StaticBitmap(self, pos=(10, 10))
            self.btn1 = wx.Button(self, label="001", pos=(300, 10))
            self.btn2 = wx.Button(self, label='002', pos=(300, 40))
            self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
            self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
    
        def OnButton1(self, event):
            self.bitmap.Bitmap = wx.Bitmap('002.jpeg')
        def OnButton2(self, event):
            self.bitmap.Bitmap = wx.Bitmap('001.jpg')
    
    app = wx.App()
    frame = MyFrame(None, title="Images", size=(500, 290))
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:
    成功示例截圖

  9. 接下來我們解決相對布局的問題,首先可以使用BoxSizer來使縮小窗口時不會遮擋按鈕:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            sizer = wx.BoxSizer(wx.HORIZONTAL)
            self.bitmap = wx.StaticBitmap(self, bitmap=wx.Bitmap('001.jpg'))
            self.btn1 = wx.Button(self, label="001")
            self.btn2 = wx.Button(self, label='002')
            self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
            self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
            sizer.Add(self.btn1)
            sizer.Add(self.btn2)
            sizer.Add(self.bitmap)
            self.SetSizerAndFit(sizer)
    
        def OnButton1(self, event):
            self.bitmap.Bitmap = wx.Bitmap('002.jpeg')
        def OnButton2(self, event):
            self.bitmap.Bitmap = wx.Bitmap('001.jpg')
    
    app = wx.App()
    frame = MyFrame(None, title="Images", size=(500, 290))
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:
    成功示例截圖

  10. 當拉動窗口時,按鈕將一直保持相同比例跟隨其變化:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            self.btn1 = wx.Button(self, label="button1")
            self.btn2 = wx.Button(self, label='button2')
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.btn1, 1)
            sizer.Add(self.btn2, 3)
            self.SetSizerAndFit(sizer)
    
    app = wx.App()
    frame = MyFrame(None, title="vertical")
    frame.Show()
    app.MainLoop()
    

    運行后的界面如下所示:
    成功示例截圖

  11. 當然,也可以添加位置信息:

    sizer.Add(self.btn1, 1, wx.ALIGN_LEFT)
    sizer.Add(self.btn3, 2, wx.TEXT_ALIGNMENT_LEFT)
    sizer.Add(self.btn2, 3, wx.EXPAND)
    
  12. 也可以加邊框距離:

     sizer.Add(self.btn1, 1, wx.ALIGN_LEFT|wx.ALL, 10)
     sizer.Add(self.btn3, 2, wx.TEXT_ALIGNMENT_LEFT|wx.LEFT|wx.RIGHT, 300)
     sizer.Add(self.btn2, 3, wx.EXPAND)
    
  13. 也可以Add一個塊來進行占位:

    sizer.Add((50, 60))
    
  14. 還可以設置比例:

    sizer.Add(self.btn1, 1, wx.ALL, 30)
    sizer.Add(self.btn3, 1, wx.ALL, 30)
    sizer.Add(self.btn2, 1, wx.ALL, 30)
    sizer.Add((50, 60), 3)
    

    運行后的界面如下所示:
    成功示例截圖

  15. 最后來看一個嵌套布局:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kw):
            wx.Frame.__init__(self, *args, **kw)
            self.btn1 = wx.Button(self, label="button1")
            self.btn2 = wx.Button(self, label='button2')
            self.btn3 = wx.Button(self, label='button3')
            self.btn4 = wx.Button(self, label="button4")
            self.btn5 = wx.Button(self, label="button5")
            hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
            hsizer1.Add(self.btn1, 0, wx.ALL, 5)
            hsizer1.Add(self.btn2, 0, wx.ALL, 5)
            hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
            hsizer2.Add(self.btn3, 1, wx.ALL, 5)
            hsizer2.Add(self.btn4, 1, wx.ALL, 5)
            vsizer1 = wx.BoxSizer(wx.VERTICAL)
            vsizer1.Add(hsizer1, 0, wx.ALIGN_RIGHT)
            vsizer1.Add(hsizer2, 0, wx.EXPAND)
            vsizer1.Add(self.btn5, 1, wx.EXPAND)
            self.SetSizerAndFit(vsizer1)
    
    app = wx.App()
    frame = MyFrame(None, title="嵌套BoxSizer")
    frame.Show()
    app.MainLoop()
    

    然后來看運行效果:

    成功示例截圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM