wxPython界面开发总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mist99/article/details/80742548

1、GUI编程概述

Python需要界面么?

大多数情况下是不需要的,但是如果要给非开发者用,那么有个界面还是必要的。只需要掌握一种基本的界面开发方法,就能应付大多数情况。

wxPython学习目标
界面编程并非Python核心,也不是它的优势,所以准备的是两天时间,选择一种Python的GUI来学习,基本就能满足需要了。
Python的界面实现方案很多,说说主流的三种方案,Tkinter(Python自带)太丑,pyQt太复杂,相对来说wxPython比较适中,也是我选择的方案。
定义的学习目标如下:

  • 掌握wxPython的控件和基础用法,知道从哪儿找资料。
  • 照着教程快速做几个小应用,熟悉wxPython的应用流程。

wxPython介绍

  • wxPython是wxWidgets在Python语言下的封装。
  • wxWidgets是一个跨平台的GUI 应用编程接口,使用C++编写。
  • 图形界面风格与系统的风格相似。
  • 编码风格类似于windows原生,复杂性低于pyQt

2、wxPython环境

直接开发,只需要安装wxPython就可以了

pip install -U wxPython
下载链接:http://www.wxpython.org/download.php#msw

wxPython也有一些可视化开发环境,比如:

  • wxFormBuilder
  • wxDesigner
  • wxGlade
  • BoaConstructor
  • gui2py

ps:我尝试过一些,感觉不是很好用,还是直接敲代码更方便。

3、wxPython的基础

一个简单的界面应用程序构建步骤:

  • 导入 wx 模块
  • 定义应用程序类的一个对象
  • 创建一个顶层窗口的 wx.Frame 类的对象。 给出构造标题和尺寸参数。
  • 虽然其他控件可以在Frame对象加入,但它们的布局无法管理。因此,把一个Panel对象到框架。
  • 添加一个静态文本对象,以显示 ‘Hello World’在窗口内的任意位置。
  • 通过show()方法激活框架窗口。

最简单的例子:

import wx

app = wx.App()
window = wx.Frame(None, title="wxPython 你好!", size=(400, 300))
panel = wx.Panel(window)
label = wx.StaticText(panel, label="Hello World", pos=(100, 100))
window.Show(True)
app.MainLoop()

这里写图片描述

4、wxPython控件

  • wx.Frame

    wx.Frame类是不带参数的默认构造函数。

  • wx.Panel

    wx.Panel类通常是一个放入wxFrame中的对象。 这个类也继承自wxWindow类。

  • wx.StaticText

    wx.StaticText类对象提供了一个控制持有比如只读文本。它可以被称作被动控制,因为它不产生任何事件。

  • TextCtrl

    在wxPython中,wx.TextCtrl类对象用于于此目的。它控制在其中可以显示文本和编辑。

  • RadioButton & RadioBox

    每个按钮,wx.RadioButton类的一个对象携带旁边有一个圆形按钮文本标签。wxPython的API还包括wx.RadioBox类。它的对象提供了一个边框和标签组。

  • wx.CheckBox

    一个复选框显示一个小标记的矩形框。单击时,复选标记出现在矩形内,指示作出选择。

  • ComboBox & Choice Class

    一个wx.ComboBox对象提供选择项目列表。它可以配置为一个下拉列表或永久性的显示。wxPython的API包含一个wx.Choice类,其目的也是一个下拉列表中,这是永久只读。

  • Wx.Gauge

    Wx.Gauge类对象表示垂直或水平条,其中以图形方式显示递增量。

  • wx.Slider

    wxPython的API包含wx.Slider类。它提供了滚动条相同的功能。滑动器提供了一个方便的方式来处理由滑块具体wx.EVT_SLIDER事件绑定拖动句柄。

  • wx.MenuBar

    略低于顶层窗口的标题栏中的横条保留,以显示一系列菜单。这是wx.MenuBar类在wxPython API的对象。

  • wx.Toolbar

    如果wx.Toolbar对象的样式参数设置为wx.TB_DOCKABLE,它成为可停靠。浮动工具栏还可以用wxPython中的AUIToolBar类构造。

  • wx.Dialog

    虽然一个对话框Dialog类对象出现像Frame,它通常被用作上的父框架的顶部上的弹出窗口。一个对话框(Dialog)的目的是从用户收集一些数据并将其发送到父帧(frame)。

  • wx.Notebook

    wx.Notebook小部件提供了一个标签式的控制。在一个帧(Frame)中的一个笔记本对象具有一个或多个切换标签(称为页),其中每一个具有一个面板显示出的控制布局。

  • wx.SplitterWindow

    这个类的对象是一个布局管理器,它拥有两个子窗口,大小可以通过拖动它们之间的边界动态变化。分离器控制给出了可拖动来调整控件的句柄。

  • HTMLWindow

    wxHTML库中包含用于解析和显示HTML内容。 虽然这不打算成为一个全功能的浏览器,wx.HtmlWindow对象是一个通用的HTML浏览器。

  • ListBox & ListCtrl

    一个wx.ListBox控件呈现字符串的垂直滚动列表。 默认情况下,在列表中的单个产品选择。ListCtrl控件是一个高度增强列表显示和选择工具。多个列的列表可以显示在报表视图,列表视图或图标视图。

5、wxPython事件

函数或方法响应于点击按钮,调用事件选择相应的处理函数,用户的操作被执行。应用程序的运行时期间发生的某个事件数据被存储为来自wx.Event衍生的子类的对象。
例如,要调用一个按钮的点击事件的程序上的 OnClick()方法

self.b1.Bind(EVT_BUTTON, OnClick)

bind()方法是通过从wx.EvtHandler类的所有显示对象继承。EVT_BUTTON这里是绑定器,其中关联按钮单击事件的 OnClick()方法。

在wxPython中事件是两种类型的。基本事件和命令事件。大多数 wxWidgets生成命令事件。

  • 基本事件
    一个基本的事件停留在它起源的窗口。比如移动窗口的 OnMove 事件

    self.Bind(wx.EVT_MOVE, self.OnMove)

  • 命令事件。
    命令事件可以传播到一个或多个窗口,类层次结构来源于窗口上方。比如点击按钮的 OnButtonClicked)事件

    self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)

6、wxPython布局

wxPython的布局又包含绝对布局和相对布局两种方式。绝对布局需要定义每一个控件的位置坐标,方法单一繁琐,很难实际应用。所以,主要的布局方式都是采用相对布局。wxPython提供了一系列的布局管理器,被称为Sizer,它们都继承至wx.sizer基类。

  • BoxSizer

    sizer允许控件排放在按行或列的方式。BoxSizer布局是由它的定位参数(wxVERTICAL或wxHORIZONTAL)确定。

  • GridSizer

    顾名思义,一个GridSizer对象呈现二维网格。控件被添加在网格槽以左到右和由上到下方顺序。

  • FlexiGridSizer

    这种sizer 也有一个二维网格。它提供灵活性布局中的控制单元。

  • GridBagSizer

    GridBagSizer是一种多功能sizer。它比FlexiGridSizer提供了更多的增强功能。子构件可被添加到网格中的指定单元格。

  • StaticBoxSizer

    StaticBoxSizer把一个盒子sizer放到静态框。它提供了围绕框边界以及顶部标签。

7、多线程

在上面介绍中,我们都是在主线程操作,实际应用中,多线程是必要的:

  • 不用多线程可能会导致图形界面卡死
  • 多线程可以使程序以更高效率运行
  • 多线程可以让程序做更多的事

简单用法:

import threading
def ThreadBatchUpLoad(self,arg):
    print("thread run")

def Onclick(self,event):
    t1 = threading.Thread(target=self.ThreadBatchUpLoad, args=(event,))
    t1.start()

8、题外话

基本熟悉了wxPython了用法,但是开发的方便程度和界面的美观度,都是不满意的。从知乎、博客等各大渠道收集的信息来看,Python下如果要做界面展示和提供给普通用户使用,最好的方案是

Web前端+Python后端 = Python GUI应用

这才是最能发挥Python优势,效果也最好的方案。

9、参考网址

猜你喜欢

转载自blog.csdn.net/mist99/article/details/80742548