wxPython和pycairo练习记录17

wxpython图形用户界面编程 wxPython 提供了两种下拉列表控件类:wx.ComboBox 和 wx.Choice,wx.ComboBox 默认它的文本框是可以修改的,wx.Choice 是只读不可以修改的,除此之外他们没有区别。创建指定行数和列数的wx.GridSizer对象,并指定水平和垂直间隙,参数hgap为水平间隙,参数vgap为垂直间隙,整数类型。列表控件类是 wx.ListBox。同wx.GridSizer(rows,cols,vgap,hgap),gap参数指定垂直间隙和水平间隙,gap参数是wx.Size类型。 阅读详情

Animation.py 实现动画刷新逻辑,Sprite.py 绘制精灵图到窗口,直接照搬代码,基本不用改动,然后就可以用来加载精灵图了 https://github.com/mx0c/super-mario-python/blob/master/classes/Sprites.py

不要当过程完美主义者,很容易自我攻击。Sprites.py 的代码看着一大堆,其实就是读取精灵图的 json 配置文件,按配置截取图像并分别转换为 Sprite 对象,Sprite 和 Animation 职责有些混乱。这些数据的主要区别是参数名称不统一,动画的图像数据是多个图像组成的列表,所以映射统一名字了也要分静态图和动画两个部分,还是直接照抄吧。

测试的时候发现,读取 gif 格式图片会报错,每种图片数据格式都不一样,需要不同的处理程序,cairo 中除了 png 并没有相应的处理程序。同时还有一个问题,之前用 cairo 实现对图片缩放,明显变模糊了。按理说素材图片虽然是位图但因为是纯色,手动缩放显示都没问题,不知道为什么会这样,网上解释说是"Cairo 默认使用线性插值算法进行缩放操作,而线性插值会导致图像像素的颜色被平滑地混合,从而造成图像的模糊效果。"。

当然,cairo 的优势是绘制图形,还是先用 wxPython 处理吧。直接用 wx.Image 加载所有格式图片,调用 Scale 方法进行缩放,GetSubImage 方法截取图像,最后再转换成 cairo.ImageSurface(纯粹为了用 cairo)。

wx.Image 默认是 RGBA 字节集,主要用于加载和处理图像。wx.Bitmap 默认为可选 alpha 通道的 RGB 字节集,主要用于绘制和显示图像。详细介绍见 https://docs.wxpython.org/wx.Image.html
wx.Image 加载不透明图片,也会默认创建值为 255 的 alpha 通道。素材中的 characters.gif,用 wx.Image 加载后,调用 GetAlpha 方法发现得到不正确的透明通道值,而且 HasAlpha 得到的结果是 False,因为没有正确解释透明通道数据,RGB 数据也错了,加载后整个图片都变成了粉色。

import wx
app = wx.App()
image = wx.Image("./img/characters.gif")
print("---characters.gif---")
print("RGB data: ", tuple(image.GetData())[:20])
print("Alpha data", tuple(image.GetAlpha())[:20])
print(image.HasAlpha())

image2 = wx.Image("./img/tiles.png")
print("---tiles.png---")
print("RGB data: ", tuple(image2.GetData())[:20])
print("Alpha data", tuple(image2.GetAlpha())[:20])
print(image2.HasAlpha())

"""
---characters.gif---
RGB data:  (255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0)
Alpha data (192, 0, 50, 1, 168, 166, 98, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6)
False
---tiles.png---
RGB data:  (156, 74, 0, 255, 206, 198, 255, 206, 198, 255, 206, 198, 255, 206, 198, 255, 206, 198, 255, 206)
Alpha data (255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255)
True
"""

如果有兴趣可以自己尝试写一个能够正确解析数据的处理器 https://docs.wxpython.org/wx.ImageHandler.html ,这里还是直接用工具将 gif 转为 png 图片。

还有一些需要注意的点,比如 python 中 int 是向下取整,会直接舍弃小数,为了准确,在缩放尺寸时用 round 取近似值。

至此,每个精灵图都有了自己的名字,有点像物理魔法使马修给肌肉取名,莫名的喜感,调用的时候更直观。这个单元测试不知道该怎么写,简单测试输出所有处理后的 Sprite 图像,稍微调整一些坐标和尺寸,其中 koopa-hiding-with-legs 坐标完全不对,根据名字也不知道是哪个,后续再改。

from mario.classes.Sprites import Sprites
sprites = Sprites()
for name, sprite in sprites.sprite_collection.items():
    if sprite.animation is not None:
        # 动画默认显示第一帧
        surface = sprite.animation.image
    else:
        surface = sprite.image
    surface.write_to_png(f"./test/{name}.png")

Sprites

完整代码:

# Animation.py
class Animation:
    def __init__(self, images, idle_sprite=None, air_sprite=None, delta_time=7):
        self.images = images  # 动画逐帧图像 Surface 列表
        self.timer = 0  # 主程序刷新次数计次
        self.index = 0  # 当前动画帧索引
        self.image = self.images[self.index]  # 当前动画帧图像,默认显示第一帧
        self.idle_sprite = idle_sprite  # 空闲状态精灵图,奇怪的设定
        self.air_sprite = air_sprite  # 在空中状态精灵图
        self.delta_time = delta_time  # 动画图像更新间隔帧数

    def update(self):
        # 原程序设置了 FPS(Frames Per Second) 为 60 帧/秒,每 7 帧更新一帧动画图像,即 (1000 毫秒 / 60) * 7 约每 0.12 秒
        # 人的大脑视觉处理中心,大约会将看到的画面在视觉里暂留100至400毫秒,因此,当眼前的画面每秒变换十五次以上的时候,人的大脑就会有了“这是连续动作”的错觉。
        self.timer += 1
        if self.timer % self.delta_time == 0:
            # 头尾循环取动画图像
            if self.index < len(self.images) - 1:
                self.index += 1
            else:
                self.index = 0
            self.image = self.images[self.index]

    def idle(self):
        self.image = self.idle_sprite

    def in_air(self):
        self.image = self.air_sprite

# Sprite.py
from cairo import Context


class Sprite:
    def __init__(self, image, colliding, animation=None, redraw_background=False):
        self.image = image  # 调用 SpriteSheet.image_at 返回的 Surface
        self.colliding = colliding  # 碰撞,并未发现使用
        self.animation = animation  # Animation 实例,与 Sprite 构成关联关系(依赖像租房,关联像买房)
        self.redraw_background = redraw_background

    def draw_sprite(self, x, y, screen):
        # 背景 tile 尺寸 16*16,sprite json 配置文件中将每个精灵图都放大了 2 倍
        dimensions = (x * 32, y * 32)
        # screen 是表示窗口或屏幕的 Surface 对象。screen = pygame.display.set_mode(windowSize)
        # 因为牵涉到 screen 的定义,wxPython 和 pygame 是不同的,这里假定它为 Surface 对象,后续再修改
        ctx = Context(screen)
        if self.animation is None:
            surface = self.image
        else:
            self.animation.update()
            surface = self.animation.image
        # 将源 surface 绘制到窗口上
        ctx.set_source_surface(surface, *dimensions)
        ctx.paint()

# Sprites.py
import json
from mario.classes.Animation import Animation
from mario.classes.Sprite import Sprite
from mario.classes.SpriteSheet import SpriteSheet


class Sprites:
    def __init__(self):
        self.sprite_collection = self.load_sprites(
            [
                "./sprites/Mario.json",
                "./sprites/Goomba.json",
                "./sprites/Koopa.json",
                "./sprites/Animations.json",
                "./sprites/BackgroundSprites.json",
                "./sprites/ItemAnimations.json",
                "./sprites/RedMushroom.json"
            ]
        )

    @staticmethod
    def load_sprites(file_list):
        res_dict = {}
        for file in file_list:
            with open(file, "r") as json_data:
                data = json.load(json_data)
            ss = SpriteSheet(data["spriteSheetURL"])
            dic = {}
            if data["type"] == "background":
                for sprite in data["sprites"]:
                    dic[sprite["name"]] = Sprite(
                        ss.image_at(
                            sprite["x"],
                            sprite["y"],
                            sprite["scalefactor"],
                            sprite.get("colorKey", None)
                        ),
                        sprite["collision"],
                        None,
                        sprite["redrawBg"]
                    )
                res_dict.update(dic)
            elif data["type"] == "animation":
                for sprite in data["sprites"]:
                    images = []
                    for image in sprite["images"]:
                        images.append(
                            ss.image_at(
                                image["x"],
                                image["y"],
                                image["scale"],
                                sprite["colorKey"]
                            )
                        )
                    dic[sprite["name"]] = Sprite(
                        None,
                        None,
                        Animation(images, delta_time=sprite["deltaTime"])
                    )
                res_dict.update(dic)
            elif data["type"] == "character" or data["type"] == "item":
                for sprite in data["sprites"]:
                    xsize, ysize = sprite.get("xsize") and (sprite["xsize"], sprite["ysize"]) or data.get("size")
                    dic[sprite["name"]] = Sprite(
                        ss.image_at(
                            sprite["x"],
                            sprite["y"],
                            sprite["scalefactor"],
                            sprite.get("colorKey", None),
                            False,
                            xsize,
                            ysize
                        ),
                        sprite["collision"]
                    )
                res_dict.update(dic)
        return res_dict

# SpriteSheet.py
import wx
from wx.lib.wxcairo import ImageSurfaceFromBitmap
from mario.classes.Utils import Utils


class SpriteSheet:
    def __init__(self, filename):
        try:
            # 针对提示 ICCP:known incorrect sRGB profile 图像文件中的sRGB ICC配置文件信息被识别为不正确或已经损坏
            # wx.Log.EnableLogging(enable=False)
            wx.Image.SetDefaultLoadFlags(0)
            # cairo 不支持直接导入其他格式图片,这里通过 wxPython 处理
            self.sprite_sheet = wx.Image(filename)
        except Exception as e:
            print(str(e))
            raise SystemExit

    def image_at(self, x, y, scale=1, color_key=None, is_column_row=True, tile_width=16, tile_height=16):
        if is_column_row:
            # x, y 作为行和列,取精灵图范围
            rect = wx.Rect(x * tile_width, y * tile_height, tile_width, tile_height)
        else:
            # x, y 作为坐标,取精灵图范围
            rect = wx.Rect(x, y, tile_width, tile_height)

        # 从精灵序列图中提取指定区域并创建为新的 wx.Image
        image = self.sprite_sheet.GetSubImage(rect)

        # 缩放到指定尺寸
        if scale != 1:
            image = image.Scale(round(image.GetWidth() * scale), round(image.GetHeight() * scale))

        # 将处理过的 wx.Image 对象转换为 cairo.ImageSurface 对象
        surface = ImageSurfaceFromBitmap(image.ConvertToBitmap())

        # 处理透明色
        if color_key is not None:
            if color_key == -1:
                # 取 surface 像素数据
                data = surface.get_data()
                # 取 surface 第一个点 rgb 像素值
                color_key = tuple(data[:3])
            else:
                # surface data 实际排列为 bgra
                color_key = tuple(color_key[::-1])
            # 将 color_key 设为透明
            surface = Utils.set_colorkey(surface, color_key)

        return surface

WxPython——开始学习WxPython 本文介绍了WxPython图形界面开发的基础知识。首先展示了一个最简单的WxPython框架,包含导入模块、创建应用类、初始化方法等基本结构。然后逐步扩展,介绍了如何规范地创建Frame类和Panel面板,并在其中添加StaticText控件显示"Hello World"。文章重点讲解了WxPython的核心概念:应用程序对象、框架对象、主事件循环的工作原理,以及如何通过继承wx.App和wx.Frame类来构建GUI应用。最后通过一个完整的Hello World示例,演示了WxPyth 阅读详情

相关推荐

wxPython GUI开发完全指南:从基础到实践

wxPython是一个开源的Python库,它提供了一套丰富的GUI控件,方便开发人员创建桌面应用程序。它基于wxWidgets C++库,支持跨平台开发,包括Windows、Mac OS X和Linux。wxPython由Robin Dunn在1998年创建,它是对wxWidgets的Python封装,使得开发者能够利用Python语言的简洁性与易用性,实现复杂的用户界面。wxPython中的文本控件wx.TextCtrl是一个非常通用的控件,用于处理用户的文本输入。

weixin_42430341的博客 1927

wxPython入门中文版 (Getting Started with wxPython)

本文翻译自http://wiki.wxpython.org/Getting%20Started 首先声明:本人还是个菜鸟,翻译只是为了学习,就当作记笔记了。水平有限,错误和疏漏在所难免,希望各路高手能够给予指导。而且简单查了一下,好像中文世界目前还没有完整的翻译 Getting Started with wxPython 的。wxPython入门第一个应用程序:”Hello, World!”按惯例

然后呢 11万+

wxPython实战手册:从基础到高级GUI应用开发

Python是一种广泛使用的高级编程语言,以其代码可读性强和简洁著称。它支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。Python广泛应用于数据分析、网络爬虫、机器学习、Web开发、自动化脚本编写等多个领域。wxPython提供了丰富多样的控件(Widgets),这些控件是构成用户界面的基础元素。在构建桌面应用程序时,熟练使用和理解这些控件是必不可少的。以下列出了一些常用的wxPython控件及其功能:wx.Button: 最基本的按钮控件,用于触发事件。

weixin_42605397的博客 1010

wxpython使用简介_wxPython 教程(一) 简介

应用(application)是用来执行特定任务或一组任务的电脑程序。网页浏览器、媒体播放器、文字处理程序都是典型的应用样例。不同应用可以划分至四种不同的应用领域:在线商店应用、wiki、微博等都是受欢迎的网页(web)应用,我们通过网页浏览器可以访问它们。桌面(Desktop)应用的例子则包括 Maya、Opera、Open Office或 Winamp。企业级(Enterprise)应用则指复...

weixin_39611506的博客 1万+

threejs加载3dtiles(倾斜摄影)数据

1、安装3dTilesRenderer 插件 使用npm 安装 npm install 3d-tiles-renderer --save 或者去官网下载都行 GitHub - NASA-AMMOS/3DTilesRendererJS: Renderer for 3D Tiles in Javascript using three.js 2、使用 首先引入,在填入3dtiles数据的地址,可以是文件路径也可以是网站路径 const tilesRenderer = new TilesRend..

weixin_39481659的博客 1万+

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3017

wxPython:python首选的GUI库

跨平台的GUI工具库,较为有名的当属GTK+、Qt 和 wxWidgets 了。GTK+是C实现的,由于C语言本身不支持OOP,因而GTK+上手相当困难,写起来也较为复杂艰涩。Qt 和 wxWidgets 则是C++实现的,各自拥有庞大的用户群体。虽然我喜欢wxWidgets,但还是尽可能客观地搜集了关于Qt 和 wxWidgets 的对比评价。

Python作业辅导员 - 天元浪子 14万+

cosi-corr操作详细步骤

cosi-corr是一个可以加载到ENVI的软件包,由加利福尼亚理工学院的François Ayoub,  Sébastien Leprince,  and Lionel Keene开发,并且提供源代码,该软件受到了NSF的资助。软件的主要功能是可以满足各种影响的正射校正和影像配准。 针对下载下来的软件包参考《cosi-corr_guide.pdf》,进行配置使用具体详细过程如下: (本机环境

u013299471的专栏 1万+

wxpython 介绍

wxpython 基础知识介绍

qq_31644655的博客 2万+

BFD+OSPF+FRR:构建高可用网络的核心铁三角

摘要:VRRP、OSPF、BFD和FRR协同实现网络高可用。VRRP负责网关冗余,OSPF确保路由可达,BFD提供毫秒级故障检测,FRR实现快速路径切换。故障时,BFD立即检测并通知OSPF,FRR在OSPF收敛前切换流量,VRRP完成网关切换(如需)。BFD采用异步模式动态建立,效率最高。该机制确保业务流量无缝切换,提升网络可靠性。

A516988的博客 754

告别连接难题:Windows 11下Multisim主数据库稳定运行终极配置指南

本文详细解析了Windows 11下Multisim 14.0主数据库连接失败的三大根源,并提供了四步终极解决方案,包括系统环境优化、软件权限配置、注册表修复和网络验证绕过技巧。通过实测数据对比,本方案显著提升了启动速度和稳定性,解决了电子仿真中的常见连接问题。

weixin_33738555的博客 436

Python:界面开发,wx入门篇

如果你接触过桌面 GUI 软件开发,那么你一定会对 MFC、WPF、Qt 等有或多或少的了解。

2201_75362610的博客 4586

逆变器专题(3)-锁相环-PLL

锁相环作为并网逆变器的第一道门户,其锁相的精度将直接影响逆变器是否并网成功,若锁相精度较差,则会直接导致系统的功率因数下降,产生无功等等。在有关文献中指出,提高PLL带宽可以准确且快速进行锁相,而当电网电压含有谐波时,可适当降低带宽抵制谐波的干扰。成为变化量,而如果两者旋转速度达到一致时,所在的交轴分量。ki很大,即带宽很大时,稳定裕度不够,锁相环锁不住。为交流量,当频率锁定而相位没有锁定时,即。,即控制环前馈,可实现将锁相速度的加快。控为0,则可实现系统完美锁相。mod,取余,可减少存储空间。

cyc19980105的博客 6184

Python GUI应用程序开发之wxPython库详解

wxPython是一个强大的跨平台GUI工具包,它使用Python编程语言开发,提供了丰富的控件功能。如果你是一名Python开发者,而且希望创建一个功能齐全的桌面应用程序,那么wxPython是一个值得考虑的选择。wxPython是wxWidgets C++库的Python绑定版本,它支持各种操作系统,包括Windows、Linux和macOS。

Rocky006的博客 5833

模组 RG500Q入网问题分析

- [ ] 不同于公网,在5G专网环境中, 通常使用很多非标准的网络配置,如PLMN/APN等。因此,5G模组在专网环境下通常要做一些专门的配置才能正常入网,本文分析一例在专网环境, 5G终端无法入网问题的定位过程。 - [ ] 具体涉及到以下模组操作: 恢复出厂、SA only、锁BAND、配置MBN等

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 935

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 859

Python wxpython篇 | Python生态库之图形用户界面开发库 “wxPython “ 的安装及使用(附. 使用pyinstaller 库打包Python随机点名小程序程序.exe文件)

Windows cmd切换目录 C盘切换到D盘:d: 切换目录: cd 目标名 (tab键可以辅助补全) 返回根目录:cd / 退回上一级:cd … wxPython介绍 1、wxPython是Python语言的一套优秀的GUI图形库。wxPython可以很方便的创建完整的、功能键全的GUI用户界面。 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。 2、wxPython是跨平台的,可以在不修改程序的情况下在多种平台上运

Naiva的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

如何使用wxPython GUI平台插件,快速实现开发python简单Application桌面应用程序

目前市面上大部分的桌面应用都是C#、C++、Java进行开发,这边的话,不推荐大家使用wxPython进行开发桌面应用,当然纯属兴趣可以尝试。wxPython 是什么?官方介绍给出了介绍wxPython是一个用于Python编程语言的跨平台GUI工具包。它允许Python程序员创建具有健壮、功能强大的图形用户界面的程序,简单而容易。它被实现为一组Python扩展模块,用来包装流行的wxWidgets跨平台库的GUI组件,它是使用C++语言编写的。

唤醒手腕 4571

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

wxPython,一款强大的Python库

wxPython 为 Python 程序员提供了一个强大的 GUI 开发工具,易于学习和使用,能够创建跨平台的应用程序。通过丰富的控件和灵活的事件处理机制,可以轻松开发出功能丰富的桌面应用程序。

黑马非马的博客 4559

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python之wxPython框架的使用

一起学习wxPython框架如何使用(我小菜鸡,一起努力,咱们顶峰相见!!!)

精益求精,永无止境,永远在路上! 7083

Py之wxPython:wxPython的简介、安装、使用方法之详细攻略

wxPython是Python编程语言的跨平台GUI工具包。它允许Python程序员创建具有健壮、功能强大的图形用户界面的程序,而且简单、容易。它是作为一组Python扩展模块实现的,这些模块封装了流行的wxWidgets跨平台库的GUI组件,该库是用c++编写的。由于编程语言是Python, wxPython程序很简单,易于编写和理解。像Python和wxWidgets一样,wxPython是开源的,这意味着任何人都可以免费使用它,源代码也可以供任何人查看和修改。

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1万+

wxpython的简单使用【代码实现】

本章首先介绍了wxpython中几个比较常用的roi函数,并给出了其执行效果;其次总结了wxpython比较好用的一套框架;最终使用此框架搭建了一个比较晚上的前端界面平台。

weixin_44463519的博客 2654

python的GUI工具——wxPython(安装、基础使用)

python的GUI工具——wxPython(安装、基础使用)

Lvoc_w的博客 1379

用WxPython打造你的第一个 python 桌面应用

WxPython是一个强大的图形用户界面(GUI)库,它允许开发者使用Python语言来创建跨平台的应用程序。你能通过简单的代码,就能让程序拥有一个美观、直观的用户界面。 什么是WxPython? WxPython是Python编程语言的GUI工具包,它基于流行的跨平台库wxWidgets。WxPython提供了一组丰富的组件,用于构建具有本地外观和行为的桌面应用程序。

2301_76387166的博客 1286

Python wxPython 实战:从零打造企业级桌面应用

wxPython作为轻量高效的Python GUI框架,凭借原生外观、零授权风险等优势成为企业级桌面开发优选。本文系统讲解wxPython开发全流程: 环境搭建与基础控件 多系统安装指南及首个文本编辑器实现 核心布局管理器详解(Box/FlexGrid等) 交互与事件处理 三种事件绑定方式对比 常用事件类型速查表 企业级实战项目 数据查询工具完整实现(导入/查询/导出) 自定义网格组件开发 项目打包部署方案 最佳实践: 分层架构设计(UI/业务/数据分离) 异常处理与性能优化 跨平台适配要点 配套可运行代码

C++、Python、Linux、人工智能、车载开发、QT开发、AI绘画。 1192

实战wxPython: 001-安装wxPython

在创建GUI应用时,Python程序员可以在多个合适的选项中进行选择:PyGTK,wxPython和PyQt(或者PySide)是常见的几种Python 图形接口库。下面系列文件将介绍怎样使用wxPython在Python中进行GUI应用开发。wxPython是Python语言的一套GUI图形接口库,使用Python语言的开发者可以根据它快速创建GUI用户界面。

seniorwizard的专栏 5370
上一篇: wxPython和pycairo练习记录16
下一篇: wxPython和pycairo练习记录18
SmileBasic
博客等级 码龄5年 347粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值