好消息是有一种方法可以做到这一点。
中间的消息是它没有得到很好的记录。
坏消息是它仅适用于某些平台。
另一个中间消息是,您至少可以在某些平台上超越 Tk。
在 Tcl/Tk 中执行此操作的方法是生成<Motion>
事件与-warp 1
。关于此的文档很少,并且分散在几个不同的页面上(从bind https://www.tcl.tk/man/tcl8.6/TkCmd/bind.htm),但详细描述here http://wiki.tcl.tk/1689。基本上,就是这样:
event generate . <Motion> -warp 1 -x 50 -y 50
那么,如何从 Tkinter 做到这一点呢?
Well, event_generate
没有任何地方记录,也没有<Motion>
事件,或warp
参数……但如果您知道 Tk 如何映射到 Tkinter,那么弄清楚它非常简单:
window.event_generate('<Motion>', warp=True, x=50, y=50)
这确实会生成一个事件,正如您通过绑定看到的那样<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: Does not work.
- 您必须拥有 Tk 8.6.something 或更高版本(请参阅)。你呢可能有 8.5.something http://www.python.org/getit/mac/tcltk/.
- 但直接使用 Cocoa API 并不难。
- Windows: Usually works.
- 您必须拥有 Tk 8.4.something 或更高版本。我找不到这方面的错误,但您可以通过任何官方 Windows 二进制安装的 Python 2.7 或 3.x+ 来使用 8.4。
- 您还不得运行全屏应用程序(使用 Tk 通常不会运行全屏应用程序)。
- 在 Vista 及更高版本上,在某些情况下它不起作用。这可能与不拥有桌面会话或不是本地控制台会话有关,或者可能与需要管理员或其他权限有关。
- 如果不起作用,很容易直接使用 Win32 API。
- X11 (most linux, *BSD, etc.): Usually
- 您的窗口管理器不得禁止其他客户端扭曲指针。幸运的是,这似乎并不常见。
- 如果您遇到此问题,则没有办法解决。
- 其他平台(iOS、Android 等):不知道。
对于 Mac,您想要生成并发送NSMouseMoved https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html事件。执行此操作的简单方法是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 http://msdn.microsoft.com/en-us/library/windows/desktop/ms648394%28v=vs.85%29.aspxAPI,或生成并发送 MOUSEEVENT。前者不适用于 DirectX 游戏等;后者可能不适用于远程桌面。对于这种情况,您可能需要前者。无论哪种方式,最简单的方法是安装pywin32 http://sourceforge.net/projects/pywin32/files/,然后就是:
win32api.SetCursorPos((50, 50))