栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Tkinter窗口中设置鼠标位置

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Tkinter窗口中设置鼠标位置

好消息是有一种方法可以做到。

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

坏消息是它仅在某些平台上有效。

另一个中间消息是,您至少可以在某些平台上走出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,您想调用

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

win32api.SetCursorPos((50, 50))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/651232.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号