如何在 Kivy 或 Python 中设置自定义光标?

问题描述 投票:0回答:1

我正在尝试在 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 上的第一个问题,哈哈。

python kivy custom-cursor
1个回答
0
投票

对于您的回复,我深表歉意,因为这是我的第一个回答。 我要写的内容可能与您不再相关,但无论如何我都会这样做,所以如果有人仍然需要答案,可能会在我解决这个问题的方法中找到帮助。

首先,我所做的是使用实现的函数隐藏光标

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 框架,请小心,因为默认背景颜色是黑色。

如果需要任何进一步的帮助或答案中的任何错误,请在下面发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.