热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python图形化界面库_Python三方库:wxPython(GUI图形用户界面)

wxPython是一套基于Python的第三方GUI插件,可用Python制作丰富的图形化界面程序。安装:pipinstallwxPython或者网站

wxPython是一套基于Python的第三方GUI插件,可用Python制作丰富的图形化界面程序。

安装:pip install wxPython 或者 网站下载安装https://pypi.org/project/wxPython/#files

demo和docs下载:https://extras.wxpython.org/wxPython4/extras/

997700-20190213215427594-1927706880.png

wxPython demo:

运行demo:直接cd到包路径,然后使用“python demo.py”或者“pythonw demo.pyw”。

wxPython中大部分控件的使用效果都可以在demo程序中看到,所以如果想要找某个效果的控件,就可以去demo程序中去找,第一次接触wxPython建议将demo程序的全部展示看一遍,以便以后用的时候方便找。另外,想要看demo的源代码,除了在demo程序中看,也可以使用PyCharm等工具直接打开对应文件包即可查看整个demo程序的源代码。

wxPython docs:

运行docs:直接使用浏览器打开文件夹中的index.html,然后就可以查找想要的文档信息了。

wxPython中控件的初始化方法、事件和各种方法在接口文档中都有详细的说明,或者你不知道某个控件有哪些方法时,也不妨去看看接口文档。

997700-20190216194133594-144855857.png

importwx#一般GUI程序的最外层框架使用wx.Frame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(None, -1, title='StaticBoxSizer Test')#新建一个panel,作为主面板

self.panel = wx.Panel(self, size=(250, 50))#新建两个按钮,用于弹出消息和关闭程序

self.btn_hello = wx.Button(self.panel, label='Hello World')

self.btn_exit= wx.Button(self.panel, label='Exit')#给按钮事件绑定按钮事件方法,不同的控件都有对应的事件,可查阅API文档DOCS

self.btn_hello.Bind(wx.EVT_BUTTON, self.on_helloworld)

self.btn_exit.Bind(wx.EVT_BUTTON, self.on_exit)#新建一个sizer用于界面布局,界面布局最好不使用pos参数写死,不然以后不好维护

self.box_sizer =wx.BoxSizer()

self.box_sizer.Add(self.btn_hello, 0, wx.ALL,10)

self.box_sizer.Add(self.btn_exit, 0, wx.ALL,10)

self.panel.SetSizer(self.box_sizer)#界面设计好后,如果使用到了sizer布局控件,一般需要使用Layout重新绘制界面

self.box_sizer.Layout()

self.panel.Layout()

self.Layout()#Fit方法使框架自适应内部控件

self.Fit()#事件方法,的第二个参数evt或者event一定不要忘了,不然这个方法会报错

#类中可能有很多个方法,事件方法建议约定一个容易识别的命名方式,比如我这里是以“on_”开头

defon_helloworld(self, event):"""弹出消息:Welcome to WxPython!"""

#新建一个消息弹窗,用于显示消息

wx.MessageBox('Welcome to WxPython!')defon_exit(self, evt):"""退出程序"""wx.Exit()if __name__ == '__main__':

app=wx.App()

myframe=MyFrame()

myframe.Show()

app.MainLoop()

进度条对话框

弹窗式进度条:wx.ProgressDialog

997700-20190214230812875-1231336331.png

wx.ProgressDialog为进度条显示弹窗,它的唯一的方法Update(value,newmsg=””),value参数是进度条的新的内部的值,调用update将导致进度条根据新的计数值与最大计算值的比例重绘。如果使用可选的参数newmsg,那么进度条上的文本消息将变为该字符串,这让你可以给用户一个关于当前进度的文本描述。Update方法返回两个参数“continue”和“skip”,分别默认返回“True”和“False”,在Update时,若用户点击过“Cancel”按钮(如果有)或者关闭了对话框,“continue”就返回的是“False”(可用于中断进度条),而“skip”只有点击了“Cancel”按钮后才会返回“True”。

GUI程序布局

虽然控件本身也可以使用pos参数来指定控件的位置,但是推荐使用wxpython的布局控件来进行布局,布局控件不仅能更好的展示布局效果,而且也方便日后的维护工作。

由于在demo和docs中不好直接看到布局控件的效果,以下介绍一些常用布局控件用法和效果:

简单网格布局控件:wx.GridSizer

997700-20190214232605320-1375689309.png

importwxclassMyFrame(wx.Frame):def __init__(self):

super().__init__(None, -1, title='GridSizer Test', size=(300, 400))#创建一个wx.GridSizer, 3行3列,行间隔5, 列间隔5

grid_sizer = wx.GridSizer(3, 3, 5, 5)for i in range(9):

panel = wx.Panel(self)

panel.SetMinSize((100, 100))#从左到右,从上到下,一次将控件wx.Panel添加到wx.GridSizer中

grid_sizer.Add(panel)#将wx.GridSizer与框架控件wx.Frame关联起来

self.SetSizer(grid_sizer)#使框架自适应内部控件

self.Fit()if __name__ == '__main__':

app=wx.App()

myframe=MyFrame()

myframe.Show()

app.MainLoop()

wx.GridSizer为简单网格布局控件,初始化时需要指定行数和列数,以及行和列之间的间隔。特点是每个“格子”的尺寸大小都是一样的,比较整齐,这里的格子指的是布局控件给定的空间,而不是放在格子中的控件的大小。

当窗口大小发生变化时,默认所有的格子都会随着发生变化。

如果格子中的控件的大小不一致时,则会以所有控件中最大的“长”和“宽”作为每个格子的尺寸大小。

使用Add方法在网格中添加控件时,只能按顺序添加控件。

更加灵活的网格布局控件:wx.FlexGridSizer

997700-20190216164218050-776436556.png

import wx

classMyFrame(wx.Frame):def __init__(self):

super().__init__(None, -1, title='FlexGridSizer Test', size=(300, 400))#创建一个wx.FlexGridSizer, 3行3列,行间隔5, 列间隔5

grid_sizer = wx.FlexGridSizer(3, 3, 5, 5)for i in range(9):

panel=wx.Panel(self)if i == 4:

panel.SetMinSize((200, 100))else:

panel.SetMinSize((100, 100))#从左到右,从上到下,一次将控件wx.Panel添加到wx.FlexGridSizer

grid_sizer.Add(panel)#指定第1列是可扩展的

grid_sizer.AddGrowableRow(1)#将wx.FlexGridSizer.Frame关联起来

self.SetSizer(grid_sizer)#使框架自适应内部控件

self.Fit()

if __name__ == '__main__':

app =wx.App()

myframe =MyFrame()

myframe.Show()

app.MainLoop()

wx.FlexGridSizer布局控件,相比于wx.GridSizer,更加灵活的地方在于,可以在某行或者某列上进行设置,即每一行或者每一列它的尺寸大小是独立的。

每一行(列)会以这一行(列)的最大的“长”(“宽”)作为这一行(列)的尺寸大小。

当窗口大小发生变化时,默认整个wx.FlexGridSizer是固定不变的,除非使用wx.FlexGridSizer的方法AddGrowableRow(AddGrowableCol)指定某行(列)是可以跟着窗口大小的扩展而扩展。

使用Add方法在网格中添加控件时,只能按顺序添加控件。

进阶的网格布局控件:wx.GridBagSizer

997700-20190216171720952-45984778.png

import wx

classMyFrame(wx.Frame):

def __init__(self):

super().__init__(None, -1, title='GridBagSizer Test', size=(300, 400))#创建一个wx.GridBagSizer, 行间隔5, 列间隔5

grid_sizer = wx.GridBagSizer(5, 5)for row in range(3):for col in range(3):

panel=wx.Panel(self)

panel.SetMinSize((100, 100))#wx.GridBagSizer的Add方法需要指定添加的位置

grid_sizer.Add(panel, pos=(row, col))#在第0行第3列,添加一个控件,占3行和1列的空间,wx.EXPAND表示控件扩展至填满整个“格子”的空间

panel_right =wx.Panel(self)

panel_right.SetMinSize((100, 100))

grid_sizer.Add(panel_right, pos=(0, 3), span=(3, 1), flag=wx.EXPAND)#在第3行第0列,添加一个控件,占1行和4列的空间,wx.EXPAND表示控件扩展至填满整个“格子”的空间

panel_bottom =wx.Panel(self)

panel_bottom.SetMinSize((100, 100))

grid_sizer.Add(panel_bottom, pos=(3, 0), span=(1, 4), flag=wx.EXPAND)#将wx.GridBagSizer.Frame关联起来

self.SetSizer(grid_sizer)#使框架自适应内部控件

self.Fit()

if __name__ == '__main__':

app =wx.App()

myframe =MyFrame()

myframe.Show()

app.MainLoop()

wx.GridBagSizer布局控件,相比于wx.FlexGridSizer和wx.GridSizer,多了两个特性,一是可以初始化时不用指定“格子”数量,在往“格子”中添加控件时可以不按顺序添加,直接指定控件添加的位置即可,二是一个“格子”可以跨越多个单元格显示。

当窗口大小变化时,与wx.FlexGridSizer一样,默认是不变的,需要自己指定哪行(列)是可扩展的。

此控件在使用Add方法时,必须指明添加的位置,即pos参数。

横向(纵向)布局控件:wx.BoxSizer

997700-20190216182352354-746889335.png

997700-20190216182436234-467590207.png

import wx

classMyFrame(wx.Frame):def __init__(self):

super().__init__(None, -1, title='BoxSizer Test', size=(300, 400))#创建一个wx.BoxSizer, 默认是wx.HORIZONTAL,即横向的

box_sizer =wx.BoxSizer()#也可指定为wx.VERTICAL,即纵向的

#grid_sizer = wx.BoxSizer(wx.VERTICAL)

for row in range(3):

panel=wx.Panel(self)

panel.SetMinSize((100, 100))#从左到右(从上到下)依次添加控件

#第二个参数为0时,窗口扩展时,格子尺寸不会变化,不为0时会跟着扩展变化

#wx.ALL表示所有边框(此处边框为5)

#wx.EXPAND表示控件填满整个“格子”

box_sizer.Add(panel, 1, wx.ALL | wx.EXPAND, 5)#将wx.BoxSizer.Frame关联起来

self.SetSizer(box_sizer)#使框架自适应内部控件

self.Fit()

if __name__ == '__main__':

app =wx.App()

myframe =MyFrame()

myframe.Show()

app.MainLoop()

wx.BoxSizer布局控件只能横向或者二纵向添加控件,默认是横向的,可以使用wx.BoxSizer(wx.VERTICAL)使之变为纵向的,并且没有特定的“格子”数,可以一直添加控件。

在窗口大小发生变化时,wx.BoxSizer只能横向或者纵向扩展。

在使用Add方法添加控件时,如果第二个参数proportion指定为0(默认),则“格子”在窗口大小变化时会保持不变,如果需要格子跟着扩展,一般可以指定为1。

带有标签和边框线的横向(纵向布局控件):wx.StaticBoxSizer

997700-20190216185836235-827166352.png

997700-20190216185457506-1318035807.png

import wx

classMyFrame(wx.Frame):def __init__(self):

super().__init__(None, -1, title='StaticBoxSizer Test', size=(500, 700))#新建一个wx.StaticBox(带有标签和边框线)

staticbox = wx.StaticBox(self, label="StaticBoxSizer Test")#wx.StaticBoxSizer初始化时需要传入一个wx.StaticBox,方向默认是横向

staticbox_sizer =wx.StaticBoxSizer(staticbox)#也可指定为wx.VERTICAL,即纵向的

#staticbox_sizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)

for row in range(3):

panel=wx.Panel(self)

panel.SetMinSize((100, 100))#从左到右(从上到下)依次添加控件

#第二个参数为0时,窗口扩展时,格子尺寸不会变化,不为0时会跟着扩展变化

#wx.ALL表示所有边框(此处边框为5)

#wx.EXPAND表示控件填满整个“格子”

staticbox_sizer.Add(panel, 1, wx.ALL | wx.EXPAND, 5)#这里单独在新建一个wx.BoxSizer是为了在界面中显示出wx.StaticBoxSizer的边框线

box_sizer =wx.BoxSizer()

box_sizer.Add(staticbox_sizer,1, wx.ALL | wx.EXPAND, 5)#将wx.BoxSizer.Frame关联起来

self.SetSizer(box_sizer)#使框架自适应内部控件

self.Fit()if __name__ == '__main__':

app=wx.App()

myframe=MyFrame()

myframe.Show()

app.MainLoop()

wx.StaticBoxSizer布局控件其实就是相当于在wx.BoxSizer外面套了一个wx.StaticBox,用法与wx.BoxSizer是相同的。

在wxPython中使用Matplotlib进行绘图

Matplotlib是一个用于绘图的Python三方库,可以绘制折线图、函数图、柱状图、饼图等多种图形。但是在wxPython中不能直接使用Matplotlib来进行绘图,需要使用Matplotlib提供给wxPython的接口matplotlib.backends.backend_wxagg来进行嵌入和绘制。

关于Matplotlib,可以参考我另一篇笔记:https://www.cnblogs.com/guyuyun/p/10486587.html

简单示例:

997700-20190318005124321-1529922127.png

#-*- coding:utf-8 -*-

importwxfrom matplotlib importpyplotfrom matplotlib.backends.backend_wxagg importFigureCanvasWxAggclassTestMpltFrame(wx.Frame):def __init__(self):

super().__init__(None, size=(650, 500), title='Test Matplotlib Frame')

self.panel=wx.Panel(self)#subplots默认返回一个Figure和一行一列的子图对象

self.fig, self.axe =pyplot.subplots()#使用FigureCanvasWxAgg来创建Figure的背景画布

self.canvas = FigureCanvasWxAgg(self, -1, self.fig)#绘制一条普通的折线图

self.x_data = [1, 2, 4]

self.y_data= [2, 5, 1]

self.axe.plot(self.x_data, self.y_data)if __name__ == '__main__':

app=wx.App()

test_mplt_frame=TestMpltFrame()

test_mplt_frame.Show()

app.MainLoop()



推荐阅读
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 如何在您的计算机上配置Python和PyCharm开发环境
    本文详细介绍了在Windows 10系统上配置Python和PyCharm开发环境的步骤。内容包括Python的安装与卸载、PyCharm的安装与卸载,以及如何在Windows 10中通过双击安装文件“python-3.7.2-amd64.exe”来完成Python的安装。此外,还提供了关于环境变量配置和基本设置的实用建议,帮助用户快速搭建高效的开发环境。 ... [详细]
  • PyTorch 使用问题:解决导入 torch 后 torch.cuda.is_available() 返回 False 的方法
    在配置 PyTorch 时,遇到 `torch.cuda.is_available()` 返回 `False` 的问题。本文总结了多种解决方案,并分享了个人在 PyCharm、Python 和 Anaconda3 环境下成功配置 CUDA 的经验,以帮助读者避免常见错误并顺利使用 GPU 加速。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 单元测试:使用mocha和should.js搭建nodejs的单元测试
    2019独角兽企业重金招聘Python工程师标准BDD测试利器:mochashould.js众所周知对于任何一个项目来说,做好单元测试都是必不可少 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • PyCharm 作为 JetBrains 出品的知名集成开发环境(IDE),提供了丰富的功能和强大的工具支持,包括项目视图、代码结构视图、代码导航、语法高亮、自动补全和错误检测等。本文详细介绍了 PyCharm 的高级使用技巧和程序调试方法,旨在帮助开发者提高编码效率和调试能力。此外,还探讨了如何利用 PyCharm 的插件系统扩展其功能,以满足不同开发场景的需求。 ... [详细]
  • Python 源代码文件应在何处进行编辑?[Python 常见疑问解答]
    Python 源代码文件的编辑有多种选择:1. 可以使用 Windows 自带的记事本进行简单编辑;2. 利用 Python 自带的 IDLE 集成开发环境;3. 采用功能更强大的第三方编辑器,如 Sublime Text、Visual Studio Code 等,这些编辑器通常具备语法高亮、自动补全等高级功能,能够显著提升开发效率。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • PyCharm调试技巧:开发者的实用指南
    PyCharm调试技巧:开发者的实用指南 ... [详细]
author-avatar
_Cokoice
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有