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/
 

相关内容

热门资讯

蜻蜓订购APP贵金属订购非法期...   蜻蜓订购APP以"投资平台"名义对外宣传,主打贵金属期货(订购)交易。该平台一方面强调自身"正规...
悟空订购APP非法期货交易欺骗...   近期,有投资者反映,“悟空订购APP”等平台以白银、贵金属订购为名,宣传所谓“高收益”“低门槛”...
小赢淘金APP期货投资骗局,平...   “小赢淘金”之流,最擅长的就是用“注册送现金”、“充值返券”的糖衣炮弹来引流。别天真地以为那是福...
八方淘金APP非法期货交易欺骗...   警惕!八方生财、每日淘金、小赢淘金、悟空订购、蜻蜓订购、斗金订购等APP均涉嫌非法期货交易!  ...
智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...