WxPython——使用基本的控件

发布于:2025-08-03 ⋅ 阅读:(11) ⋅ 点赞:(0)

使用基本的控件

即使是一个简单的wxPython程序也需要使用标准的元素,诸如菜单和对话框。这儿有对于任一GUI应用程序的基本的建造部件。使用这些建造部件,还有像启动画面、状态栏或关于框等这些窗口部件,它们给你提供了一个更友好的用户环境,并且给了你的应用程序一个专业的感观。为了要结束本书的第一部分,我们将指导你通过一个程序的创建来使用所有所学的部分。我们将建造
一个简单的绘画程序,然后添加这些建造部件元素并说明使用它们时的一些问题。我们将巩固前面章节的基本原理和概念,并且最后我们将产生这个简单但专业的应用程序。

我们在本章将建造的这个应用程序基本上基于wxPython/samples目录中的涂鸦例子。这个应用程序是一个非常简单的绘画程序,当鼠标左键按下时它跟踪鼠标指针,并画线。

我们之所以要选择这样一个绘画例子,是因为它是十分简单的程序,它演示了在创建更复杂的应用程序时所引出的许多问题。在本章,我们将给你展示如何在屏幕上画线、添加状态栏、工具样以及菜单栏。你将会看到如何使用通用对话框,如文件选择器和颜色选择器。我们将使用sizer来布置窗口部件,并且我们也将增加一个关于框和一个启动画面。本章的最后,你将有一个很好看的绘画程序。

在屏幕上绘画

你的绘画程序的首先的工作是勾画线条并显示出来。像其它的GUI工具一样, wxPython提供了一套独立于设备的工具用于绘画。下面,我们将讨论如何在屏幕上绘画。

如何在屏幕上绘画

要在屏幕上绘画,我们要用到一个名为device context(设备上下文)的wxPython对象。设备上下文代表抽象的设备,它对于所有的设备有一套公用的绘画方法,所以对于不同的设备,你的代码是相同的,而不用考虑你所在的具体设备。设备上下文使用抽象的wxPython的类wx.DC和其子类来代表。由于wx.DC是抽象的,所以对于你的应用程序,你需要使用它的子类。

使用设备上下文

下面显示了wx.DC的子类及其用法。设备上下文用来在wxPython窗口部件上绘画,它应该是局部的,临时性的,不应该以实例变量、全局变量或其它形式在方法调用之间保留。在某些平台上,设备上下文是有限的资源,长期持有wx.DC可能导致你的程序不稳定。由于wxPython内部使用设备上下文的方式,对于在窗口部件中绘画,就存在几个有着细微差别的wx.DC的子类。第十二章将更详细地说明这些差别。

  • wx.BufferedDC:用于缓存一套绘画命令,直到命令完整并准备在屏幕上绘画。这防止了显示中不必要的闪烁。
  • wx.BufferedPaintDC:和wx.BufferedDC一样,但是只能用在一个wx.PaintEvent的处理中。仅临时创建该类的实例。
  • wx.ClientDC:用于在一个窗口对象上绘画。当你想在窗口部件的主区域上(不包括边框或别的装饰)绘画时使用它。主区域有时也称为客户区。wx.ClientDC类也应临时创建。该类仅适用于wx.PaintEvent的处理之外。
  • wx.MemoryDC:用于绘制图形到内存中的一个位图中,此时不被显示。然后你可以选择该位图,并使用wx.DC.Blit()方法来把这个位图绘画到一个窗口中。
  • wx.MetafileDC:在Windows操作系统上,wx.MetafileDC使你能够去创建标准窗口图元文件数据。
  • wx.PaintDC:等同于wx.ClientDC,除了它仅用于一个wx.PaintEvent的处理中。仅临时创建该类的实例。
  • wx.PostScriptDC:用于写压缩的PostScript文件。
  • wx.PrinterDC:用于Windows操作系统上,写到打印机。
  • wx.ScreenDC:用于直接在屏幕上绘画,在任何被显示的窗口的顶部或外部。该类只应该被临时创建。
  • wx.WindowDC:用于在一个窗口对象的整个区域上绘画,包括边框以及那些没有被包括在客户区域中的装饰。非Windows系统可能不支持该类。

得到文件信息

在有些情况下,你会需要读取客户的文件,比如在编辑或者上传文件的时候,一个文件上传的弹窗,其实这种文件上传的弹窗也是由对话框来实现的,它属于是一种特殊的对话框。

如何使用标准文件对话框?

大部分的GUI应用程序都要保存和载入这样那样的数据。考虑到你和你的用户,应该有一个简单的,方便的机制来选择文件。很高兴,为此wxPython提供了标准的文件对话框wx.FileDialog。
wx.FileDialog最重要的方法是它的构造器,语法如下:

wx.FileDialog(parent, message=”Choose a file, defaultDir=””,defaultFile=””, wildcard=*.*, style=0)

wx.FileDialog构造器的参数:

  • parent:对话框的父窗口。如果没有父窗口则为None。
  • message:message显示在对话框的标题栏中。
  • defaultDir:当对话框打开时,默认的目录。如果为空,则为当前工作目录。
  • defaultFile:当对话框打开时,默认选择的文件。如果为空,则没有文件被选择。
  • wildcard:通配符。指定要选择的文件类型。格式是<display>|<wildcard>。可以指定多种类型的文件,例如:固定的后缀(*.sketch),或者是所有的文件(*.*)
  • style:样式,具体的样式可选项如下所示:
    • wx.CHANGE_DIR:在用户选择了一个文件之后,当前工作目录相应改变到所选文件所在的目录。
    • wx.MULTIPLE:仅适用于打开对话框。这个样式使得用户可以选择多个文件。
    • wx.OPEN:这个样式用于打开一个文件。
    • wx.OVERWRITE_PROMPT:仅适用于保存文件对话框。显示一个提示信息以确认是否覆盖一个已存在的文件。
    • wx.SAVE:这个样式用于保存一个文件。

要使用文件对话框,要对一个对话框实例调用ShowModal()方法。这个方法根据用户所敲击的对话框上的按钮来返回wx.ID_OK或wx.ID_CANCEL。选择之后。使用GetFilename(), GetDirectory(), 或GetPath()方法来获取数据。之后,调用Destroy()销毁对话框是一个好的编程习惯。

下面这个案例是一个简单的打开一个文件并将内容显示到wxpython的窗口中的案例:

import os
# 导入os模块,用于获取当前工作目录

import wx
# 导入wx模块,用于创建和管理窗口

class MyFrame(wx.Frame):
    # 定义一个继承自wx.Frame的类MyFrame,用于创建应用程序的主窗口
    def __init__(self):
        # 初始化MyFrame类
        wx.Frame.__init__(self, None, -1, "MyFrame", size=(500, 600))
        # 初始化窗口,设置父窗口为None,ID为-1,标题为"MyFrame",大小为500x600像素

        panel = wx.Panel(self, -1)
        # 在窗口中创建一个面板,父窗口为self,ID为-1

        self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE, size=(480, 560))
        # 在面板上创建一个多行的文本控件,父窗口为panel,ID为-1,大小为480x560像素

        self.Font = wx.Font(40, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False)
        # 创建一个字体对象,设置字体大小为40,字体系列为默认,样式为正常,粗细为粗体,下划线为False

        self.text.SetFont(self.Font)
        # 将字体对象设置到文本控件中

        FileMessage = wx.FileDialog(panel, "Open file", os.getcwd(), wildcard="*.txt", style=wx.FD_OPEN)
        # 创建一个文件对话框,父窗口为panel,标题为"Open file",初始目录为当前工作目录,只允许选择.txt文件,模式为打开文件

        if FileMessage.ShowModal() == wx.ID_OK:  # 显示文件对话框并检查结果
        # 显示文件对话框,并检查用户是否点击了“确定”按钮
            filePath = FileMessage.GetPath()  # 获取选中的文件路径
            # 获取用户选择的文件的完整路径
            print(f"Selected file: {filePath}")
            # 打印选中的文件路径
            # 你可以在这里读取和处理文件
            with open(filePath, 'r', encoding='utf-8') as file:
            # 以只读模式打开文件,指定编码为utf-8
                content = file.read()
                # 读取文件内容
                print(content)
                # 打印文件内容
                self.text.SetValue(content)
                # 将读取的文件内容设置到文本控件中进行显示

        FileMessage.Destroy()  # 销毁文件对话框
        # 销毁文件对话框,释放资源

        self.Show()
        # 显示窗口

if __name__ == '__main__':
    # 检查是否作为主程序运行
    app = wx.App()
    # 创建wx.App对象,用于管理应用程序
    frame = MyFrame()
    # 创建MyFrame窗口实例
    app.MainLoop()
    # 进入应用程序的主事件循环,等待用户操作

他的效果如下所示:
在这里插入图片描述

选择要打开的文件,然后打开之后会将文件的内容读取到wxpython的窗口上:

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到