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/
 

相关内容

热门资讯

一季度增长12.2%后,王莉定... 来源:茅台时空 据茅台官微报道,茅台酱香系列酒一季度交出营业收入78.8亿元、同比增长12.2%的成...
曦智科技沈亦晨:将与上海国资联... 曦智科技创始人、董事长沈亦晨 图片来源:主办方供图 5月10日,上海曦智科技创始人、董事长沈亦晨出现...
东实环境“还贷式IPO”困境:... 图源:图虫创意 来源|时代商业研究院 作者|特约研究员赖钧洪、郑琳 编辑|郑琳 作为东莞市国资委10...
为什么是宁波?扛起中国五金出口... 中国作为全球最大的五金制品生产国和出口国,正以绿色转型、品牌出海为方向,在全球五金供应链中占据核心地...
微信:关于开展涉税虚假宣传信息... 近期,平台接到用户投诉举报,发现个别账户发布“纳税15万,国家补贴5万”“4月恢复核定征收”等涉税虚...
央视调查:AI“买家秀”误导消... IT之家 5 月 10 日消息,据央视新闻今日报道,在网购场景中,由于消费者无法直接接触商品,所以评...
(机遇香港)“温情经济”升温 ... 中新社香港5月10日电 (记者 邱兆翔)5月10日是母亲节。在香港,不少子女与父母一早出门饮茶庆祝,...
原创 3... 5月8日,彭博社一段视频访谈把华尔街炸了。有"新债王"之称的双线资本创始人冈拉克,公开承认自己已经在...
网点关停潮?一半全国性银行机构... 营业网点是商业银行经营的最小细胞,也是直接触达客户、创造价值的核心战场,其竞争力直接关系到银行经营效...
粮农组织:战火阴影下4月全球食... 来源:财联社 联合国粮农组织(FAO)周五指出,由于中东局势紧张及霍尔木兹海峡反复被封,全球粮食价格...
原创 帮... 老铁们,帮主又来了。今天聊个事儿,保证让你觉得,原来国家战略离你的钱包可以这么近!四部门刚发了个文,...
吸引全球资本,亚洲新一轮“超级... 投资者正将目光转向亚洲,寻找全球股市上涨行情的下一个突破口。 在人工智能浪潮驱动下,韩国股市本月涨幅...
越秀区多维经营账服务细致入微的... 越秀区多维经营账服务细致入微的代理机构参考 在广州越秀区这一商贸活跃的核心区域,中小企业对财税服务...
教人挣钱的自媒体平台叫什么 教人挣钱的自媒体平台叫什么?这问题问得太到位了。说实话,我也曾经翻遍全网、踩过无数坑,就为了找一个真...
湖人被无情戏耍又是三节崩 里夫... 与雷霆的半决赛打到第三场,一种无望的情绪已彻底裹挟了湖人全队,彻底无法被摆脱了。 所有人都清楚,湖人...
原创 欧... 据环球网综合报道,欧盟正处于前所未有的抉择压力之下。在俄乌冲突延续近四年的沉重阴影下,欧盟内部关于援...
原创 1... 雷达财经出品 文|丁禹 编|孟帅 五一假期刚刚结束,市值百亿的川酒上市公司水井坊,其核心管理层再次迎...
美银Hartnett:材料板块... 美银证券首席投资策略师Michael Hartnett在最新报告中点名材料板块,称其将是下一个“牛市...
情绪消费的好日子,还剩多久 文|强调Next 2025年是中国潮玩行业最热闹的一年,也是从业者最难熬的一年。 热闹是真的热闹。...