Python大佬手把手教你利用wxPython模块编写界面程序

wxPython是一个开发桌面端图形界面的跨平台函数库,开发语言为Python,它是基于C++的函数库wxWidgets的封装。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:961562169

wxpython有大量组件,它们可以从逻辑上(注意是逻辑上)这样划分:

(1)基础组件

这些组件为其所派生的子组件提供基础功能,通常不直接使用。

(2)顶层组件

这些组件相互独立存在。

(3)容器

这些组件包含其他组件。

(4)动态组件

这些组件可以被用户所交互编辑。

(5)静态组件

这些组件用来展示信息,无法被用户所交互编辑。

(6)其他组件

这些组件包括状态栏、工具栏、菜单栏等。

除了逻辑上的划分,各个组件之间还存在着继承关系,以一个button组件为例:

Button是一个小window,具体地,它是继承自wx.Control这一类的window(有些组件是window,但不是继承自wx.Control,比如wx.Dialog,更具体来说,controls这类组件是可放置在containers这类组件上的组件)。同时所有的windows都可以响应事件,button也不例外,因此它还继承自wx.EvtHandler。最后,所有的wxpython对象都继承自wx.Object类。

wxPython的“你好世界”

这个例子是wxPython的最小可用例子,用来say hello to the world:

import wx

app = wx.App()
frame = wx.Frame(None, title='Hello World')
frame.Show()

app.MainLoop()

麻雀虽小五脏俱全,该例子包含了最基本的代码和组件:

(1)首先导入wxPython库:

import wx

wx可视为一个命名空间,后面所有的函数和类都以它开头。

(2)创建应用实例:

app = wx.App()

每一个wxPython程序都必须有一个应用实例。

(3)创建应用框架并显示:

frame = wx.Frame(None, title='Hello World')
frame.Show()

这里创建了一个wx.Frame对象。wx.Frame是一个重要的“容器”组件,它用来承载其他组件,它本身没有父组件(如果我们给组件的parent参数设为None,即代表该组件没有父组件)。创建该对象后,还需调用Show方法才能显示出来。

wx.Frame的构造函数一共有七个参数:

wx.Frame(wx.Window parent, int id=-1, string title='', wx.Point pos=wx.DefaultPosition,
    wx.Size size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, string name="frame")

除了第一个parent参数需要显式指定,其余六个都有默认值,包括ID、名称、位置、尺寸和样式等。因此,可以通过改变这些参数来进一步地对该frame进行个性化定制。

(4)启动程序主循环:

app.MainLoop()

程序的主循环是一个无限循环模式,它捕获并分发程序生命周期内的所有事件。

菜单栏和工具栏

菜单栏

菜单栏主要由三部分组成:wx.MenuBar、wx.Menu和wx.MenuItem。

在菜单栏MenuBar中可以添加菜单Menu,在菜单Menu中又可以添加菜单项MenuItem。

添加完后不要忘了使用SetMenuBar来将菜单栏加入到框架中。

进一步地,在某个菜单Menu中,还可以添加子菜单SubMenu,然后继续添加菜单项。

还可以给菜单设置图标、快捷键、对wx.EVT_MENU事件的动作、菜单样式(打勾、单选)等。

上下文菜单

上下文菜单有时叫做“弹出菜单”,比如右键某个位置,出现上下文选项。

工具栏

工具栏的添加也是类似流程:先添加工具栏CreateToolBar,然后在上面添加工具AddTool。

别忘了使用toolbar.Realize()使之呈现出来(这一步与操作系统有关,Linux上不强制使用,Windows必须使用,为了跨平台性,最好将这一步明确写出)。

对于某个工具,可以设置逻辑使之Enable或Disable,常见的比如undo和redo,这两个按钮不是一直可以点的,在最开始时redo就必须是disabled,因为没有历史操作,所以可以设置具体的逻辑使之disable掉。

状态栏

状态栏即底部显示当前状态的状态条。

布局管理

布局可以分为绝对布局和布局管理器sizer。绝对布局有很多缺点,比如:

(1)组件的尺寸和位置不随窗口的改变而改变;

(2)不同平台上应用程序可能显示不同;

(3)字体的改变可能破坏布局;

(4)如果想改变布局,必须将之前的全部推翻。

因此,推荐使用布局管理器sizer来管理布局。

wxPython常用的sizer有:wx.BoxSizer、wx.StaticBoxSizer、wx.GridSizer、wx.FlexGridSizer、wx.GridBagSizer。

wx.BoxSizer

wx.BoxSizer是最常见的布局管理器。它的常用设置有:

(1)排列方向:wx.VERTICAL垂直排列还是wx.HORIZONTAL水平排列;

(2)排列比例:一个布局中所包含的组件的尺寸由其比例所决定,比例为0表示在窗口尺寸变化时保持尺寸不变,其他比例系数表示组件在该布局管理器中的尺寸占比;且通常使用wx.EXPAND旗标来使得组件占据管理器分配给它的所有空间;

(3)边界:组件的边界大小可以自定义设置,同时具体哪个边界(上下左右或全部)都可以任意指定;

(4)对齐方式:可以设定左端对齐、右端对齐、顶部对齐、底部对齐、中心对齐等多种对齐方式;

(5)在某一级容器组件中,使用SetSizer()来为其指定布局管理器;

(6)在布局管理器中用Add()方法来添加组件。

wx.StaticBoxSizer是在BoxSizer周围加上了一个静态文本框的显示。

wx.GridSizer

wx.GridSizer是网格布局管理器,可以设置几排几列以及横纵的间距,网格中的组件尺寸都是相同的。

(如果有的网格不需要添加组件,可以添加没有内容的StaticText作为占位符)

wx.FlexGridSizer

wx.FlexGridSizer与wx.GridSizer类似,但其更灵活,它不要求网格中所有的组件尺寸都相同,而是在同一行中的所有组件都高度相同,而同一列中的所有组件都宽度相同。

它还可以设置能growable的行和列,即在当前sizer中如果有空间,就将特定的行和列调整相应的大小来占据这个空间(注意将该行或列中的组件设为expandable)。

wx.GridBagSizer</

  • 17
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的用 wxPython 实现登录界面界面跳转的示例代码: ```python import wx class LoginPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) self.username_label = wx.StaticText(self, label='Username:', pos=(50, 50)) self.username_text = wx.TextCtrl(self, pos=(150, 50)) self.password_label = wx.StaticText(self, label='Password:', pos=(50, 100)) self.password_text = wx.TextCtrl(self, style=wx.TE_PASSWORD, pos=(150, 100)) self.login_button = wx.Button(self, label='Login', pos=(100, 150)) self.login_button.Bind(wx.EVT_BUTTON, self.on_login) def on_login(self, event): username = self.username_text.GetValue() password = self.password_text.GetValue() if username == 'admin' and password == 'admin': frame.switch_panel(LoginPanel, WelcomePanel) else: wx.MessageBox('Invalid username or password', 'Error', wx.OK | wx.ICON_ERROR) class WelcomePanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) welcome_label = wx.StaticText(self, label='Welcome!', pos=(50, 50)) class MainFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title='Login System', size=(300, 250)) self.Center() self.panel_dict = {} self.login_panel = LoginPanel(self) self.switch_panel(None, LoginPanel) def switch_panel(self, old_panel, new_panel_class): if old_panel: old_panel.Destroy() if new_panel_class in self.panel_dict: new_panel = self.panel_dict[new_panel_class] else: new_panel = new_panel_class(self) self.panel_dict[new_panel_class] = new_panel new_panel.Show() if __name__ == '__main__': app = wx.App() frame = MainFrame() frame.Show() app.MainLoop() ``` 在这个示例中,我们定义了两个面板:登录界面 `LoginPanel` 和欢迎界面 `WelcomePanel`。在登录界面中,我们添加了一个用户名输入框、一个密码输入框和一个登录按钮。当用户点击登录按钮时,我们获取输入的用户名和密码,如果用户名和密码都为 `admin`,则切换到欢迎界面;否则,弹出一个错误提示框。 我们还定义了一个 `MainFrame` 类,它继承自 `wx.Frame`,用于管理面板的切换。在 `MainFrame` 中,我们使用一个字典来保存已经创建的面板实例,这样可以避免重复创建。我们还定义了一个 `switch_panel` 方法,用于切换面板。当需要切换到一个新的面板时,我们先销毁旧面板,然后创建或从字典中获取新面板实例,最后显示新面板。 在 `MainFrame` 的 `__init__` 方法中,我们创建了 `LoginPanel` 面板并显示。在 `LoginPanel` 的 `on_login` 方法中,如果用户名和密码都为 `admin`,则调用 `frame.switch_panel` 方法将当前面板切换到 `WelcomePanel`。 通过这个示例,你可以了解到如何使用 wxPython 实现界面跳转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值