wxPython是一个用于Python编程语言的跨平台GUI工具箱。它是由Robin Dunn与Harri Pasanen和Edward Zimmerman在1995年开发的。wxPython有助于创建强大的图形用户界面,可以根据使用情况进行定制。它很容易,用户友好,而且简单易懂。
它是作为一组Python扩展模块实现的,这些模块包裹了流行的wxWidgets跨平台库的图形用户界面组件,该库是用C++编写的。它是内置在Python标准库中的Tkinter框架的替代品之一。
它是免费和开源的。wxPython是跨平台的,这意味着程序可以在多个平台上运行,而无需改变原始程序的源代码。目前,支持的平台包括微软Windows、Mac OS X和macOS,以及Linux或其他带有GTK2或GTK3库的类UNIX系统。
用wxPython创建一个键盘GUI应用程序
为了更好地理解它,让我们试着用wxPython创建一个小程序。这个应用程序的代码非常容易阅读。该应用程序使用了wxObject类,作为WxPython API中所有类的基类。
内容结构
- 应用程序代码分解
- 完整的应用程序
- 输出
- 总结
用wxPython创建GUI--一步一步来
- 安装wxPython
pip install wxPython
- 导入wxPython
import wx
- 创建一个wxPython应用程序并将其分配给变量 "app"。
app = wx.App()
- 创建一个**"Window "**类,它将继承来自wxPython API的 wx.Frame对象的所有属性和方法。
代码:
class Window(wx.Frame):
解释一下:
框架是一个窗口,其大小和位置可以由用户改变。它是作为一个输入表单使用的。它通常由一个标题栏和厚厚的边框组成。根据应用程序的要求,它可以选择包含一个菜单栏、工具条和状态栏。默认情况下,它是可调整大小的。应用程序的任何控件都不应该被创建为它的子对象,因为这些控件将在下面的代码中通过使用wx.Panel 来处理。
- **__init__ ()**构造函数
代码:
# Defining the default Constructor function
def __init__(self, title):
super().__init__(parent=None, title=title)
# Create a panel
self.panel = wx.Panel(self)
解释一下
首先,我们定义我们的构造函数。为init函数定义的唯一默认参数是我们应用程序窗口的标题,它将在代码的后面接受一个参数。wx.Panel包含我们应用程序窗口的所有控件。它应该作为框架的唯一子节点被创建,并作为实际控件的父节点。框架将确定面板的大小,使其始终充满客户端区域。
- wx.GridBagSizer()
代码:
# Define the grid sizer for our layout
sizer = wx.GridBagSizer(4, 3)
解释一下:
接下来,我们要用**wx.GridBagSizer(4,3)**为我们的窗口布局定义一个尺寸器。它可以在一个虚拟网格中布局项目,并接受可选的参数,指定行和列之间的间隙,单位为像素。虚拟网格的总大小是由项目定位的最大行和列决定的,并根据跨度进行调整。
- sizer.Add()
代码:
# Defining layout components
sizer.Add(
wx.StaticText(self.panel, label="My Keypad"),
pos=(0, 1),
flag=wx.ALIGN_CENTER,
)
sizer.Add(wx.Button(self.panel, label="1"), pos=(1, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="2"), pos=(1, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="3"), pos=(1, 2), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="4"), pos=(2, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="5"), pos=(2, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="6"), pos=(2, 2), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="7"), pos=(3, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="8"), pos=(3, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="9"), pos=(3, 2), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="*"), pos=(4, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="0"), pos=(4, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="#"), pos=(4, 2), flag=wx.EXPAND)
解释一下:
在代码的更远处,我们开始使用先前定义的sizer变量向我们的应用程序添加内容。sizer.Add() 在网格单元的sizer中添加一个项目, pos=(0, 1) 指定行和列的位置,使用wx.StaticText构造器为我们的面板定义标签**"My Keypad"**。wx.ALIGN_CENTER 是将我们的标签文本居中作为一个标志的排列枚举。
接下来,我们使用wx.Button构造函数将按钮添加到我们应用程序的布局中,所有的文本都是计算器。每个按钮的行和列的位置也要像上面那样被指定。最后,wx.EXPAND 确保了单个元素的扩展,占用了布局的全部空间:
- sizer.AddGrowableRow(), sizer.AddGrowableCol(), SetSizer(sizer)
代码:
sizer.AddGrowableRow(0)
sizer.AddGrowableRow(1)
sizer.AddGrowableRow(2)
sizer.AddGrowableRow(3)
sizer.AddGrowableRow(4)
sizer.AddGrowableCol(0)
sizer.AddGrowableCol(1)
sizer.AddGrowableCol(2)
self.panel.SetSizer(sizer)
解释:
**sizer.AddGrowableRow()**指定,如果有额外的空间可供izer使用,行的索引(从0开始)应该被增长,**sizer.AddGrowableCol()**指定,如果有额外的空间可供izer使用,列的索引(从0开始)应该被增长。
然后, **SetSizer(sizer)**被设置为面板窗口,所有的布局细节和规格。
- Center(), Show(), Window()和app.MainLoop()
代码:
self.Center()
self.Show()
window = Window("WxPython GUI Application Demo")
app.MainLoop()
解释一下:
**Center()**将窗口显示在屏幕中心,**Show()**显示构建的框架,**Window()**为应用程序设置标题,**app.MainLoop()**触发应用程序,为程序初始化GUI事件循环。
使用wxPython模块创建GUI的完整代码
代码:
# Create wxPython Application
app = wx.App()
class Window(wx.Frame):
# Defining the Default Constructor function
def __init__(self, title):
super().__init__(parent=None, title=title)
# Create a panel
self.panel = wx.Panel(self)
# Define Grid
sizer = wx.GridBagSizer(4, 3)
sizer.Add(
wx.StaticText(self.panel, label="My Keypad"),
pos=(0, 1),
flag=wx.ALIGN_CENTER,
)
sizer.Add(wx.Button(self.panel, label="1"), pos=(1, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="2"), pos=(1, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="3"), pos=(1, 2), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="4"), pos=(2, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="5"), pos=(2, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="6"), pos=(2, 2), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="7"), pos=(3, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="8"), pos=(3, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="9"), pos=(3, 2), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="*"), pos=(4, 0), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="0"), pos=(4, 1), flag=wx.EXPAND)
sizer.Add(wx.Button(self.panel, label="#"), pos=(4, 2), flag=wx.EXPAND)
sizer.AddGrowableRow(0)
sizer.AddGrowableRow(1)
sizer.AddGrowableRow(2)
sizer.AddGrowableRow(3)
sizer.AddGrowableRow(4)
sizer.AddGrowableCol(0)
sizer.AddGrowableCol(1)
sizer.AddGrowableCol(2)
self.panel.SetSizer(sizer)
self.Center() # Displays the window to the screen’s center
self.Show() # Shows the Frame
# Create Window
window = Window("WxPython GUI Application Demo")
# Execute the main GUI event loop
app.MainLoop()
输出
摘要
在这篇文章中,我们用wxPython创建了一个简单的GUI应用程序。wxPython工具包可以用来创建各种具有多种功能的GUI。代码本身非常简单,也很啰嗦。我希望这篇文章能帮助我们理解wxPython中使用的关键术语,并对其结构层次有一个大概的了解。