pip install -U wxPython
C:\Users> pip install -U wxPythonCollecting wxPython Downloading https://files.pythonhosted.org/packages/34/41/e0e109a72966f596a5b93123d94eaabd53509ef6766fa3321b4bfadbbb14/wxPython-4.0.3-cp37-cp37m-win_amd64.whl (22.7MB) 100% |████████████████████████████████| 22.7MB 819kB/sCollecting PyPubSub (from wxPython) Downloading https://files.pythonhosted.org/packages/ab/9e/3b50915d3346971aaa49074425788598ee4907e67c097e013f1a862bd45c/Pypubsub-4.0.0-py3-none-any.whl (63kB) 100% |████████████████████████████████| 71kB 1.5MB/sRequirement already satisfied, skipping upgrade: six in d:\python\lib\site-packages (from wxPython) (1.11.0)Installing collected packages: PyPubSub, wxPythonSuccessfully installed PyPubSub-4.0.0 wxPython-4.0.3
wxPython的兩個基礎對象,應用程序對象和頂級窗口:
import wx # 導入wxPythonclass App(wx.App): def OnInit(self): # 初始化方法 frame = wx.Frame(parent=None, title='第一個窗口程序') # 創(chuàng)建頂級窗口 frame.Show() # 顯示窗口 return True # 返回值(返回窗口,在屏幕展示)if __name__ == '__main__': app = App() # 實例化App類 app.MainLoop() # 調用App類的MainLoop()主循環(huán)方法
執(zhí)行結果:
通常,如果在系統(tǒng)中只有一個窗口的話,可以不創(chuàng)建wx.App子類,直接使用wx.App。這個類提供了一個最基本的OnInit()初始化方法。
import wx # 導入wxPythonapp = wx.App() # 初始化wx.App類frame = wx.Frame(None, title='第一個窗口程序') # 定義一個頂級窗口frame.Show() # 顯示窗口app.MainLoop() # 調用wx.App類的MainLoop()主循環(huán)方法
執(zhí)行結果:
wx.Frame(parent=None, id=-1, title="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE, name="frame")
示例代碼:
import wx # 導入wxPythonclass MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="創(chuàng)建Frame", pos=(100, 100), size=(300, 300))if __name__ == '__main__': app = wx.App() # 初始化應用 frame = MyFrame(parent=None, id=1) # 實例MyFrame類,并傳遞參數 frame.Show() # 顯示窗口 app.MainLoop() # 調用MainLoop()主循環(huán)方法
執(zhí)行結果:
創(chuàng)建完窗口以后,我們可以在窗口內添加一些控件,所謂的控件,就是經常使用的按鈕、文本、輸入框、單選框等。
wx.StaticText(parent, id, lable, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="staticText")
實例代碼:
使用wx.StaticText輸出Python之禪
# -*- coding:utf-8 -*-import wxclass MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="創(chuàng)建StaticText類", pos=(100, 100), size=(600, 400)) panel = wx.Panel(self) # 創(chuàng)建畫板 # 創(chuàng)建標題,并設置字體 title = wx.StaticText(panel, label='Python之禪——Tim Peters', pos=(100, 20)) font = wx.Font(16, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL) title.SetFont(font) # 創(chuàng)建文本 wx.StaticText(panel, label='優(yōu)美勝于丑陋',pos=(50, 50)) wx.StaticText(panel, label='明了勝于晦澀',pos=(50, 70)) wx.StaticText(panel, label='簡潔勝于復雜',pos=(50, 90)) wx.StaticText(panel, label='復雜勝于凌亂',pos=(50, 110)) wx.StaticText(panel, label='扁平勝于嵌套',pos=(50, 130)) wx.StaticText(panel, label='間隔勝于緊湊',pos=(50, 150)) wx.StaticText(panel, label='可讀性很重要',pos=(50, 170)) wx.StaticText(panel, label='即便假借特例的實用性之名,也不可違背這些規(guī)則', pos=(50,190)) wx.StaticText(panel, label='不要包容所有錯誤,除非你確定需要這樣做', pos=(50, 210)) wx.StaticText(panel, label='當存在多種可能,不要嘗試去猜測', pos=(50, 230)) wx.StaticText(panel, label='而是盡量找一種,最好是唯一一種明顯的解決方案', pos=(50, 250)) wx.StaticText(panel, label='雖然這并不容易,因為你不是 Python 之父', pos=(50, 270)) wx.StaticText(panel, label='做也許好過不做,但不假思索就動手還不如不做', pos=(50, 290)) wx.StaticText(panel, label='如果你無法向人描述你的方案,那肯定不是一個好方案;反之亦然', pos=(50, 310)) wx.StaticText(panel, label='命名空間是一種絕妙的理念,我們應當多加利用', pos=(50, 330))if __name__ == '__main__': app = wx.App() # 初始化應用 frame = MyFrame(parent=None, id=-1) # 實例MyFrame類,并傳遞參數 frame.Show() # 顯示窗口 app.MainLoop() # 調用主循環(huán)方法
上述代碼中,使用panel = wx.Panel(self)來創(chuàng)建畫板,并將panel 作為父類,然后將組件放入窗體中,此外,使用wx.Font類來設置字體。創(chuàng)建一個字體實例,需要使用如下構造函數:
wx.Font(pointSize, family, style, weight, underline=False, faceName="", encoding=wx.FONTENCODING_DEFAULT)
執(zhí)行結果:
wx.TextCtrl(parent, id, value="", pos=wx.DefaultPosition, size=wx.DefaultSize,style=0,validator=wx.DefaultValidator name=wx.TextCtrlNameStr)
Enter
鍵時,一個文本輸入事件將被觸發(fā)。否則,按鍵事件由該文本控件或該對話框管理Tab
鍵時創(chuàng)建(一般意味著一個制表符將被插入文本)。否則,tab由對話框來管理,通常是控件間切換示例代碼:
# -*- coding:utf-8 -*-import wxclass MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="創(chuàng)建TextCtrl類", size=(400, 300)) #創(chuàng)建面板 panel = wx.Panel(self) # 創(chuàng)建文本和輸入框 self.title = wx.StaticText(panel, label="請輸入用戶名和密碼", pos=(140, 20)) self.label_user = wx.StaticText(panel, label="用戶名:", pos=(50, 50)) self.text_user = wx.TextCtrl(panel, pos=(100, 50), size=(235, 25), style=wx.TE_LEFT) self.label_pwd = wx.StaticText(panel, pos=(50, 90), label="密 碼:") self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)if __name__ == '__main__': app = wx.App() # 初始化應用 frame = MyFrame(parent=None, id=-1) # 實例MyFrame類,并傳遞參數 frame.Show() # 顯示窗口 app.MainLoop() # 調用主循環(huán)方法
執(zhí)行結果:
wx.Button(parent, id, lable, pos, size=wx.DefaultSize, style=0, validator, name="button")
wx.Button和wx.TextCtrl的參數基本相同,其中參數lable是顯示在按鈕上的文本
示例代碼:
# -*- coding:utf-8 -*-import wxclass MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="創(chuàng)建TextCtrl類", size=(400, 300)) panel = wx.Panel(self) # 創(chuàng)建面板 # 創(chuàng)建文本和輸入框 self.title = wx.StaticText(panel, label="請輸入用戶名和密碼", pos=(140, 20)) self.label_user = wx.StaticText(panel, label="用戶名:", pos=(50, 50)) self.text_user = wx.TextCtrl(panel, pos=(100, 50), size=(235, 25), style=wx.TE_LEFT) self.label_pwd = wx.StaticText(panel, pos=(50, 90), label="密 碼:") self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD) self.bt_confirm = wx.Button(panel, label='確定', pos=(105, 130)) # 創(chuàng)建“確定”按鈕 self.bt_cancel = wx.Button(panel, label='取消', pos=(195, 130)) # 創(chuàng)建“取消”按鈕if __name__ == '__main__': app = wx.App() # 初始化 frame = MyFrame(parent=None, id=-1) # 實例MyFrame類,并傳遞參數 frame.Show() # 顯示窗口 app.MainLoop() # 調用主循環(huán)方法
執(zhí)行結果:
當我們點擊按鈕后需要讓系統(tǒng)做出相應的響應,如執(zhí)行某個判斷并給出提示,使用Bind()方法可以將事件處理函數綁定到給定的事件上:
bt_confirm.Bind(wx.EVT_BUTTON, OnclickSubmit)
示例代碼:
點擊確定,判斷密碼是否正確等
# -*- coding:utf-8 -*-import wxclass MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, '用戶登錄', size=(400, 300)) # 創(chuàng)建面板 panel = wx.Panel(self) # 創(chuàng)建“確定”和“取消”按鈕, 并綁定事件 self.bt_confirm = wx.Button(panel, label='確定') self.bt_confirm.Bind(wx.EVT_BUTTON, self.OnclickSubmit) self.bt_cancel = wx.Button(panel, label='取消') self.bt_cancel.Bind(wx.EVT_BUTTON, self.OnclickCancel) # 創(chuàng)建文本,左對齊 self.title = wx.StaticText(panel, label="請輸入用戶名和密碼") self.label_user = wx.StaticText(panel, label="用戶名:") self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT) self.label_pwd = wx.StaticText(panel, label="密 碼:") self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD) # 添加容器,容器中控件按橫向并排排列 hsizer_user = wx.BoxSizer(wx.HORIZONTAL) hsizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5) hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5) hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL) hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5) hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5) hsizer_button = wx.BoxSizer(wx.HORIZONTAL) hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5) hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5) # 添加容器,容器中控件按縱向并排排列 vsizer_all = wx.BoxSizer(wx.VERTICAL) vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER, border=15) vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP, border=15) panel.SetSizer(vsizer_all) def OnclickSubmit(self, event): """ 點擊確定按鈕,執(zhí)行方法 """ message = "" username = self.text_user.GetValue() # 獲取輸入的用戶名 password = self.text_password.GetValue() # 獲取輸入的密碼 if username == "" or password == "": # 判斷用戶名或密碼是否為空 message = '用戶名或密碼不能為空' elif username == 'admin' and password == '123456': # 用戶名和密碼正確 message = '登錄成功' else: message = '用戶名和密碼不匹配' # 用戶名或密碼錯誤 wx.MessageBox(message) # 彈出提示框 def OnclickCancel(self, event): # 沒有event點擊取消會報錯 """ 點擊取消按鈕,執(zhí)行方法 """ self.text_user.SetValue("") # 清空輸入的用戶名 self.text_password.SetValue("") # 清空輸入的密碼if __name__ == '__main__': app = wx.App() # 初始化 frame = MyFrame(parent=None, id=-1) # 實例MyFrame類,并傳遞參數 frame.Show() # 顯示窗口 app.MainLoop() # 調用主循環(huán)方法
執(zhí)行結果: