我正在尝试编写一个 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()
这段代码将创建一个始终位于其他窗口之上的绿色方块,并跟随鼠标移动。以下是对代码的解释:
-
导入必要的模块:
Quartz
用于获取鼠标位置,Cocoa
用于创建窗口和视图,time
用于暂停。 -
创建一个
MouseFollower
类: 此类包含创建和更新绿色方块所需的所有代码。 -
在
__init__
方法中: -
创建一个无边框的
NSWindow
,并设置其大小、背景颜色和级别,使其始终位于顶部。 -
创建一个
NSView
并将其添加到窗口中。 - 设置视图的图层属性,包括边框颜色和宽度。
- 使窗口可见。
-
创建一个
NSTimer
,每 0.01 秒调用一次updatePosition_
方法。 - 启动运行循环以处理事件。
-
在
updatePosition_
方法中: -
使用
Quartz.NSEvent.mouseLocation()
获取当前鼠标位置。 -
使用
setFrameTopLeftPoint_
方法更新窗口的位置,将正方形的中心放置在鼠标指针处。
要运行这段代码,请将其保存为
.py
文件并使用 Python 解释器运行它。绿色方块将出现在的屏幕上,并跟随的鼠标移动。