首页 > 编程问答 >如何在 MacOS 上生成跟随鼠标的绿色方块?

如何在 MacOS 上生成跟随鼠标的绿色方块?

时间:2024-07-22 06:47:07浏览次数:13  
标签:python macos tkinter unix core-graphics

我正在尝试编写一个 python 应用程序,它生成一个没有填充的绿色方块,跟随我的光标。我希望这个正方形始终可见,所以用 CSS 术语来说,我希望它的 z-index 最大。我想实现这一点的方法是:

  • 首先实现一个不断检索我的光标位置的重复方法。
  • 在它旁边生成一个绿色方块。
  • 实现不断生成一个绿色方块的方法在我的光标旁边,因为它不断地从第一个方法检索位置。

我已经研究了诸如 TKInter 之类的库来生成图形,但它似乎始终需要实例化画布。我目前还可以使用 Quartz 检索鼠标位置。

这个答案似乎完全符合我的要求,但是使用画布: Tkinter - 创建一个跟随我的鼠标位置的正方形

当前,我能够使用 Quartz 不断检索光标位置:

import Quartz
import rumps

class MouseCoordinatesApp(rumps.App):
    def __init__(self):
        super(MouseCoordinatesApp, self).__init__("Mouse Coordinates")
        self.timer = rumps.Timer(self.update_coordinates, 0.1)
        self.timer.start()

    def update_coordinates(self, _):
        # Get the current mouse location
        mouse_loc = Quartz.NSEvent.mouseLocation()
        x, y = int(mouse_loc.x), int(mouse_loc.y)
        # Update the title to show coordinates
        self.title = f'X: {x}, Y: {y}'

if __name__ == "__main__":
    app = MouseCoordinatesApp()
    app.run()

我使用过 TKInter,但它似乎需要首先设置画布。我希望正方形的内部完全透明,并且它的索引优先。


在 macOS 上创建始终位于其他窗口之上的跟随鼠标移动的绿色方块,可以使用 PyObjC 和 Quartz 库。PyObjC 允许使用 Python 代码与 macOS 中的 Objective-C API(如 Quartz)进行交互。

以下是如何实现它的方法:

import Quartz
import Cocoa
import time

class MouseFollower:
    def __init__(self):
        # 创建一个 20x20 像素的正方形窗口
        self.window = Cocoa.NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
            Cocoa.NSMakeRect(0, 0, 20, 20),
            Cocoa.NSWindowStyleMaskBorderless,
            Cocoa.NSBackingStoreBuffered,
            False
        )
        self.window.setBackgroundColor_(Cocoa.NSColor.clearColor()) # 设置背景为透明
        self.window.setOpaque_(False)  # 使窗口不透明
        self.window.setLevel_(Cocoa.NSFloatingWindowLevel)  # 使窗口始终位于顶部
        self.window.setCollectionBehavior_(
            self.window.collectionBehavior() | Cocoa.NSWindowCollectionBehaviorCanJoinAllSpaces
        )  # 使窗口在所有桌面空间可见

        # 创建一个显示正方形的视图
        self.view = Cocoa.NSView.alloc().initWithFrame_(Cocoa.NSMakeRect(0, 0, 20, 20))
        self.view.setWantsLayer_(True)  # 启用图层支持
        self.view.layer().setBorderColor_(Cocoa.NSColor.greenColor().CGColor())  # 设置边框颜色为绿色
        self.view.layer().setBorderWidth_(2)  # 设置边框宽度
        self.window.setContentView_(self.view)

        self.window.makeKeyAndOrderFront_(None)  # 显示窗口

        # 启动一个线程以更新正方形的位置
        self.timer = Cocoa.NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
            0.01,  # 每 0.01 秒更新一次
            self,
            "updatePosition:",
            None,
            True
        )
        Cocoa.NSRunLoop.currentRunLoop().run()  # 保持运行循环运行

    def updatePosition_(self, timer):
        # 获取鼠标位置
        point = Quartz.NSEvent.mouseLocation()
        # 更新窗口位置
        self.window.setFrameTopLeftPoint_(Cocoa.NSMakePoint(point.x - 10, point.y - 10))  # 将正方形中心放置在鼠标指针处

if __name__ == "__main__":
    MouseFollower()

这段代码将创建一个始终位于其他窗口之上的绿色方块,并跟随鼠标移动。以下是对代码的解释:

  1. 导入必要的模块: Quartz 用于获取鼠标位置, Cocoa 用于创建窗口和视图, time 用于暂停。
  2. 创建一个 MouseFollower 类: 此类包含创建和更新绿色方块所需的所有代码。
  3. __init__ 方法中:
  4. 创建一个无边框的 NSWindow ,并设置其大小、背景颜色和级别,使其始终位于顶部。
  5. 创建一个 NSView 并将其添加到窗口中。
  6. 设置视图的图层属性,包括边框颜色和宽度。
  7. 使窗口可见。
  8. 创建一个 NSTimer ,每 0.01 秒调用一次 updatePosition_ 方法。
  9. 启动运行循环以处理事件。
  10. updatePosition_ 方法中:
  11. 使用 Quartz.NSEvent.mouseLocation() 获取当前鼠标位置。
  12. 使用 setFrameTopLeftPoint_ 方法更新窗口的位置,将正方形的中心放置在鼠标指针处。

要运行这段代码,请将其保存为 .py 文件并使用 Python 解释器运行它。绿色方块将出现在的屏幕上,并跟随的鼠标移动。

标签:python,macos,tkinter,unix,core-graphics
From: 78776505

相关文章

  • 一个简单的问题(python、串行通信和arduinos)
    只是一个关于小脚本的快速问题,由于某种原因无法工作我运行了这个脚本:importserialimporttimeimportturtledefserialreading():serialPort=serial.Serial(port="COM5",baudrate=9600,bytesize=8,timeout=2,stopbits=serial.STOPBITS_ONE......
  • 我在 Windows 10 上运行 Python 代码后控制台立​​即关闭
    虽然我在代码末尾使用input(),但在Windows10(IDLE之外)的窗口中输入名称后,控制台仍然立即关闭,并且我看不到结果。我该怎么做才能阻止控制台关闭?#!python3name=input('Enteryourname:')print('Hello'+name)input('pressEntertoexit:')你在代码末尾......
  • 具有未定义嵌套列表深度的嵌套列表的Python注释类型
    [[1,2,3],3,[2,4],5]的类型是list[list[int]|int]但是,如果嵌套列表具有未定义的深度,例如[[[1,2]],2,[1,[3,[3]]]],3,[2,[2]]],那么它会具有什么类型?可以使用递归类型提示来表示任意深度嵌套的列表:fromtypingimportList,Union......
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误
    我已经在Windows操作系统中安装了opencv3.0.0。我已运行该应用程序并已成功将其安装在C:\驱动器中,并且还将cv2.pyd文件复制到C:\Python27\Lib\site-packages中,正如我在几个教程视频中看到的那样在我的Python2.7.5Shell中,即当我键入>>>i......
  • Python + VS Code 调试器:可视化我的程序当前正在执行的源代码中的位置?
    当我使用VSCodePython调试器时:我可以执行我的程序,以便编辑器将我逐行带到源代码中的任何位置(跳转到相关文件/如果尚未打开则将其打开)目前的执行情况是?是的,VSCode的Python调试器可以让你逐行执行代码,并实时显示当前执行的位置。以下是操作方法:1.设置断点:......
  • 如何立即取消使用 Ollama Python 库生成答案的 Asyncio 任务?
    我正在使用Ollama通过OllamaPythonAPI从大型语言模型(LLM)生成答案。我想通过单击停止按钮取消响应生成。问题在于,只有当响应生成已经开始打印时,任务取消才会起作用。如果任务仍在处理并准备打印,则取消不起作用,并且无论如何都会打印响应。更具体地说,即使单击按钮后,此函数......
  • 使用 np.array 索引过滤 Python 列表
    谁能向我解释一下列表self.data如何使用numpy索引数组selec_idx进行索引/过滤?完整的课程可在https://github.com/kaidic/LDAM-DRW/blob/master/imbalance_cifar.pydefgen_imbalanced_data(self,img_num_per_cls):new_data=[]n......
  • 尝试在cmd(python)中安装turtle
    当我在cmd中编写pipinstallturtle后,这条消息出现在我面前。有人知道该怎么办吗?C:\>pipinstallturtleCollectingturtleUsingcachedturtle-0.0.2.tar.gz(11kB)ERROR:Commanderroredoutwithexitstatus1:command:'C:\Users\Bruger\App......
  • Python + Polars:如何有效地“fill_null”仅 DataFrame 的某些列?
    例如,假设我只想fill_null(strategy="zero")DataFrame的数字列。我当前的策略是这样做:final_df=df.select(cs.exclude(cs.numeric()))final_df.with_columns(df.select(cs.numeric()).fill_null(strategy="zero"))是否有替代的、更惯用或更有效的方法来实现我......
  • 如何找到 Windows 上 Python 的安装位置?
    我想找出我的Python在Windows上的安装路径。例如:C:\Python25如何找到Python的安装位置?在Windows上查找Python安装位置的方法有很多种:1.使用where命令(推荐方法):打开命令提示符(cmd)。输入以下命令并按回车键:wherepython......