python基础语法14-GUI编程2
admin
2024-02-14 14:30:01
0

一、简介
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/
 

相关内容

热门资讯

你手里有“睡眠卡”吗?银行在清... 银行业加强对长期不动户的管理并非等同于销户,且卡里的钱并不会被“清零”。
万科“22万科MTN005”宽... 1月27日,万科A(000002.SZ)公告,根据关于万科企业(02202.HK)2022年度第五期...
坦洲创投基金签约 市镇合作招大... 1月27日,中山坦洲创业投资基金合伙企业(有限合伙)项目签约仪式成功举行。该基金由坦洲镇属企业中山市...
被解雇的游戏公司CEO,把工作... 每当某些平台出现大规模崩溃,网络上总会流传出一段“内部人士”的聊天记录,其中有模有样地描绘了“删库跑...
原创 不... 75.8%关税砸懵加拿大菜农:键盘侠喊“不卖中国卖别人”,现实给了一记耳光 萨斯喀彻温省的清晨总飘...
设研院:预计2025年度净利润... 每经AI快讯,设研院1月27日晚间发布业绩预告,预计2025年归属于上市公司股东的净利润亏损1.36...
黄金价格暴涨暴跌,是走还是留? 澎湃新闻记者 孙铭蔚 黄金的“狂飙”还在持续。 1月26日,伦敦现货黄金再创下历史性突破,盘中触及5...
太突然!熊海涛女士被留置,控制... 1月26日晚,毅昌科技突然公告,董事会于2026年1月26日收到公司副董事长熊海涛的书面辞职报告,熊...
原创 敢... 美国与邻国加拿大的关系骤然降温,总统特朗普突然放出狠话,扬言若加拿大与中国达成贸易协议,将对其输美商...
我国将出台应对人工智能影响促就... IT之家 1 月 27 日消息,据新华社今日报道,从人力资源社会保障部获悉,我国将实施稳岗扩容提质行...
晶科能源大宗交易折价成交124... 晶科能源01月27日大宗交易平台共发生1笔成交,合计成交量124.97万股,成交金额768.55万元...
在岸人民币对美元开盘微跌,报6... 上证报中国证券网讯(记者 陈佳怡)1月27日,Wind数据显示,在岸人民币对美元开盘微跌,报6.95...
德风新征程再战港股IPO:两年... 来源:澎湃新闻 在首次上市申请被驳回之后,近日,北京德风新征程科技股份有限公司(简称“德风新征程”)...
最高80%!半导体公司相继宣布... 图片来源:图虫 中微半导体(深圳)股份有限公司是一家以微控制器(MCU)研发与设计为核心的平台型芯片...
近400亿美元!白银ETF单日... 白银ETF成交额从数月前的约20亿美元暴增至近400亿美元,几乎比肩标普500 ETF,意味着投机狂...
联想集团CFO:联想寻求比苹果... 联想正在全球范围内寻求与多家大型语言模型(LLM)供应商的合作,以驱动其设备,成为全球 AI 的重要...
市值突破90亿元!上市大卖一年... 全球经济复苏乏力,行业竞争日趋激烈,在这样的商业环境中,仍有部分企业凭借敏锐的洞察与果断的行动,实现...
全员得分+7人上双!辽宁狂胜四... 【搜狐体育战报】北京时间1月27日CBA常规赛第20轮,客场作战的辽宁本钢以109-57击败四川丰谷...
前程无忧报告:2026年企业预... 记者 田进 1月27日,人力资源服务商前程无忧51job发布的《2026离职与调薪调研报告》(下称《...
64岁“车灯女王”带队冲击“A... 瑞财经 王敏 1月26日,港交所文件显示,常州星宇车灯股份有限公司(以下简称“星宇股份”)向港交所递...