好消息是有一种方法可以做到。
中间的消息是,它没有很好的记录。
坏消息是它仅在某些平台上有效。
另一个中间消息是,您至少可以在某些平台上走出Tk。
在Tcl / Tk中执行此操作的方法是使用生成一个
<Motion>事件
-warp1。有关此文档的文档很少,并且散布在几个不同的页面上(始于
bind),但是此处描述了详细信息。基本上就是这样:
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)正如您可以通过binding看到的那样,这确实会生成一个事件
<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, 69motion 65, 70motion 65, 71
然后按下一个键,它将打印出以下内容:
motion 50, 50
很棒……除了它可能实际上无法移动光标之外,在这种情况下,所有这一切都使Tk误以为光标已移动。
通过浏览各种论坛,它看起来像:
- Mac:不起作用。
- 您必须具有Tk 8.6.something或更高版本(请参阅问题2926819)。你可能有8.5.something。
- 但是使用Cocoa API并不难。
- Windows:通常有效。
- 您必须拥有Tk 8.4.something或更高版本。我找不到这个错误,但是您可以指望8.4使用Python 2.7或3.x +的任何官方Windows二进制安装。
- 您也一定不能运行全屏应用程序(使用Tk时通常不可以)。
- 在Vista和更高版本上,在某些情况下将无法使用。这可能与不拥有桌面会话或不是本地控制台会话有关,或者与需要管理员或其他特权有关。
- 如果不起作用,则可以轻松转到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,您想调用
SetCursorPosAPI,或生成并发送MOUSEEVENT。前者不适用于DirectX游戏;后者可能不适用于远程桌面。对于这种情况,您可能需要前者。无论哪种方式,最简单的方法是install
pywin32,然后就是:
win32api.SetCursorPos((50, 50))



