• python基础语法14-GUI编程2


    一、简介
    Python提供了多个图形开发界面的库,几个常用 Python GUI 库如下:
    1.Tkinter模块("Tk 接口")是 Python的标准 Tk GUI工具包的接口 .
    Tk和 Tkinter可以在大多数的 Unix平台下使用,同样可以应用在 Windows和 Macintosh系统里。
    Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
    2.wxPython是一款开源软件,是 Python语言的一套优秀的 GUI图形库,允许 Python程序员很方便的创建完整的、功能键全的 GUI 用户界面。
    3.Jython程序可以和 Java无缝集成。除了一些标准模块,Jython使用 Java的模块。Jython几乎拥有标准的Python中不依赖于 C语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT 或者 SWT。Jython 可以被动态或静态地编译成 Java字节码。
    4.PyQT Qt是一种开源的 GUI库,适合大型 GUI程序开发,PyQT是 Qt工具包标准的 Python 实现。我们也可以使用 Qt Desginer界面设计器快速开发 GUI 应用程序。

    今天主要介绍到的就是wxPython。wxpython是用Python写的跨平台GUI工具,通俗的理解就是用来写软件界面的包。它不是python的标准库,属于第三方库,需要我们手动进行安装。安装指令:pip install -U wxpython
    二、 wxpython库使用:
    1.wxpython使用的基本步骤:
    导入必须的wxPython包
    子类化wxPython应用程序类
    定义一个应用程序的初始化方法
    创建一个应用程序类的实例
    进入这个应用程序的主事件循环
    示例:
    import wx
    class App(wx.App):#子类化wxPython应用程序类
        def OnInit(self):
            #parent是必须的,其他参数都有默认值,也可以自己设置
            frame = wx.Frame(parent=None,title='GUI')
            frame.Show()#调用Show()方法可使得frame可见
            return True
    if __name__ == '__main__':
        app = App()
        app.MainLoop()  # 进入主事件循环
    2.frame窗口
    基本参数:
    parent = None #父元素,假如为None,代表顶级窗口
    id = None #组件的标识,唯一,假如id为-1代表系统分配id
    title = None #窗口组件的名称
    pos = None #组件的位置,就是组件左上角点距离父组件或者桌面左和上的距离
    size = None #组件的尺寸,宽高
    style = None #组件的样式
    name = None #组件的名称,也是用来标识组件的,但是用于传值
    示例:
    import wx
    class Frame(wx.Frame):#自定义的子类
        def __init__(self,parent=None,id=1,pos=wx.DefaultPosition,
                     title='这是第一个wxpython程序',size=(500,500)):
            #加载图片
            image = wx.Image('gauge1.png',wx.BITMAP_TYPE_PNG)
            temp = image.ConvertToBitmap()
            size = temp.GetWidth(),temp.GetHeight()
            wx.Frame.__init__(self,parent,id,title,pos,size=(500,500))
            self.bmp = wx.StaticBitmap(parent=self,bitmap=temp)
    class App(wx.App):
        def OnInit(self):
            self.frame = Frame()
            self.frame.Show()
            self.SetTopWindow(self.frame)
            return True
    if __name__ == '__main__':
        app = App()
        app.MainLoop()  # 进入主事件循环
    3.Button按钮:
    参数:
    parent = None #父元素,假如为None,代表顶级窗口
    id = None #组件的标识,唯一,假如id为-1代表系统分配id
    lable = None #按钮的标签
    pos = None #组件的位置,就是组件左上角点距离父组件或者桌面左和上的距离
    size = None #组件的尺寸,宽高
    style = None #组件的样式
    validator = None #验证
    name = None #组件的名称,也是用来标识组件的,但是用于传值
    示例:
    import wx
    class Frame(wx.Frame):#自定义的子类
        def __init__(self):
            super().__init__(parent=None, title="第一个GUI程序!", size=(400, 300))
            self.Center()  # 设置窗口居中
            panel = wx.Panel(parent=self)
            self.statictext = wx.StaticText(parent=panel, pos=(110, 15))
            #parent=panel表示把当前按钮放在面板中, id为当前按钮编号, label为按钮名, pos为按钮位置
            b1 = wx.Button(parent=panel, id=10, label='Button1', pos=(100, 45))
            b2 = wx.Button(parent=panel, id=11, label='Button2', pos=(100, 85))
            #将事件与事件处理函数绑定
            #EVT_BUTTON表示当前控件的时间类型, on_click表示触发该事件所调用的函数
            #id = 10, id2 = 20表示绑定id为10-20的控件
            self.Bind(wx.EVT_BUTTON, self.on_click, id=10, id2=20)
        def on_click(self, event):
            #获取当前事件的id号,根据id写对应的处理函数
            event_id = event.GetId()
            print(event_id)
            if event_id == 10:
                self.statictext.SetLabelText('Button1单击')
            else:
                self.statictext.SetLabelText('Button2单击')
    class App(wx.App):
        def OnInit(self):
            self.frame = Frame()
            self.frame.Show()
            self.SetTopWindow(self.frame)
            return True
    if __name__ == '__main__':
        app = App()
        app.MainLoop()  # 进入主事件循环
    4.TextCtrl文本框
    parent = None #父元素,假如为None,代表顶级窗口
    id = None #组件的标识,唯一,假如id为-1代表系统分配id
    value = None   #文本框当中的内容
            GetValue #获取文本框的值
            SetValue #设置文本框的值
    pos = None #组件的位置,就是组件左上角点距离父组件或者桌面左和上的距离
    size = None #组件的尺寸,宽高
    style = None #组件的样式
    validator = None #验证
    name = None #组件的名称,也是用来标识组件的,但是用于传值
    示例:
    class MyLogin(wx.Frame):
        def __init__(self):
            super().__init__(parent=None, title='FlexGrid布局', size=(400, 200))
            self.Centre()  # 设置窗口居中
            panel = wx.Panel(parent=self)
            #创建3×2大小的网格管理器,边界大小为10
            fgs = wx.FlexGridSizer(3, 2, 10, 10)
            title = wx.StaticText(panel, label="标题:")
            author = wx.StaticText(panel, label="作者名:")
            review = wx.StaticText(panel, label="内容:")
            tc1 = wx.TextCtrl(panel)
            tc2 = wx.TextCtrl(panel)
            #style代表窗口风格,TE_MULTILINE代表是多行格式的
            tc3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
            fgs.AddMany([title, (tc1, 1, wx.EXPAND),
                         author, (tc2, 1, wx.EXPAND),
                         review, (tc3, 1, wx.EXPAND)])
            #设置控件所占行和列的比例
            fgs.AddGrowableRow(0, 1)
            fgs.AddGrowableRow(1, 1)
            fgs.AddGrowableRow(2, 3)
            fgs.AddGrowableCol(0, 1)
            fgs.AddGrowableCol(1, 2)
            #把当前网格管理器放入一个水平Box管理器中,防止一些内容越界的问题,不是必要
            hbox = wx.BoxSizer(wx.HORIZONTAL)
            hbox.Add(fgs, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)
            #将Box管理器放入面板中
            panel.SetSizer(hbox)
    class App(wx.App):
        def OnInit(self):
            self.frame = MyLogin()
            self.frame.Show()
            self.SetTopWindow(self.frame)
            return True
    if __name__ == '__main__':
        app = App()
        app.MainLoop()  # 进入主事件循环
    5.RadioButton单选框和CheckBox复选框
    class MyLogin(wx.Frame):
        def __init__(self):
            super().__init__(parent=None, title='FlexGrid布局', size=(400, 200))
            self.Centre()  # 设置窗口居中
            panel = wx.Panel(parent=self)
            #创建3×2大小的网格管理器,边界大小为10
            fgs = wx.FlexGridSizer(3, 2, 10, 10)
            
            #
            title = wx.StaticText(panel, label="标题:")
            author = wx.StaticText(panel, label="作者名:")
            review = wx.StaticText(panel, label="内容:")

            tc1 = wx.TextCtrl(panel)
            tc2 = wx.TextCtrl(panel)
            #style代表窗口风格,TE_MULTILINE代表是多行格式的
            tc3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
            
            fgs.AddMany([title, (tc1, 1, wx.EXPAND),
                         author, (tc2, 1, wx.EXPAND),
                         review, (tc3, 1, wx.EXPAND)])
            
            #设置控件所占行和列的比例
            fgs.AddGrowableRow(0, 1)
            fgs.AddGrowableRow(1, 1)
            fgs.AddGrowableRow(2, 3)
            fgs.AddGrowableCol(0, 1)
            fgs.AddGrowableCol(1, 2)

            #把当前网格管理器放入一个水平Box管理器中,防止一些内容越界的问题,不是必要
            hbox = wx.BoxSizer(wx.HORIZONTAL)
            hbox.Add(fgs, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)
            
            #将Box管理器放入面板中
            panel.SetSizer(hbox)
    class App(wx.App):
        def OnInit(self):
            self.frame = MyLogin()
            self.frame.Show()
            self.SetTopWindow(self.frame)
            return True
    if __name__ == '__main__':
        app = App()
        app.MainLoop()  # 进入主事件循环
    6.下拉列表
    #下拉列表
    class MyList(wx.Frame):
        def __init__(self):
            super().__init__(parent=None, title='下拉列表', size=(400, 130))
            self.Center()  # 设置窗口居中
            panel = wx.Panel(self)
            #ComboBox下拉列表, 放到一个hbox中
            hbox1 = wx.BoxSizer(wx.HORIZONTAL)
            statictext = wx.StaticText(panel, label='选择你喜欢的编程语言:')
            list1 = ['Python', 'C++', 'Java']
            #style = wx.CB_SORT 对列表进行排序
            ch1 = wx.ComboBox(panel, -1, choices=list1, style=wx.CB_SORT)
            self.Bind(wx.EVT_COMBOBOX, self.on_combobox, ch1)
            hbox1.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
            hbox1.Add(ch1, 1, flag=wx.ALL | wx.FIXED_MINSIZE)
            #Choice下拉列表, 放到一个hbox中
            hbox2 = wx.BoxSizer(wx.HORIZONTAL)
            statictext = wx.StaticText(panel, label='选择性别:')
            list2 = ['男', '女']
            ch2 = wx.Choice(panel, -1, choices=list2)
            self.Bind(wx.EVT_CHOICE, self.on_choice, ch2)
            hbox2.Add(statictext, 1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)
            hbox2.Add(ch2, 1, flag=wx.ALL | wx.FIXED_MINSIZE)     
            #将两个hbox放到vbox中
            vbox = wx.BoxSizer(wx.VERTICAL)
            vbox.Add(hbox1, 1, flag=wx.ALL | wx.EXPAND, border=5)
            vbox.Add(hbox2, 1, flag=wx.ALL | wx.EXPAND, border=5)       
            #vbox放入面板中
            panel.SetSizer(vbox)
        def on_combobox(self, event):
            print('选择 {0}'.format(event.GetString()))

        def on_choice(self, event):
            print('选择 {0}'.format(event.GetString()))
    7.树
    class MyTree(wx.Frame):
        def __init__(self):
            super().__init__(parent=None, title='树控件', size=(500, 400))
            self.Center()  # 设置窗口居中

            splitter = wx.SplitterWindow(self)
            leftpanel = wx.Panel(splitter)
            rightpanel = wx.Panel(splitter)
            splitter.SplitVertically(leftpanel, rightpanel, 200)
            splitter.SetMinimumPaneSize(80)
            
            #创建树
            self.tree = self.CreateTreeCtrl(leftpanel)
            self.Bind(wx.EVT_TREE_SEL_CHANGING, self.on_click, self.tree)
            vbox1 = wx.BoxSizer(wx.VERTICAL)
            vbox1.Add(self.tree, 1, flag=wx.ALL | wx.EXPAND, border=5)
            leftpanel.SetSizer(vbox1)

            vbox2 = wx.BoxSizer(wx.VERTICAL)
            self.content = wx.StaticText(rightpanel, label='右侧面板')
            vbox2.Add(self.content, 1, flag=wx.ALL | wx.EXPAND, border=5)
            rightpanel.SetSizer(vbox2)

        def on_click(self, event):
            item = event.GetItem()
            self.content.SetLabel(self.tree.GetItemText(item))

        def CreateTreeCtrl(self, parent):
            tree = wx.TreeCtrl(parent)

            items = []
            #图像列表,存放wx.TreeCtrl使用的图片
            imglist = wx.ImageList(16, 16, True, 2)
            imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, size=wx.Size(16, 16)))
            imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, size=wx.Size(16, 16)))
            #保存wx.ImageList图像列表到树种,这样后续方法就可以图像列表中的索引了
            tree.AssignImageList(imglist)
            #添加根节点,返回节点类型为wx.TreeItemId, image为选中图像的索引
            root = tree.AddRoot("TreeRoot", image=0)
            #添加子节点
            items.append(tree.AppendItem(root, "Item 1", 0))
            items.append(tree.AppendItem(root, "Item 2", 0))
            items.append(tree.AppendItem(root, "Item 3", 0))
            items.append(tree.AppendItem(root, "Item 4", 0))
            items.append(tree.AppendItem(root, "Item 5", 0))
            
            for ii in range(len(items)):
                id = items[ii]
                tree.AppendItem(id, "Subitem 1", 1)
                tree.AppendItem(id, "Subitem 2", 1)
                tree.AppendItem(id, "Subitem 3", 1)
                tree.AppendItem(id, "Subitem 4", 1)
                tree.AppendItem(id, "Subitem 5", 1)   
            tree.Expand(root)  # 展开根下子节点, 若要展开所有子节点采用ExpandAllChildren(root)
            tree.Expand(items[0])  # 展开Item 1下子节点
            tree.SelectItem(root)  # 选中根节点
            return tree
    三、总结:
    wxpython还有很多的控件可以使用,这里就不在多说了,可以进官方网站查询https://wxpython.org/
     

  • 相关阅读:
    SqlBulkCopy - 批量写入数据库
    看到一本Spring源码笔记,里面的源码竟如此通俗易懂,原来是阿里产的
    ky10 server aarch64 离线安装openssl3.1.4
    Linux学习-70-启动引导程序(GRUB)加载内核的过程
    基于深度学习的目标检测和语义分割:机器视觉中的最新进展
    Tomcat的下载、安装和使用(超详细讲解)
    iOS开发 - Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!
    [附源码]java毕业设计高校设备采购审批管理系统
    2022牛客蔚来杯补题(第九场)
    453. 最小操作次数使数组元素相等
  • 原文地址:https://blog.csdn.net/a316495442/article/details/128012049