如何获取和设置鼠标指针(样式)?Cursor 指针对象使用说明
关注 1421
Pygame 中的 Cursor 对象
Pygame 包的Cursor
对象可用于表示游戏窗口中显示的鼠标指针,其构造器如下。
Cursor(constant)
Cursor(size, hotspot, xormasks, andmasks)
Cursor(hotspot, surface)
Cursor(cursor)
Cursor()
- constant 参数
constant
参数是一个表示系统鼠标指针的整数,你可以从pygame
模块中导入以SYSTEM_CURSOR_
开头的变量,并将其作为该参数的值,这将创建表示系统鼠标指针的Cursor
对象。- size 参数
size
参数是依次包含鼠标指针宽度和高度的整数序列对象,无论如何宽度和高度应是8
的倍数,比如(16,24)
。- hotspot 参数
hotspot
参数是依次包含鼠标指针作用点 X 坐标和 Y 坐标的整数序列对象。作用点是鼠标指针与其他内容进行交互的点,他应在鼠标指针大小范围内。当你设置了不同的作用点时,鼠标指针的显示位置将发生变化,在鼠标的实际位置保持不变的情况下。
- xormasks,andmasks 参数
xormasks
,andmasks
参数是包含鼠标指针异或运算掩码的整数序列对象,以及鼠标指针与运算掩码的整数序列对象。序列对象所包含的掩码的个数需要与size
参数所指示大小匹配。以上两个参数可通过
cursors
模块的compile
函数生成,具体请参考从字符串生成与鼠标指针有关的掩码一段。- surface 参数
surface
参数是包含了图像信息的Surface
表面对象,其表示的图像将显示为鼠标指针。- cursor 参数
cursor
参数是一个已有的Cursor
对象,将根据该对象创建新的Cursor
对象。你可以从cursors
模块中导入以下预先创建的类型为Cursor
的变量,arrow
,diamond
,broken_x
,tri_left
,tri_right
。
如果使用没有任何参数的构造器,那么其效果等同于Cursor(SYSTEM_CURSOR_ARROW)
。
# 导入 cursors 模块,Cursor 类和其他相关内容
from pygame import cursors, Cursor, SYSTEM_CURSOR_WAIT
# 创建表示系统等待指标的 Cursor 对象
c1 = Cursor(SYSTEM_CURSOR_WAIT)
# 根据预先定义的 Cursor 对象创建 Cursor 对象
c2 = Cursor(cursors.ball)
获取鼠标指针的信息
Cursor
对象的type
变量是表示鼠标指针类型的字符串,根据创建时所传递给构造器的参数的不同,type
的值可能是'system'
,'bitmap'
或'color'
。其中,'system'
对应采用Cursor(constant)
或Cursor()
创建的Cursor
对象,'bitmap'
对应采用Cursor(size,hotspot,xormasks,andmasks)
创建的Cursor
对象,'color'
对应采用Cursor(hotspot,surface)
创建的Cursor
对象。
cursor.type
Cursor
对象的data
变量是一个元组,元组包含创建该Cursor
对象所用到的数据。如果鼠标指针的类型不同,那么这些数据的含义可能也不同。
cursor.data
# …
# 显示 Cursor 对象 c1,c2 的类型和数据
print(c1.type, c1.data)
print(c2.type, c2.data)
system (2,)
bitmap ((16, 16), (7, 7), (0, 0, 3, 192, 15, 240, 24, 248, 51, 252, 55, 252, 127, 254, 127, 254, 127, 254, 127, 254, 63, 252, 63, 252, 31, 248, 15, 240, 3, 192, 0, 0), (3, 192, 15, 240, 31, 248, 63, 252, 127, 254, 127, 254, 255, 255, 255, 255, 255, 255, 255, 255, 127, 254, 127, 254, 63, 252, 31, 248, 15, 240, 3, 192))
复制鼠标指针
Cursor
对象的copy
方法,可用于复制鼠标指针,其返回值是一个与原有Cursor
对象一致的新的Cursor
对象。
cursor.copy()
- 返回值
copy
方法的返回值为新的Cursor
对象。
# …
# 复制之前创建的 Cursor 对象 c1
print(c1.copy())
<Cursor(type: system, constant: SYSTEM_CURSOR_WAIT)>
Pygame 中的 cursors 模块
Pygame 包的cursors
模块,包含一些用于帮助创建Cursor
对象的函数。事实上,Cursor
类定义在该模块中,但开发人员也可以通过pygame
模块来使用Cursor
类。
从字符串生成与鼠标指针有关的掩码
采用形式为Cursor(size,hotspot,xormasks,andmasks)
的构造器,Pygame 将创建仅支持黑白两种颜色的位图形式的鼠标指针(当然这似乎是一种非常过时的方法),其包含掩码的参数xormasks
和andmasks
可通过cursors
模块的compile
函数来产生。
compile(strings, black='X', white='.', xor='o')
- strings 参数
strings
参数是一个包含字符串的序列对象,这些字符串将指示鼠标指针中的像素的颜色,序列中的第一个字符串对应第一行像素,序列中每个字符串的第一个字符对应第一列像素,以此类推。你可以从cursors
模块中导入以下预先创建的类型为Cursor
的变量,arrow
,diamond
,broken_x
,tri_left
,tri_right
。无论如何,应确保每个字符串的长度,以及字符串的个数,与鼠标指针的大小一致,否则可能会引发异常。
- black 参数
black
参数用于指示表示黑色的字符,如果strings
参数包含的某个字符串中含有表示黑色的字符(空格表示没有颜色),那么鼠标指针中对应位置的像素将为黑色。- white 参数
white
参数用于指示表示白色的字符,如果strings
参数包含的某个字符串中含有表示白色的字符(空格表示没有颜色),那么鼠标指针中对应位置的像素将为白色。- xor 参数
xor
参数用于指示采用反转颜色的字符,如果strings
参数包含的某个字符串中含有表示反转颜色的字符(空格表示没有颜色),那么鼠标指针中对应位置的像素的颜色,将与系统颜色相反。如果反转颜色不被支持,那么对应的像素将为黑色。- 返回值
compile
函数的返回值是一个元组,其第一个元素是可用于创建Cursor
对象的,包含异或运算掩码的元组,其第二个元素是可用于创建Cursor
对象的,包含与运算掩码的元组。
在下面的示例中,我们用变量cross_strings
表示了一个十字形的鼠标指针,其中+
为其黑色部分,-
为其白色部分。
# 导入 cursors 模块,Cursor 类
from pygame import cursors, Cursor
# 表示十字的字符串元组
cross_strings = (
" ++ ",
" -- ",
" -- ",
"+--++--+",
"+--++--+",
" -- ",
" -- ",
" ++ ",
)
# 使用 compile 生成对应的掩码
(xormarks, andmarks) = cursors.compile(cross_strings, '+', '-')
# 创建表示十字的 Cursor 对象,大小 8x8,作用点在 4 4
Cursor((8, 8), (4, 4), xormarks, andmarks)
从 xbm 文件生成与鼠标指针有关的信息
cursors
模块的load_xbm
函数,可从xbm
文件生成与鼠标指针相关的信息(当然这似乎是一种非常过时的方法),这些信息可用于形式为Cursor(size,hotspot,xormasks,andmasks)
的构造器。
xbm 文件是什么?
xbm
文件是以文本来表示位图的文件,你可将其视为文本文件或图像文件,这种文件通常不在 Windows 系统中使用。
load_xbm(curs, mask)
- curs 参数
curs
参数是表示xbm
文件路径的字符串,或包含xbm
文件路径的类路径(path-like
)对象,或包含xbm
文件数据的IO
对象。- mask 参数
mask
参数与curs
参数类似,只不过,其对应的xbm
文件包含掩码信息。- 返回值
load_xbm
函数的返回值是一个元组,元组中元素的含义和顺序,与形式为Cursor(size,hotspot,xormasks,andmasks)
的构造器的参数一致。
获取和设置鼠标指针(样式)
如何在 Pygame 中自定义鼠标指针视频演示 YouTube如何在 Pygame 中自定义鼠标指针视频演示 Bilibili
Pygame 的cursors
模块并未包含获取或设置鼠标指针(样式)的函数,要完成该目标,你需要使用mouse
模块的get_cursor
和set_cursor
函数。其中set_cursor
函数的参数与Cursor
对象的构造器参数含义相同,因此,可参考Cursor 对象一段。
get_cursor()
- 返回值
get_cursor
函数返回当前鼠标对象所对应的Cursor
对象。
set_cursor(constant)
set_cursor(size, hotspot, xormasks, andmasks)
set_cursor(hotspot, surface)
set_cursor(cursor)
在下面的示例中,我们将图像文件candy.png
设置为了鼠标指针,其图像的中心为其作用点。
# 在运行脚本前,请将命令行跳转至 set_get.py 所在的目录
# 导入 mouse 模块和其他相关内容,并创建游戏窗口
from pygame import mouse, image, display, event, QUIT
display.set_mode((400, 300))
# 加载大小为 32x32 的图像
candy = image.load('candy.png')
# 将图像设置为鼠标指针,作用点在图像的中心
mouse.set_cursor((16, 16), candy)
print(mouse.get_cursor())
# 处理游戏中的事件
running = True
while running:
for e in event.get():
if e.type == QUIT:
running = False
<Cursor(type: color, hotspot: (16, 16), surf: <Surface(32x32x32 SW)>)>