我正在尝试在 Kivy 应用程序中创建自定义光标。我从将 Kivy 小部件的位置与光标位置联系起来的角度来研究它。然而,这种方法非常挑剔,而且不太干净。如果最坏的情况发生,我可以坚持这种方法,但我很好奇是否有一种方法可以在 Python 本身中创建自定义光标。
我看过无数在 Python 中创建自定义光标的示例,我发现的所有示例都需要销毁并重新创建实际的 Windows 光标。我发现的每个例子都强烈反对这种方法,因为如果您在重新创建光标之前退出程序,那么它显然不会重新创建自身,并且您将留下自定义光标(可以手动重置,但我的程序是供客户使用)。我知道你可以在 Python 中将光标设置为十字准线、手形光标和选定的各种光标,但我想使用实际的图像作为光标。
以下是销毁并重新创建光标的代码示例(建议避免使用该方法)。这段(工作)代码可以在 如何在 Python 中更改光标图像 的答案中找到。
hold = win32gui.LoadImage(0, 32512, win32con.IMAGE_CURSOR,
0, 0, win32con.LR_SHARED )
hsave = ctypes.windll.user32.CopyImage(hold, win32con.IMAGE_CURSOR,
0, 0, win32con.LR_COPYFROMRESOURCE)
hnew = win32gui.LoadImage(0, 'file.cur',
win32con.IMAGE_CURSOR, 0, 0, win32con.LR_LOADFROMFILE);
ctypes.windll.user32.SetSystemCursor(hcursor, 32512)
time.sleep(5)
#restore the old cursor
ctypes.windll.user32.SetSystemCursor(hsave, 32512)
我的答案是否在于对上述代码的改编?或者有更好的方法吗?我知道必须可以在 Python 中设置自定义光标,我只是在我访问的每个源中都拉出空白。
附注我提前对我的问题表示歉意,这是我在 Stack 上的第一个问题,哈哈。
对于您的回复,我深表歉意,因为这是我的第一个回答。 我要写的内容可能与您不再相关,但无论如何我都会这样做,所以如果有人仍然需要答案,可能会在我解决这个问题的方法中找到帮助。
首先,我所做的是使用实现的函数隐藏光标
Window.show_cursor = False
(因为我只需要在特定屏幕中使用自定义光标,所以使用了两个函数:
def on_enter(self):
Window.show_cursor = False
def on_leave(self):
Window.show_cursor = True
仅在加载屏幕时“打开”,在屏幕更改时“关闭”)。
接下来,我使用
Image
作为光标(我完全意识到它可能不是最好的实现,但它的效果与预期一样好)并通过 在 Kivy 文件中声明它
Image:
id: cursor
source: 'cursors/menu.png'
size_hint: .075, .075
(此声明完全是个人的,可以根据您的需要进行修改。)
最后,在屏幕的
__init__
函数中,我使用函数 Clock.schedule_interval (self.cursorPosition, 1/60)
来更新名为 cursorPosition
的函数,每秒 60 次,它只是跟踪真实光标的位置并将其用作我的“假”光标的位置。
如下:
def cursorPosition(self):
self.ids.cursor.pos = Window.mouse_pos[0] - self.ids.cursor.width/2, \
Window.mouse_pos[1] - self.ids.cursor.height/2
显然我刚才谈到的所有内容都在 Screen 类中,因此
self
关键字指的是 Screen。
这是我得到的最终代码:
Python 文件
from kivymd.app import MDApp
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen
class MenuScreen(Screen):
def __init__(self, **kwargs):
super(MenuScreen, self).__init__(**kwargs)
Clock.schedule_interval(self.cursorPosition, 1/60)
def on_enter(self):
Window.show_cursor = False
def on_leave(self):
Window.show_cursor = True
def cursorPosition(self):
self.ids.cursor.pos = Window.mouse_pos[0] - self.ids.cursor.width/2, \
Window.mouse_pos[1] - self.ids.cursor.height/2
class MainApp(MDApp):
pass
if __name__ == "__main__":
MainApp().run()
和 Kivy 文件:
MenuScreen:
name: 'menu'
Image:
id: cursor
source: 'cursors/menu.png'
size_hint: .075, .075
由于我使用 KivyMD,默认背景是白色,我的图像是黑色,所以如果您使用“普通”Kivy 框架,请小心,因为默认背景颜色是黑色。
如果需要任何进一步的帮助或答案中的任何错误,请在下面发表评论。