常用的GUI框架之wxPython框架

1、初識GUI

1.1、什麼是GUI

GUI是Graphical User Interface(圖像用戶界面)的縮寫。在GUI中有輸入文本、返回文本,具有有窗口、按鈕等圖像,也可以通過鍵盤和鼠標操作。GUI是一種與程序不同的方式。GUI的程序有3個基本要素:輸入、處理、輸出。

1.2、常用的GUI框架

python的GUI開發,有很多工具包,下面是一些流行的工具包

工具包 描述
wxPython wxpython是python中的一套優秀的GUI圖像庫,允許python程序員很方便的程序完整的、功能健全的GUI用戶界面
Kivy 是一個開源的工具包,能夠讓相同的源代碼創建的程序跨平臺運行,主要關注程序型用戶界面的開發,如多點觸摸應用程序
Flexx Flexx是一個純python工具包,用來創建圖形化應用程序。其使用web技術進行界面的渲染
PyQt PyQt是Qt庫的python版本,支持跨平臺
Tkinter Tkinter(也叫Tk接口)是Tk圖形用戶界面工具包標準的Python接口,是一個輕量級的跨平臺圖像用戶界面(GUI)開放工具
Pywin32 Pywin32允許你以像VC一樣的形式來使用Python開放win32應用
PyGTK PyGTK讓用Python輕鬆創建具有圖形用戶界面的程序
pyui4win pyui4win是一個開源的採用自繪技術的界面庫

每個工具包都有各自的特點,工具包的選擇決定於你的應用常景。

2、wxPython框架的使用

要使用wxPython模塊(工具包),得先安裝該模塊,使用下面命令安裝(在命令行操作)

pip install -U wxPython

2.1、創建一個wx.App的子類

在開始創建應用程序之前,要先創建一個沒有任何功能的子類。
創建和使用wx.App子類要4個步驟
1、定義這個子類
2、在定義的子類中寫一個OnInit()初始化方法
3、在程序的主要部分創建這個類的一個實例
4、調用應用程序實例的MainLoop()方法,這個方法將出現的控制器轉給wxPython.

創建一個沒有任何功能的子類具體代碼如下

import wx   # 導入wxpython
class App(wx.App):
    # 初始化方法
    def OnInit(self):
        frame = wx.Frame(parent=None, title= "Hello wxPython")     # 創建窗口用
        frame.Show()  # 顯示窗口
        return True  # 返回值

if __name__ == '__main__':
    app = App()     # 創建APP類的實例
    app.MainLoop()  # 調用App類的MainLoop()主循環方法

上述代碼中,定義了子類App,它繼承了父類wx.App

2.2、直接使用wx.App

如果在系統中只有一個窗口,通過不創建wx.App的子類,直接使用wx.App,這個類提供了一個最基本的OnInit()初始化方法,代碼如下

import wx   # 導入wxPython
app = wx.App()  # 初始化wx.App類
frame = wx.Frame(None, title='Hello World')  # 定義一個頂級窗口(NOne就是表示頂級窗口)
frame.Show()   # 顯示窗口
app.MainLoop()  # 調用wx.App類中的MainLoop()主循環方法

2.3、使用wx.Frame框架

在GUI中框架通過稱爲窗口。框架是一個容器,用戶可以將它在屏幕上任意移動,並進行縮放,它通常包含標題欄、菜單欄等。在wxPython中,wxFrame是所有框架的父類。當創建wx.Frame的子類時,子類應該調用其父類的構造器wx.Frame.__int__()。wx.Frame的構造器語法格式如下:

wx.Frame(parent, id= -1,title="",pos =wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT_FRAME_STYLE,name="frame")

參數說明
1、parent: 框架的父類窗口。如果是頂級窗口,這個值爲None
2、id: 關於新窗口的wxPython ID號。通常設爲-1,讓wxPython自動生成一個新的ID。
3、title: 窗口的標題
4、pos: 一個wx.Point對象,它指定這個新窗口的左上角在屏幕中間的位置。在GUI程序中,通過(0,0)是顯示器的左上角。這個默認的(-1,-1)將讓系統決定窗口的位置。
5、size: 一個wx.Size對象,它指定這個窗口的初始尺寸。這個默認的(-1,-1)將讓系統決定窗口的初始尺寸
6、style: 指定窗口類型的常量。可以使用或運算來組合它們
7、name: 框架的內在的名字可以使用它來需找這個窗口。

創建wx.Frame子類的代碼如下

import wx   # 導入wxPython
class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title="創建Frame", pos=(100,100), size=(500,300))
if __name__=='__main__':
    app = wx.App()                       # 初始化應用
    frame = MyFrame(parent=None, id=-1)  # 實例MyFrame並傳入參數
    frame.Show()       # 顯示窗口
    app.MainLoop()     # 調用MainLoop()主循環方法

2.4、常用的控件

控件就是我們在創建完窗口以後,在窗口添加的按鈕、文本、輸入框等等。

2.41、StaticText文本類

對於所有的UI(用戶界面)工具來說,最基本的任務就是在屏幕上繪製文本。在wxPython中,可以使用wx.StaticText類來完成。使用wx.StaticText能夠改變文本的對齊方式、字體。顏色等。
wx.StaticText的構造函數語法格式

wx.StaticText(parent,id,label,pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,name="staticText")

參數說明
parent:父窗口部件
id:標識符。使用-1可以自動創建一個唯一的標識
label:x顯示在靜態控件中的文本內容
pos:一個wx.Point或一個Python元組,它就是窗口部件的位置。
size:一個wx.Point或一個Python元組,它就是窗口部件的尺寸。
style:樣式標記
name:對象的名字

例子:使用wx。StaticText輸出Python之禪(The Zen of Python)
1、在python控制檯輸入import this之後,會輸出一堆英文,就是python之禪
在這裏插入圖片描述
2、使用StaticText類輸出python之禪(The Zen of Python)

import wx   # 導入wxPython


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title="創建StaticText類", pos=(100, 100), size=(600, 700))
        panel = wx.Panel(self)   # 創建畫板
        # 創建標題,並設置字體
        title = wx.StaticText(panel, label='The Zen of Python————Tim Peters', pos=(100, 20))
        font1 = wx.Font(16, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
        title.SetFont(font1)
        # 創建文本
        wx.StaticText(panel, label='Beautiful is better than ugly.', pos=(50, 50))
        wx.StaticText(panel, label='Explicit is better than implicit.', pos=(50, 70))
        wx.StaticText(panel, label='Simple is better than  complex.', pos=(50, 90))
        wx.StaticText(panel, label='Complex is better than  complicate.', pos=(50, 110))
        wx.StaticText(panel, label='Flat is better than nested.', pos=(50, 130))
        wx.StaticText(panel, label='Sparse is better than dense,', pos=(50, 150))
        wx.StaticText(panel, label='Readability counts', pos=(50, 170))
        wx.StaticText(panel, label='Special cases are not special enough to break rules.', pos=(50, 190))
        wx.StaticText(panel, label='Although practically beats purity.', pos=(50, 210))
        wx.StaticText(panel, label='Errors should never pass silently.', pos=(50, 230))
        wx.StaticText(panel, label='Unless explicitly silenced.', pos=(50, 250))
        wx.StaticText(panel, label='In the face of ambiguity, refuse the temptation to guess.', pos=(50, 270))
        wx.StaticText(panel, label='There should be one-- and preferable only one --obvious way to do it.', pos=(50, 290))
        wx.StaticText(panel, label='Although that way may not be obvious at first unless you are Dutch.', pos=(50, 310))
        wx.StaticText(panel, label='Now is better than never.', pos=(50, 330))
        wx.StaticText(panel, label='Although never is often better than *right* now.', pos=(50, 350))
        wx.StaticText(panel, label='If the implementation is hard to explain, it is a bad idea.', pos=(50, 370))
        wx.StaticText(panel, label='If the implementation is hard to explain, it is a bad idea.', pos=(50, 390))
        wx.StaticText(panel, label='If the implementation is easy to explain, it is may be a good idea.', pos=(50, 410))
        wx.StaticText(panel, label='Namespaces are one honking great idea.', pos=(50, 430))


if __name__=='__main__':
    app = wx.App()                       # 初始化應用
    frame = MyFrame(parent=None, id=-1)  # 實例MyFrame並傳入參數
    frame.Show()       # 顯示窗口
    app.MainLoop()     # 調用MainLoop()主循環方法

wx.Font構造函數語法

wx.Font(pointSize, family, style, weight, underline=False, faceName="",encoding=wx.FONTENCODING_DEFAULT)

參數說明
pointSize:字體的整數尺寸,單位爲磅。
family: 用於快速指定一個字體而無須知道該字體的具體名字。
style: 指明字體的醒目程度
underline:僅僅在Windows系統下有效果,如果值爲True,有下畫線,False無下畫線
faceName:指定字體名
encoding: 允許在幾個編碼中選擇一個,大多數情況下可以使用默認編碼

2.42、TextCtrl輸入文本類

wx.StaticText類只能用於顯示靜態的文本,要想輸入文件與用戶進行交互,要用wx.TextCtrl類,它允許單行和多行文本。它也可以作爲密碼輸入控件,掩飾所按下的按鈕。
wx.TextCtrl類的構造函數語法

wx.TextCtrl(parent, id, value="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, validator=wx.DefaultValidator,name=wx.TextCtrlNameStr)

參數說明:
其中parent,id,pos,size,style,name與wx.StaticText構造函數相同。

value:顯示在該控件中的初始文本
validator:常用於過濾數據,來確保只能輸入要接收的數據。

style:單行wx.TextCtrl的樣式、取值及說明如下
1、wx.TE_CENTER:控件中的文本居中。
2、wx.TE_LEFT:控件中的文件左對齊。
3、wx.TE_NOHIDESEL:文本始終高亮顯示,只適用於windows。
4、wx.TE_PASSWORD: 不顯示所輸入的文本,以星號代替。
5、wx.TE_PROCESS_ENTER:如果使用該參數,那麼當用用戶在控件內按下回車鍵時,一個文本輸入事件將被觸發。否則,按鍵事件內在的由該文本控件或該對話框管理。
6、wx.TE_PROCESS_TAP:如果指定了這個樣式,那麼通常的字符事件在鍵按下時創建(一般意味着一個製表符將被插入文本)。否則,鍵由對話框來管理,通常是控件間的切換。
7、wx.TE_READONLY: 只讀模式
8、wx.TE_RIGHT:文本右對齊

例子1:用wx.TextCtrl類和wx.StaticText類實現一個包含用戶名和密碼的登錄界面。

import wx   # 導入wxPython


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title="創建TextCtrl類", size=(400, 300))
        panel = wx.Panel(self)  # 創建面板
        # 創建文本和輸入框
        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, label="密 碼:", pos=(50, 90))
        self.text_pwd = 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()     # 調用主循環方法

2.43、Button按鈕類

按鈕是GUI界面中應用最爲廣泛的控件,它常常用於捕獲用戶生成的單擊事件。其最明顯的用途是觸發綁定到一個處理函數

wx.Python類庫提供了不同類型的按鈕,其中最爲簡單、最常用的是wx.Button類。wx.Button的構造函數語法如下:

wx.Button(parent, id, label, pos, size=wxDefaultSize, style=0,validator,name="button")

例子2:在上面的例子1中添加確定和取消按鈕

import wx


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title="創建TextCtrl類", size=(400, 300))
        panel = wx.Panel(self)  # 創建面板
        # 創建文本和輸入框
        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, label="密 碼:", pos=(50, 90))
        self.text_pwd = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
        # 創建確定和取消的界面
        self.bt_confirm = wx.Button(panel, label='確定', pos=(105, 130))
        self.bt_cancel = wx.Button(panel, label='取消', pos=(195, 130))


if __name__ == '__main__':
    app = wx.App()           # 初始化應用
    frame = MyFrame(parent=None, id=-1)    # 初始化MyFrame類,並傳遞參數
    frame.Show()    # 顯示窗口
    app.MainLoop()     # 調用主循環方法

2.5、BoxSizer佈局

上面的那種使用座標的方法過於麻煩。在wxPython有另一種更智能的佈局方式:sizer(尺寸器)。sizer是用於自動佈局一組窗口控件的算法。
wxPython提供了5個sizer,如下表

sizer名稱 描述
BoxSizer 在一條水平或重垂直窗口部件的佈局。控制窗口部件在行爲上很靈活。一般用於嵌套的樣式,應用面廣
GridSizer 一個基礎的網格佈局,當你要放置的窗口部件是同樣的尺寸且整齊地放入一個規則的網格中可以使用它
FlexGridSizer 對GridSizer做了一定改變,窗口部件有不同的尺寸時,可以有更好的結果
GridBagSizer GridSizer系列中最靈活的成員。網絡中的窗口部件可以隨意放置
StaticBoxSizer 一個標準的BoxSizer,常有標題和環線

2.51、什麼是BoxSizer

在一條線上佈局子窗口部件。wx.BoxSizer的佈局方向可以是水平或堅直的,並且可以在水平或堅直方向上包含子sizer以創建複雜的佈局。是wxPython中所提供的最簡單。最林華的控件。

2.52、使用BoxSizer

尺寸器會管理組件的尺寸,只有將部件添加上尺寸器,和一些佈局參數,就可以讓尺寸器去管理父組件的尺寸。下面是使用BoxSizer的例子

import wx   # 導入wxPython

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, '用戶登入', size = (400, 300))
        # 創建面板
        panel = wx.Panel(self)
        self.title = wx.StaticText(panel, label='請輸入用戶名和密碼')
        # 添加容器,容器中的控件按縱向排列
        vsizer = wx.BoxSizer(wx.VERTICAL)
        vsizer.Add(self.title, proportion=0, flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTRE, border = 15)
        panel.SetSizer(vsizer)


if __name__== '__main__':
    app = wx.App()                        # 初始化
    frame = MyFrame(parent=None, id=-1)   # 實例化MyFrame類,並傳遞參數
    frame.Show()                          # 顯示窗口
    app.MainLoop()                        # 調用主循環方法

Add的方法可以將控件加入sizer中
Add()語法格式

Box.Add(control, proportion, flag, border)

參數說明:
1、control:要添加的控件

2、proportion:所要添加的控件在定義方式所代表方向上,佔據的控件比較。如果有3個按鈕,他們的比例值分別爲0,1,2,他們都以添加到一個寬帶爲30的水平批量的wx.BoxSizer中,起始寬度都是10.當sizer的寬度有30變到30.按鈕1的寬度不變爲[10+(60-30)*0/(0+1+2)]=10,按鈕2的寬度變爲[10+(60-30)*1/(0+1+2)]=20,按鈕3的寬度變爲[10+(60-30)*2/(0+1+2)]=30,

3、flag:flag參數與border參數結合使用可以知道邊距寬度,有以下選項
(1)、wx.LEFT:左邊距
(2)、wx.RIGHT:右邊距
(3)、wx.BOTTOM:底邊距
(4)、wx.TOP:上邊距
(5)、wx.ALL:上下左右4個邊距
(6)、wx.LEFT:左邊距

可以通過豎線操作符聯合使用這些標誌。flag參數還可以與proportion參數結合,製作控件本身的對齊方式,包以下選項
(1)、wx.ALIGN_LIFT:左邊對齊
(2)、wx.ALIGN_RIGHT:右邊對齊
(3)、wx.ALIGN_BOTTOM:底邊對齊
(4)、wx.ALIGN_CENTER_VERTICAL:垂直對齊
(5)、wx.ALIGN_CENTER_HORIZONTAL:水平對齊
(6)、wx.ALIGN_CENTER:居中對齊
(7)、wx.ALIGN_EXPAND:所添加的控件將佔有sizer定位上的所有可用的空間

4、border:控制所有添加空間的邊距,就是在空間之間添加一些像素的空白

例子3、使用Boxsizer設置登入界面佈局

import wx   # 導入wxPython

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, '用戶登錄', size=(400, 300))
        # 創建面板
        panel = wx.Panel(self)

        # 創建“確定”和“取消”按鈕,並綁定事件
        self.bt_confirm = wx.Button(panel, label='確定')
        self.bt_cancel = wx.Button(panel, label='取消')
        # 創建文本,左對齊
        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_pwd = 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_pwd, proportion=1, flag=wx.ALL, border=5)
        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTRE, border=5)
        hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTRE, border=5)

        # 添加容器,容器中控件縱向排列
        vsizer_all = wx.BoxSizer(wx.VERTICAL)
        vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM|wx.TOP | wx.ALIGN_CENTRE, border=15)
        vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.ALIGN_RIGHT, border=45)
        vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.ALIGN_RIGHT, border=45)
        vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTRE | wx.TOP, border=15)
        # 設置 面板 panel 的尺寸管理器爲 vsizer_all
        panel.SetSizer(vsizer_all)


if __name__ =='__main__':
    app = wx.App()                              # 初始化
    frame = MyFrame(parent=None, id=-1)         # 實例化,並傳參
    frame.Show()                                # 顯示窗口
    app.MainLoop()  

上面代碼中,使用BoxSizer將絕對位置改爲相對位置佈局。

2.6、事件處理

1、事件就是用戶執行的地址,如單擊按鈕就是一個單擊事件。在上面的例子中完成佈局後就是輸入用戶名密碼,點擊確定按鈕就要判讀信息是否正確,並輸出對應的提示,這就要使用wx.Python的事件處理。

2、而我們通過將函數綁定到事件可以發生的控件上,當事件發生時,函數就被調用。利用控件的Bind()方法可以將事件處理函數綁定到事件上。如爲確定按鈕添加一個單擊事件,

bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit)

參數說明:
wx.EVT_BUTTON:事件類型爲按鈕事件。在wxPython中有很多以wx.EVT_開頭的事件類型,例如wx.EVT_MOTION產生於用戶移動鼠標。類型wx.ENTER_WINDOW和wx.LEAVE_WINDOW產生於鼠標進入或者離開一個窗口控件。類型wx.EVT_MOUSEWHEEL被綁定到鼠標滾輪的活動事件裏。

OnlickSubmit:方法名。事件發生時執行該方法。
例子4、使用事件判斷用戶登錄
在例子上的基礎上,分別爲"確定"和"取消"按鈕添加單擊事件。輸入賬號密碼後,點擊“確定”按鈕,如果用戶名爲wr,且密碼爲giun,則彈出對話框“登錄成功”,否則彈出對話框“用戶名和密碼不匹配”,點擊“取消”按鈕時,清空用戶名和密碼

import wx   # 導入wxPython


class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, '用戶登錄', size=(400, 300))
        # 創建面板
        panel = wx.Panel(self)

        # 創建“確定”和“取消”按鈕並綁定事件
        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)
        # 創建文本,左對齊
        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_pwd = 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_pwd, proportion=1, flag=wx.ALL, border=5)
        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTRE, border=5)
        hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTRE, border=5)

        # 添加容器,容器中控件縱向排列
        vsizer_all = wx.BoxSizer(wx.VERTICAL)
        vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTRE, border=15)
        vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.ALIGN_RIGHT, border=45)
        vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.ALIGN_RIGHT, border=45)
        vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTRE | wx.TOP, border=15)
        # 設置 面板 panel 的尺寸管理器爲 vsizer_all
        panel.SetSizer(vsizer_all)

    def OnclickSubmit(self, event):
        """ 單擊確定按鈕,執行方法 """
        message = ""
        username = self.text_user.GetValue()    # 獲取輸入的用戶名
        password = self.text_pwd.GetValue()     # 獲取輸入的密碼
        if username == 'wr' and password == 'giun':
            message = "登錄成功"
        else:
            message = "用戶名和密碼不匹配"
        wx.MessageBox(message)

    def OnclickCancel(self, event):
        """ 單擊取消按鈕,執行方法 """
        self.text_user.SetValue("")
        self.text_pwd.SetValue("")


if __name__ == '__main__':
    app = wx.App()          # 初始化應用
    frame = MyFrame(parent=None, id=-1)  # 實例化,並傳參
    frame.Show()   # 顯示窗口
    app.MainLoop()  # 調用主循環方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章