wxPython和pycairo练习记录2

AI安全攻防:十六进制编码与表情符号如何绕过ChatGPT安全限制 在人工智能安全领域,提示词工程是影响大语言模型行为的关键技术。其核心原理在于通过精心设计的输入文本,引导模型生成特定内容或执行特定任务。这项技术的价值在于能够深入探究模型的理解机制与决策边界,对于模型优化、安全测试及功能开发具有重要意义。在实际应用场景中,研究人员常利用编码转换、符号插入等方法构造输入,以测试模型安全护栏的鲁棒性。近期,一种结合十六进制编码与表情符号的组合攻击手法受到关注,该方法通过信息伪装与语义干扰,试图绕过模型内置的内容过滤机制,这凸显了当前AI安全在输入预处理与语义理解协同防御上面临的 阅读详情

wxPython和pycairo练习记录2

因为要实现图像的显示和交互,今天添加两个基础的图像容器类。

2.1 前置知识

成员属性访问权限

来源:https://blog.youkuaiyun.com/weiguang102/article/details/117020112

说明public(默认)privateprotected
同一个类中访问√√√
在子类中访问√×√
在类的外部访问√××

python中访问权限属性声明方式

权限格式(_为英文下划线)示例
publicvariableage = 18
private__variable__money = 0
protected_variable_hobby = [“sing”]

2.2 Sprite

Sprite 主要源于 zetcode 高级教程。

Sprite 的属性包括坐标、尺寸、图像、边框矩形和销毁状态。它并没有什么产生实际操作的方法,仅仅是属性和属性修改查询方法的集合。

class Sprite:
    def __init__(self, x, y, path):
        self._x = x
        self._y = y
        self._destroyed = False # 销毁状态

        # 从文件路径加载图像
        try:
            self._surface = cairo.ImageSurface.create_from_png(path)
        except IOError as e:
            print(e.message)

        # 获取图像尺寸
        self._width = self._surface.get_width()
        self._height = self._surface.get_height()

    def GetX(self):
        return self._x

    def SetX(self, x):
        self._x = x

    def GetY(self):
        return self._y

    def SetY(self, y):
        self._y = y

    def GetSurface(self):
        return self._surface

    def SetSurface(self, surface):
        self._surface = surface
        # 修改图像后,更新尺寸
        self._width = surface.get_width()
        self._height = surface.get_height()

    def GetRect(self):
        # 获取边框矩形对象,可用于碰撞检测等
        return wx.Rect(self._x, self._y, self._width, self._height)

    def IsDestroyed(self):
        return self._destroyed

    def Destroy(self):
        self._destroyed = True

2.3 MovieClip

参考 flash 的 MovieClip https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/MovieClip.html

MovieClip 继承自 Sprite ,因为仅仅是参考 flash ,这里仅仅保留一些需要的。根据这张坦克游戏图片素材,坦克宽高48,每行一个方向,每列一个动画帧,这里把每行作为一个场景。
tank_T1_0.png

和 Sprite 一样,构造参数需要初始绘制坐标,文件路径(每行一个场景的图片),还需要每帧图像显示的初始区域矩形(后面的帧只需要改变显示坐标)。

class MovieClip(Sprite):
    def __init__(self, x, y, path, rect, fps):
        super(MovieClip, self).__init__(x, y, path)

        self._scenes = [] # 保存所有场景,每个场景保存当前场景所有帧
        self._frames = [] # 保存当前场景所有帧
        self._currentScene = 0 # 当前场景索引
        self._totalScenes = 0 # 总场景数
        self._currentFrame = 0 # 当前帧索引
        self._totalFrames = 0 # 当前场景总帧数
        self._isPlaying = False # 播放状态
        self._fps = 1000 // fps  # 动画可能需要不同于主程序的FPS,这里换算成定时器的时间单位

        self.LoadFrames(rect)

2.4 完整代码

# -*- coding: utf-8 -*-
# display.py

import wx
import cairo

class Sprite:
    def __init__(self, x, y, path):
        self._x = x
        self._y = y
        self._destroyed = False # 销毁状态

        # 从文件路径加载图像
        try:
            self._surface = cairo.ImageSurface.create_from_png(path)
        except IOError as e:
            print(e.message)

        # 获取图像尺寸
        self._width = self._surface.get_width()
        self._height = self._surface.get_height()

    def GetX(self):
        return self._x

    def SetX(self, x):
        self._x = x

    def GetY(self):
        return self._y

    def SetY(self, y):
        self._y = y

    def GetSurface(self):
        return self._surface

    def SetSurface(self, surface):
        self._surface = surface
        # 修改图像后,更新尺寸
        self._width = surface.get_width()
        self._height = surface.get_height()

    def GetRect(self):
        # 获取边框矩形对象,可用于碰撞检测等
        return wx.Rect(self._x, self._y, self._width, self._height)

    def IsDestroyed(self):
        return self._destroyed

    def Destroy(self):
        self._destroyed = True


class MovieClip(Sprite):
    def __init__(self, x, y, path, rect, fps):
        super(MovieClip, self).__init__(x, y, path)

        self._scenes = [] # 保存所有场景,每个场景保存当前场景所有帧
        self._frames = [] # 保存当前场景所有帧
        self._currentScene = 0 # 当前场景索引
        self._totalScenes = 0 # 总场景数
        self._currentFrame = 0 # 当前帧索引
        self._totalFrames = 0 # 当前场景总帧数
        self._isPlaying = False # 播放状态
        self._fps = 1000 // fps  # 动画可能需要不同于主程序的FPS,这里换算成定时器的时间单位

        self.LoadFrames(rect)

    def LoadFrames(self, rect):
        # 按显示区域载入场景和帧
        x, y, width, height = rect

        # 每行表示一个场景scene,scene中每列表示一个frame
        try:
            for j in range(self._height // height):
                frames = []
                for i in range(self._width // width):
                    frame = self._surface.create_for_rectangle(x + width * i, y + height * j, width, height)
                    frames.append(frame)
                self._scenes.append(frames)
        except Exception as e:
            print(str(e))

        # 更新初始化变量
        self._surface = self._scenes[self._currentScene][self._currentFrame]
        self._totalScenes = len(self._scenes)
        self._totalFrames = len(self._scenes[self._currentScene])
        # create_for_rectangle 得到的 surface 获取到的宽高为0,这里直接使用矩形宽高
        self._width = width
        self._height = height

    def Play(self):
        self._isPlaying = True

    def Stop(self):
        self._isPlaying = False

    def PrevScene(self):
        self._currentScene -= 1
        self._isPlaying = False

    def NextScene(self):
        self._currentScene += 1
        self._isPlaying = False

    def PrevFrame(self):
        self._currentFrame -= 1
        self._isPlaying = False

    def NextFrame(self):
        self._currentFrame += 1
        self._isPlaying = False

    def GotoAndPlay(self, frame, scene):
        self._currentScene = scene
        self._currentFrame = frame
        self._isPlaying = True

    def GotoAndStop(self, frame, scene):
        self._currentScene = scene
        self._currentFrame = frame
        self._isPlaying = False

    def Update(self, times, speed):
        # 交给主程序执行,用于刷新 MovieClip 对象数据,主程序需要增加 times 用于记录主程序刷新次数
        # 主程序刷新速度要比 MovieClip 对象刷新快
        print("刷新次数:", times, "当前帧索引:", self._currentFrame)
        if times % (self._fps // speed) == 0 and self._isPlaying:
            self._currentFrame += 1

    def __setattr__(self, name, value):
        self.__dict__[name] = value
        # 更新 _currentFrame 和 _currentScene 时,同时更新相应变量
        if self.__dict__.get("_scenes"):
            if self.__dict__.get("_frames") and name == "_currentFrame":
                self._surface = self._frames[self._currentFrame % self._totalFrames]
            elif name == "_currentScene":
                self._frames = self._scenes[self._currentScene % self._totalScenes]
                self._totalFrames = len(self._frames)

# -*- coding: utf-8 -*-
# board.py
# 增加刷新次数记次 times

import wx
import wx.lib.wxcairo


class cv:
    """
    常量,用类属性避免使用全局变量
    """
    # 刷新定时器 id
    TIMER_ID = 1
    # 刷新次数
    times = 0
    # 刷新间隔时间 毫秒, FPS (frames per second) 就是 1000 // SPEED
    SPEED = 10
    # 面板尺寸
    BOARD_WIDTH = 800
    BOARD_HEIGHT = 600


class Board(wx.Panel):
    def __init__(self, parent):
        super(Board, self).__init__(parent=parent, style=wx.WANTS_CHARS) # wx.WANTS_CHARS 可接收键盘事件
        self.SetDoubleBuffered(True) # 双缓冲,防止闪烁
        self.InitVariables()
        self.BindEvent()

    def InitVariables(self):
        # 初始化变量
        self.InitSceneObjects()
        # 设置定时器
        self.timer = wx.Timer(owner=self, id=cv.TIMER_ID)
        self.timer.Start(cv.SPEED)

    def InitSceneObjects(self):
        # 初始化场景中对象变量,如坦克实例、计分栏初始分数等
        self.sceneObjects = []

    def BindEvent(self):
        # 绑定事件
        self.Bind(wx.EVT_TIMER, self.OnTimer, id=cv.TIMER_ID)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)

    def OnTimer(self, e):
        # 处理更新事件,定时更新变量,刷新重绘
        cv.times += 1

        for so in self.sceneObjects:
            so.Update(cv.times, cv.SPEED)

        self.CheckStrategies()
        self.Refresh() # 重绘,执行OnPaint

    def CheckStrategies(self):
        # 碰撞检测等
        pass

    def OnPaint(self, e):
        # 处理重绘事件
        dc = wx.PaintDC(window=self) # device context,设备上下文,相当于画布或虚拟的屏幕,
        ctx = wx.lib.wxcairo.ContextFromDC(dc) # 获取 cairo.Context 对象,同上

        self.DrawBackground(ctx)
        self.DrawSceneObjects(ctx)

    def DrawBackground(self, ctx):
        # 填充黑色背景
        ctx.set_source_rgb(0, 0, 0)
        ctx.paint()

    def DrawSceneObjects(self, ctx):
        # 绘制要显示的对象,如坦克、计分栏等
        pass

    def OnKeyDown(self, e):
        # 处理键盘按下事件
        pass

    def OnKeyUp(self, e):
        # 处理键盘弹起事件
        pass

2.5 效果

这里写了一个可控制方向的坦克,不同方向播放不同场景动画。并不完善,比如方向控制,边界检测,但基本达到要求。
在这里插入图片描述

# -*- coding: utf-8 -*-
# example2.py

import wx
import wx.lib.wxcairo
import cairo
import board
from display import MovieClip


class cv(board.cv):
    """
    常量,用类属性避免使用全局变量
    """
    # 面板尺寸
    BOARD_WIDTH = 600
    BOARD_HEIGHT = 400


class Tank(MovieClip):
    def __init__(self, *args, **kwargs):
        super(Tank, self).__init__(*args, **kwargs)
        self._speed = 10 # 移动速度
        self._dx = 0 # x 轴方向
        self._dy = 0 # y 轴方向

    def Up(self):
        self._dy = -1
        self._dx = 0
        self.GotoAndPlay(0, 0)

    def Down(self):
        self._dy = 1
        self._dx = 0
        self.GotoAndPlay(0, 1)

    def Left(self):
        self._dx = -1
        self._dy = 0
        self.GotoAndPlay(0, 2)

    def Right(self):
        self._dx = 1
        self._dy = 0
        self.GotoAndPlay(0, 3)


class Player(Tank):
    def __init__(self, x, y, path="tank_T1_0.png", rect=(0, 0, 48, 48), fps=100):
        super(Player, self).__init__(x, y, path, rect, fps)

    def OnKeyDown(self, e):
        key = e.GetKeyCode()

        if key == wx.WXK_UP:
            self.Up()
        if key == wx.WXK_DOWN:
            self.Down()
        if key == wx.WXK_LEFT:
            self.Left()
        if key == wx.WXK_RIGHT:
            self.Right()

        self._x += self._dx * self._speed
        self._y += self._dy * self._speed

    def OnKeyUp(self, e):
        key = e.GetKeyCode()

        if key == wx.WXK_UP or key == wx.WXK_DOWN:
            self._dy = 0
        if key == wx.WXK_LEFT or key == wx.WXK_RIGHT:
            self._dx = 0
        if self._dx == 0 and self._dy == 0:
            self.Stop()


class Board(board.Board):
    def DrawBackground(self, ctx):
        super().DrawBackground(ctx)

        text = "SmileBasic"
        ctx.set_font_size(40)
        _, _, w, h, _, _ = ctx.text_extents(text)
        x = (cv.BOARD_WIDTH - w) // 2
        y = (cv.BOARD_HEIGHT - h) // 2

        # 文字是以首个字左下角坐标定位,而矩形是以左上角定位,y轴相差文字的高度,不需要考虑线条宽度。
        # 另外PaintDC是不含标题栏的。
        ctx.rectangle(x - 10, y - 10 - h, w + 20, h + 20)
        ctx.set_source_rgb(1, 0, 0)
        ctx.stroke()

        ctx.move_to(x, y)
        ctx.set_source_rgb(1, 1, 1)
        ctx.show_text(text)

    def InitSceneObjects(self):
        super().InitSceneObjects()
        self.player = Player(50, 50) # 实例化一个玩家坦克
        self.sceneObjects.append(self.player)

    def DrawSceneObjects(self, ctx):
        ctx.set_source_surface(self.player.GetSurface(), self.player.GetX(), self.player.GetY())
        ctx.paint()

    def OnKeyDown(self, e):
        self.player.OnKeyDown(e)
        self.Refresh()

    def OnKeyUp(self, e):
        self.player.OnKeyUp(e)

PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】 PyQt5数据库开发3 6.1 QSqlQuery实操案例【多图详解】,本文有点长,主要每一个步骤都有对应的图文教程!!! 阅读详情

相关推荐

rbf神经网络python预测代码_RBF神经网络预测

%用RBF网络来预测股票走势clcclear%归一化数据input=[0 0 0 0 0 0.0277;0.0177 0.0292 0.0184 0.0122 0.0264 0.0492;0.0374 0.0946 0.0393 ...

weixin_39951419的博客 1889

wxPython和pycairo练习记录12

过年在家刷视频号直播时发现弹幕互动游戏,挺有意思的,刚好诠释了反射的用法。想要自己也做一个弹幕游戏,于是就有了这个基本的需求,先让弹幕滚动显示出来,直播时可以当作小挂件。

SmileBasic的博客 434

浅析MOS管导通过程及RC吸收电路设计要点

RC吸收电路 米勒电容 MOS导通过程

liangbo1999的博客 2万+

wxPython:调用OCR模块实现图片识别

(读者电脑中应安装有Canopy) 先下载tesseract-ocr模块: 将其安装在Canopy那个盘。 安装了之后,下载代码:pytesser_v0.0.1.zip 将代码解压至......\Canopy\User\Lib\site-packages 然后在Canopy内运行pytesser.py即可。 注意:要将代码中11,237,301,311行的路径修改成读者本机路径。

每天都要进步哦~ 1377

NVIDIA GPU任务调度全景:从Block分配到Warp发射

GPU并行计算的核心是任务调度,而CUDA kernel在GPU上的执行并非简单的一次性操作,而是经过从CPU命令队列到硬件前端,再到GigaThread引擎和Warp Scheduler的多层协同。理解这一过程,是性能优化的基础。Warp作为硬件调度的基本单位,其状态切换与延迟隐藏能力直接决定计算单元的利用率;而Occupancy作为衡量SM上活跃Warp池大小的指标,也并非越高越好,需要结合访存模式与资源占用综合判断。对于多任务并发场景,Stream优先级、计算抢占、MIG硬件隔离与MPS软件共享等机制

weixin_32612263的博客 270

YOLO26涨点改进 | 独家主干改进篇 | CVPR 2024 | YOLO26利用InceptionNeXt主干,将大核深度卷积分解为四个并行分支,在提升性能的同时显著降低计算效率

本文聚焦YOLO26的核心涨点改进——基于CVPR 2024收录的InceptionNeXt主干网络,深度拆解了其“大核深度卷积四分支拆解”的核心逻辑,通过实验验证了改进的有效性,同时提供了可快速复现的工程代码与进一步涨点的思路。

qq_36130719的博客 574

wxPython和pycairo练习记录6

这次想要实现障碍物。

SmileBasic的博客 330

NXP S32k3 MCAL EMIOS PWM配置

NXP s32k 配置 EMIOS PWM

Leon_0125的博客 2703

wxPython 示例项目指南

wxPython 示例项目指南 本指南将带您深入了解 wxPython-examples 开源项目,该项目由一系列wxPython示例构成,旨在帮助开发者学习如何利用wxPython库创建图形用户界面应用。我们将逐一解析其关键组件:目录结构、启动文件以及潜在的配置文件。 1. 项目目录结构及介绍 该开源项目遵循了清晰的目录结构来组织各个示例应用程序。下面是核心的目录结构概览: wxPython-e...

gitblog_00947的博客 380

PLC凸轮开关指令编程应用——控制算法

凸轮开关指令的作用是在PLC程序中根据凸轮开关(Cam Switch)的状态执行不同的操作。凸轮开关通常是机械式的开关装置,它的位置会随着机械运动的变化而改变。凸轮开关的状态可以用来检测机器的位置、角度或其他相关信息,从而触发相应的控制动作。总结起来,凸轮开关指令是PLC编程中常用的一种控制算法,通过检测凸轮开关的状态来触发相应的操作。本文将介绍凸轮开关指令的应用和相应的控制算法,并提供相关的源代码示例。在这个示例中,凸轮开关状态的值代表不同的位置,根据凸轮开关状态的不同,执行相应的动作。

LiJavascript的博客 1035

huggingface高速下载模型的实战代码

本文主要介绍了huggingface高速下载模型的实战代码,尤其是无法通过国内源进行下载的huggingface模型,希望能对学习大模型的同学们有所帮助。需要特别说明的是,本文的代码是完全原创的,即能够最大限度利用宽度的速度,而且还能实现断点续传。 文章目录 1. 背景 2. 实战代码

herosunly的博客 29万+

wxPython和pycairo练习记录18

Font.py 中 Font 类居然继承 Spritesheet 类来加载字符对应图片,还和 Sprites 类的功能差不多,总感觉哪里不太对。基本都没法写测试啊,后面待完成的是声音、鼠标键盘输入、碰撞检测、实体和主要显示类:面板、关卡、菜单、暂停画面。Camera.py 摄像机,这里的功能是记录坐标,跟随实体移动坐标。

SmileBasic的博客 396

路径跟踪 | 图解分析人工势场算法APF(附ROS C++/Python/Matlab仿真)

人工势场法的基本思想是在机器人运动环境中创建一个势场,再搜索一条势函数下降的方向,寻找一条无碰撞的最优路径。本文介绍APF算法的基本原理,并提供势场可视化实现,基于ROS C++/Python/Matlab进行算法仿真实验加深理解

FRIGIDWINTER的博客 7395

wxPython和pycairo练习记录10

一开始考虑不全面,后面写的时候就只有一个心思,烂代码,完成就好。代码创建控件实例是个痛苦的过程,因为做的基本都是重复的事,能用循环的最好写进循环,熟悉控件后推荐用 wxFromBuilder。

SmileBasic的博客 568

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

wxPython和pycairo练习记录8

经过障碍物的编写,发现需要停止前进并重新梳理一下。1.新的检测项加入时,已经在向混乱发展。是时候用上封装变化的编程工具,用策略模式或状态模式重写。2.显示,在基类引入层级和优先级,不同层低层级先绘制,同层高优先级先绘制。3.范围的碰撞和本身的碰撞的作用顺序。还有像已经实现的碉堡,只有一个外层碰撞区域,如果要多加几层呢,最外层出现坦克,射速为1,再近一层射速为5,最近一层射速达到20。

SmileBasic的博客 387

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

wxPython和pycairo练习记录1

学习,分为学和习,学完了不练习,让大脑觉得不重要,会忘记。所以,我决定练习并记录 wxPython 和 pycairo 的代码编写,如果你也想试试请自行配置环境。wxPython官网:https://www.wxpython.org/pycairo官网:https://cairographics.org/pycairo/本机环境:WIN10因为没有相关完整项目经验,所以不能把全局都设计好,先从基本的迭代。...

SmileBasic的博客 283

wxPython和pycairo练习记录3

现在的感觉像是学武功的人,对着一本秘籍瞎练,没有师父,也没有参照,不知对错。之前写的有很多混乱的地方,比如主 fps 对对象 fps 的作用,比如 MovieClip 对象 surface 的宽高及对继承方法 GetWidth 的影响,等等没有影响现有结果的地方。唯一检验的标准是,实现出想要的效果。这次想实现的是,在四个角生成敌方坦克,自动行驶,相互碰撞转向。...

SmileBasic的博客 354

wxPython和pycairo练习记录17

按理说素材图片虽然是位图但因为是纯色,手动缩放显示都没问题,不知道为什么会这样,网上解释说是"Cairo 默认使用线性插值算法进行缩放操作,而线性插值会导致图像像素的颜色被平滑地混合,从而造成图像的模糊效果。不要当过程完美主义者,很容易自我攻击。素材中的 characters.gif,用 wx.Image 加载后,调用 GetAlpha 方法发现得到不正确的透明通道值,而且 HasAlpha 得到的结果是 False,因为没有正确解释透明通道数据,RGB 数据也错了,加载后整个图片都变成了粉色。

SmileBasic的博客 897

wxPython和pycairo练习记录9

想要实现的效果是,同时按下多个方向,无论松开或按下其他键,总是响应剩余最近按下的键,这里直接用列表存储处在按下状态的按键代码。测试 wxPython 按下多个方向后松开最近按下的,之前保持按住的会失效。那就不能靠按键直接改变坐标,只改变速度方向,然后坐标的计算移动交给定时器刷新。射击按键行为也交给定时器,只改变状态,不执行操作。效果看起来还不错。之后可以看到,坦克和砖墙碰撞时的回弹问题也没有了。...

SmileBasic的博客 449

wxPython和pycairo练习记录13

之前虽然通过设置窗口样式去掉了标题栏,但是背景看起来还是有些碍眼。通过 SetTransparent 只能调整整体透明度,文字和背景都透明了。希望实现的效果是背景透明,而文字不透明。

SmileBasic的博客 560

wxPython和pycairo练习记录19

pygame.mixer.Channel 这里的声道和音频文件的声道含义不一样,这里的声道是指播放通道,0 为第一个声道。在 wxPython 中 wx.adv.Sound 只能播放 WAV 格式的文件,或者在 UI 中调用 wx.media.MediaCtrl 控件,但素材里的音频还有 OGG 格式的,没法用 wxPython 在后台播放。测试的时候,只有设置同步播放 wx.adv.SOUND_SYNC 才有声音,后面再修改,所有代码都完成了如果还是这样就再创建一个线程来播放声音。

SmileBasic的博客 1044

wxPython和pycairo练习记录4

继续写碰撞检测。

SmileBasic的博客 306

wxPython和pycairo练习记录11

了解事件机制是学习 wxPython 绕不过去的坎,结合各种资料和个人理解整理了一下,如果有问题请留言指出。

SmileBasic的博客 587

wxPython和pycairo练习记录14

继续之前的坦克游戏。碰撞检测技术像什么四叉树、凸包,看不懂啊,所以先从成熟的 pygame 框架里抠出几个能用到的。之前写坦克游戏并没有明确组合多个 Sprite 对象,还是先只考虑独立的 Sprite 吧。这样,需要用到和改写的方法只有 `collide_rect、collide_rect_ratio、collide_circle、collide_circle_ratio、collide_mask`。

SmileBasic的博客 263

wxPython和pycairo练习记录7

继续写障碍,选几个典型的来写。有个问题,有调用图片文件的类,每次生成新实例,都重新加载一次图片。应该把素材统一加载为全局变量,具体使用只需要引用素材变量。积重难返,记住这个教训,以后写其他的再注意吧。...

SmileBasic的博客 503

wxPython和pycairo练习记录15

像素:是指在由一个数字序列表示的图像中的一个最小单位,称为像素。这里的像素并非我们平时所说的眼睛看到的点,它更像是屏幕上的一个网格,不同的显示设备可能有不同大小的格子。在 Python 中,我们可以方便地通过一些库读取图像的某个像素值。这个例子中,返回的像素值是 RGBA 数值元组。

SmileBasic的博客 416

wxPython和pycairo练习记录5

先不管稀烂的坦克碰撞检测,开始添加武器系统。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值