如何用Python创建图形用户界面

249 阅读5分钟

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中所有类的基类。

内容结构

  1. 应用程序代码分解
  2. 完整的应用程序
  3. 输出
  4. 总结

用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中使用的关键术语,并对其结构层次有一个大概的了解。