gpt4 book ai didi

python - 如何在 tkinter 窗口中设置鼠标位置

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:59 25 4
gpt4 key购买 nike

我有一个 3d 渲染程序,它根据鼠标在屏幕上的位置围绕观察者旋转世界。世界旋转的弧度数由这条线定义

    glob.worldx=-(w.winfo_pointerxy()[0]-xy[0])/250

其中xy[0]为屏幕中心的x坐标

这意味着观察者视野的旋转量受鼠标移动距离的限制。如果我能让鼠标回到屏幕中央,我就能解决这个问题。有什么想法吗?

最佳答案

好消息是有办法做到这一点。

中间消息是它没有得到很好的记录。

坏消息是它只适用于某些平台。

另一个中间消息是您至少可以在某些平台上走出 Tk。


在 Tcl/Tk 中执行此操作的方法是生成一个 <Motion>事件 -warp 1 .这方面的文档很少,分散在几个不同的页面上(从 bind 开始),但详细信息在 here 中有描述。 .基本上就是这样:

event generate . <Motion> -warp 1 -x 50 -y 50

那么,您如何从 Tkinter 执行此操作?

嗯,event_generate未在任何地方记录,<Motion> 也不是事件,或 warp参数……但如果您知道 Tk 如何映射到 Tkinter,则很容易弄清楚:

window.event_generate('<Motion>', warp=True, x=50, y=50)

这确实会生成一个事件,正如您可以通过绑定(bind) <Motion> 看到的那样.这是一个简单的测试程序:

from tkinter import *

root = Tk()

def key(event):
root.event_generate('<Motion>', warp=True, x=50, y=50)

def motion(event):
print('motion {}, {}'.format(event.x, event.y))

root.bind('<Key>', key)
root.bind('<Motion>', motion)
root.mainloop()

运行它,点击窗口确保它有焦点,移动光标,你会看到它打印出如下内容:

motion 65, 69
motion 65, 70
motion 65, 71

然后敲一个键,它会打印出这个:

motion 50, 50

这很好……除了它实际上可能无法移动您的光标,在这种情况下,所有这些所做的只是欺骗 Tk 认为光标移动了。


从浏览各种论坛,它看起来像:

  • Mac:不起作用。
  • Windows:通常有效。
    • 您必须拥有 Tk 8.4.something 或更高版本。我找不到这方面的错误,但你可以指望 8.4 与 Python 2.7 或 3.x+ 的任何官方 Windows 二进制安装。
    • 您也不得运行全屏应用程序(使用 Tk 通常不会运行)。
    • 在 Vista 和更高版本上,在某些情况下它不起作用。这可能与不拥有桌面 session 或不是本地控制台 session 有关,也可能与需要管理员或其他权限有关。
    • 如果它不起作用,很容易直接转到 Win32 API。
  • X11(大多数 linux、*BSD 等):通常
    • 您的窗口管理器不能禁止其他客户端扭曲指针。幸运的是,这似乎并不常见。
    • 如果您遇到这个问题,就没有办法解决。
  • 其他平台(iOS、Android 等):不知道。

对于 Mac,您想要生成并发送 NSMouseMoved 事件。最简单的方法是使用 pyobjc (如果您使用的是 Apple 的 Python,它是内置的;否则您必须安装它):

app = Foundation.NSApplication.sharedApplication()
event = Foundation.NSEvent.mouseEventWithType_location_modifierFlags_timestamp_windowNumber_context_eventNumber_clickCount_pressure_(
Foundation.NSMouseMoved, (50, 50), 0, 0,
app.mainWindow().windowNumber(), None, 0, 0, 0.0)
app.sendEvent_(event)

对于 Windows,您要调用 SetCursorPos API,或生成并发送 MOUSEEVENT。前者不适用于 DirectX 游戏等;后者可能不适用于远程桌面。对于这种情况,您可能需要前者。无论哪种方式,最简单的方法是安装 pywin32 ,然后就是:

win32api.SetCursorPos((50, 50))

关于python - 如何在 tkinter 窗口中设置鼠标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42191741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com