第十五章 python GUI界面编程

>>>
    了解什么是GUI和常用的GUI框架
    了解如何安装GUI框架wxPython
    掌握如何使用wxPython框架创建一个应用程序
    掌握wxPython框架中提供的常用控件
    掌握BoxSizer布局的应用
    掌握如何进行事件处理

15.1 初识GUI
    15.1.1 什么是GUI
        GUI是graphical User Interface(图形用户接口)。
    
    15.1.2 常用的框架
        
        GUI的工具包选择。有很多工具包,
        下面讲,wxPython工具包
    
    15.1.3 安装 wxPython
        pip install -U wxPython
    
15.2 创建应用程序
    15.2.1 创建一个wx.app 的子类
        # -*- coding:utf-8 -*-
        import wx
        class MyFrame(wx.App):
            def OnInit(self):
                frame = wx.Frame(parent = None, title = 'hello wypython')
                frame.Show()
                return True

        if __name__ == '__main__':        
            app = MyFrame()                      # 初始化应用
            app.MainLoop()                      # 调用主循环方法

    15.2.2 直接使用wx.App
        # -*- coding:utf-8 -*-
        import wx
        app = wx.App()
        frame = wx.Frame(None, title='hello wypython')
        frame.Show()
        app.MainLoop()
        
    15,2,3 使用wx.Frame框架
        # -*- coding:utf-8 -*-
        import wx

        class MyFrame(wx.Frame):
            def __init__(self, parent, id):
                wx.Frame.__init__(self, parent, id, title = "FrameABC", pos=(100,100), size = (300, 300))

        if __name__ == '__main__':
            app = wx.App()
            frame = MyFrame(parent=None, id = -1)
            frame.Show()
            app.MainLoop()
            
            
15.3 常用控件
    
    15.3.1 staticText文本类
        
        wx.StaticText(parent, id, label, pos, size, style, name)
        wx.Font(pointSize, family, style, weight, underline(win系统有效,表下划线), faceName, encoding)
    
        # -*- coding:utf-8 -*-
        import wx
        class MyFrame(wx.Frame):
            def __init__(self,parent,id):
                wx.Frame.__init__(self, parent, id, title = "创建StaticText类",
                                   pos=(100, 100), size=(600, 300))
                panel = wx.Panel(self) # 创建画板
                # 创建标题,并设置字体
                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)
                # 创建文本
                wx.StaticText(panel, label='优美胜于丑陋',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))
        if __name__ == '__main__':
            app = wx.App()                      # 初始化应用
            frame = MyFrame(parent=None,id=-1)  # 实例MyFrame类,并传递参数
            frame.Show()                        # 显示窗口
            app.MainLoop()                      # 调用主循环方法

    15.3.2 TextCtrl 输入文本类
    
        wx.textCtrl(parent, id, value = "", pos, size, style(对齐方式), validator(过滤数据,确保得到想要的数据), name)
        
        # -*- coding:utf-8 -*-
        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,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()                      # 调用主循环方法
    
    15.3.3 Button 按钮类
        
        wx.Button(parent, id, label, size, style, validator, name)        # 同上
        
        # -*- coding:utf-8 -*-
        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,pos=(50,90),label="密   码:")
                self.text_password = wx.TextCtrl(panel,pos=(100,90),size=(235,25),style=wx.TE_PASSWORD)
                self.lable_check = wx.StaticText(panel, label='验证码:',pos=(50, 130))
                self.text_check = wx.TextCtrl(panel, pos=(100, 130), size=(235,25),style=wx.TE_LEFT)

                self.bt_confirm = wx.Button(panel, label='确定', pos = (105, 170))
                self.bt_confirm = wx.Button(panel, label='取消', pos=(195, 170))

                

        if __name__ == '__main__':        
            app = wx.App()                      # 初始化应用
            frame = MyFrame(parent=None,id=-1)  # 实例MyFrame类,并传递参数    
            frame.Show()                        # 显示窗口
            app.MainLoop()                      # 调用主循环方法

15.4 BoxSizer布局
        wxPython提供了5个Boxsizer,
        
            BoxSizer布局, GridSizer布局, FlexGridSizer布局, GridBagSizer布局,StaticBoxSizer布局。
        
        15.4.1 什么是BoxSizer
            是一个垂直列或水平列的的组件。
            
        15.4.2 使用BoxSizer布局
            
            panel = wx.panel(self)
            self.title = wx.StaticText(panel, label='请输入用户名和密码')
            vsizer = wx.BoxSizer(wx.VERTICAL)
            vsizer.Add(self.title, proportion = 0, flag = wx.ALL, border = 15)
            panel.SetSizer(vsizer)
        
            # -*- coding:utf-8 -*-
            import wx
            class MyFrame(wx.Frame):
                def __init__(self,parent,id):
                    wx.Frame.__init__(self, parent,id, title="创建TextCtrl类",pos = (100, 100),size=(400, 300))

                    panel = wx.Panel(self)
                    self.title = wx.StaticText(panel, label = "请输入用户名和密码")

                    # 确认和取消按键
                    self.bt_confirm = wx.Button(panel, label = "确认")
                    self.bt_cancel = wx.Button(panel, label="取消")

                    #
                    # #用户名,和对应的输入框
                    self.user = wx.StaticText(panel, label = '用户名 : ')
                    self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
                    self.user_pwd = wx.StaticText(panel, label='密   码 : ')
                    self.text_user_pwd = wx.TextCtrl(panel, style=wx.TE_LEFT)
                    #
                    # hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
                    # hsizer_user.Add(self.user, proportion = 0, flag = wx.ALL, border = 5)
                    # hsizer_user.Add(self.text_user_pwd, proportion = 0, flag = wx.ALL, border = 5)

                    # 确认取消的框架
                    vsizer_1 = wx.BoxSizer(wx.HORIZONTAL)
                    vsizer_1.Add(self.bt_confirm, proportion = 0, flag = wx.ALL, border = 5)
                    vsizer_1.Add(self.bt_cancel, proportion = 0, flag = wx.ALL, border = 5)

                    # user 的 框架
                    vsizer_2 = wx.BoxSizer(wx.HORIZONTAL)
                    vsizer_2.Add(self.user, proportion=0, flag=wx.ALL, border=5)
                    vsizer_2.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)

                    # pwd 的 框架
                    vsizer_3 = wx.BoxSizer(wx.HORIZONTAL)
                    vsizer_3.Add(self.user_pwd, proportion=0, flag=wx.ALL, border=5)
                    vsizer_3.Add(self.text_user_pwd, proportion=1, flag=wx.ALL, border=5)
                    
                    vsizer_all = wx.BoxSizer(wx.VERTICAL)
                    vsizer_all.Add(self.title, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
                    vsizer_all.Add(vsizer_2, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border = 15)
                    vsizer_all.Add(vsizer_3, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border=15)

                    vsizer_all.Add(vsizer_1, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER, border=15)

                    panel.SetSizer(vsizer_all)


            if __name__ == '__main__':        
                app = wx.App()                      # 初始化应用
                frame = MyFrame(parent=None,id=-1)  # 实例MyFrame类,并传递参数    
                frame.Show()                        # 显示窗口
                app.MainLoop()                      # 调用主循环方法


15.5 事件处理
    15.5.1 什么是事件
        用户执行的动作就叫作事件(event)
        
    15.5.2 绑定事件
        bt_confirm.Bind(wx.EVT_BUTTON, OnclickSubmit)
        
        
        # -*- coding:utf-8 -*-
        import wx
        class MyFrame(wx.Frame):
            def __init__(self,parent,id):
                wx.Frame.__init__(self, parent,id, title="创建TextCtrl类",pos = (100, 100),size=(400, 300))

                panel = wx.Panel(self)
                self.title = wx.StaticText(panel, label = "请输入用户名和密码")

                # 确认和取消按键
                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.user = wx.StaticText(panel, label = '用户名 : ')
                self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
                self.user_pwd = wx.StaticText(panel, label='密   码 : ')
                self.text_user_pwd = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
                #
                # hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
                # hsizer_user.Add(self.user, proportion = 0, flag = wx.ALL, border = 5)
                # hsizer_user.Add(self.text_user_pwd, proportion = 0, flag = wx.ALL, border = 5)

                # 确认取消的框架
                vsizer_1 = wx.BoxSizer(wx.HORIZONTAL)
                vsizer_1.Add(self.bt_confirm, proportion = 0, flag = wx.ALL, border = 5)
                vsizer_1.Add(self.bt_cancel, proportion = 0, flag = wx.ALL, border = 5)

                # user 的 框架
                vsizer_2 = wx.BoxSizer(wx.HORIZONTAL)
                vsizer_2.Add(self.user, proportion=0, flag=wx.ALL, border=5)
                vsizer_2.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)

                # pwd 的 框架
                vsizer_3 = wx.BoxSizer(wx.HORIZONTAL)
                vsizer_3.Add(self.user_pwd, proportion=0, flag=wx.ALL, border=5)
                vsizer_3.Add(self.text_user_pwd, proportion=1, flag=wx.ALL, border=5)

                vsizer_all = wx.BoxSizer(wx.VERTICAL)
                vsizer_all.Add(self.title, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
                vsizer_all.Add(vsizer_2, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border = 15)
                vsizer_all.Add(vsizer_3, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border=15)

                vsizer_all.Add(vsizer_1, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER, border=15)

                panel.SetSizer(vsizer_all)

            def OnclickSubmit(self, event):
                ''' 单击确认事件'''
                message = 'abc'
                username = self.text_user.GetValue()
                password = self.text_user_pwd.GetValue()
                if(username == '' or password == ''):
                    message = '用户名和密码不能为空'
                elif (username == 'mr' and password == 'mrsoft'):
                    message = '登录成功'
                else:
                    message = '用户名和密码不匹配'
                wx.MessageBox(message)
            def OnclickCancel(self, event):
                '''单击取消按键'''
                self.text_user.SetValue("")
                self.text_user_pwd.SetValue("")


        if __name__ == '__main__':        
            app = wx.App()                      # 初始化应用
            frame = MyFrame(parent=None,id=-1)  # 实例MyFrame类,并传递参数    
            frame.Show()                        # 显示窗口
            app.MainLoop()                      # 调用主循环方法
            


                
            
    
        

发布了76 篇原创文章 · 获赞 0 · 访问量 7162

猜你喜欢

转载自blog.csdn.net/julicliy/article/details/104093071
今日推荐