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

2024-01-09

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

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

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

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


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

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

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

另一个中间消息是,您至少可以在某些平台上超越 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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 tkinter 窗口中设置鼠标位置 的相关文章

随机推荐

  • Java JTable 更新行

    我正在创建一个像这样的 JTable String colName new String ID Country Name Page titel Page URL Time Object products new Object 123 USA
  • 为什么 PhoneGap 总是显示默认的启动画面图像?

    我现在正在测试一个示例 iOS 应用程序 尽管我在 Xcode 项目目标屏幕的 摘要 选项卡 中设置了所有新的启动图像 但 PhoneGap 3 0 仍然显示其默认启动屏幕 为什么 即使闪屏是一个插件并且现在默认情况下不包含在 PhoneG
  • 使用 WebFlux 从资源中读取和解析文件的反应方式?

    我想知道从资源中读取 解析和提供文件的正确方法是什么 目前 我做了这样的事情 fun getFile request ServerRequest Mono
  • Android HttpsUrlConnection eofException

    我有一个问题 当我尝试读取任何输入时 我的 HttpsURLConnection 将抛出 EOFException 该代码适用于某些网络调用 但不适用于其他网络调用 如果我尝试从连接中读取任何内容 则会失败并出现上述错误 Example u
  • RXJS中异步流是如何传输的?

    我试图了解流是如何通过 RXjs 中的管道传输的 我知道这不应该成为一个问题 因为这就是异步流的整个想法 但仍然有一些我想理解的事情 看这段代码 var source Rx Observable range 1 3 flatMapLates
  • 如何在 Visual Studio 中启用 CUDA 项目的单独编译

    我是 CUDA 新手 我正在尝试编写一个应用程序 在其中从另一个内核函数调用一个内核函数 但我收到错误 内核启动自device or global函数需要单独的编译模式 在构建应用程序时 这是我的完整代码 任何帮助 将不胜感激 includ
  • 手风琴与 for 循环一次仅打开一项

    我正在尝试向我的手风琴添加一个交互式 id 但是我的代码中出现了一些问题 手风琴会打开每个手风琴项目 我想要的只是在单击它时能够一次打开一个手风琴项目 for study in studies div class accordion div
  • 什么是 Swift.AnyClass?

    我正在调查UITableView类 我发现 open func register cellClass Swift AnyClass forCellReuseIdentifier identifier String Reading here
  • 解析和检查 Haskell 代码的库?

    hackage中是否有任何库可以解析haskell代码并检查它是否是有效代码 我愿意尝试一下进化模型 我想检查生成的代码字符串是否可以编译 而无需将它们写入磁盘并运行编译器 理想情况下 如果也能够在字符串中运行代码就好了 但只检查代码的有效
  • 一起使用 ORDER BY 和 GROUP BY

    我的表如下所示 我使用的是 MySQL m id v id timestamp 6 1 1333635317 34 1 1333635323 34 1 1333635336 6 1 1333635343 6 1 1333635349 我的目
  • 如何在flutter中开启设备GPS?

    通过使用 Dart 的 simple permissions 和 location 包 它只需要请求用户许可允许或拒绝应用程序使用设备位置来在 Google 地图上显示用户的当前位置 当我在设备上手动打开 GPS 时 我能够获取当前位置 但
  • 如何修复 phpMyAdmin 中的 WordPress MySQL 表?

    背景故事 我在 Mac 上使用 MAMP 设置本地开发服务器和数据库来创建 WordPress 网站 一切都很顺利 昨天 MySQL服务器没有启动 所以我采纳了StackOverflow上答案的建议 从mysql56文件夹中删除了ib lo
  • 在 PyQt4 中动态更改 QLabel 文本

    我的问题是 如何更改标签中的文本 标签位于布局内 但是setText 似乎不起作用 也许我做得不对 这是我的代码 这是主窗口 GUI Qt Designer 给出的 class Ui dashboard QtGui QMainWindow
  • Telerik RadGrid - 如何默认为编辑模式?

    我想让 RadGrid 的项目在页面加载时可编辑 我在这里尝试了两种方法http www telerik com help aspnet grid grddefaulteditmodeforgriditemsoninitialload ht
  • Bootstrap4下拉菜单填充输入组

    我想解决一个非常简单的引导问题 根据指南 https getbootstrap com docs 4 0 components dropdowns https getbootstrap com docs 4 0 components dro
  • Animationend 事件也会在子元素的动画结束时触发?

    我有一个带有动画的 div 我已将animationend 事件侦听器附加到该div 该 div 还有一个带有动画的子元素 由于某种原因 当子元素的动画完成时 animationend 事件也会触发 为什么是这样 有办法解决这个问题吗 我希
  • X 类型的参数必须支持接口 Y

    我有这样的设置 IBuilder interface IInvokable end IBuilder
  • REST 中的表征状态是什么意思?

    我查遍了整个网络才得到两个词的确切含义 代表性国家 我有个疑问 我误解了这些术语 我想向某人澄清一下对此有什么好的想法 我的理解是 服务器中有一个资源 SO Rest 意味着将该资源的某些代表性状态传输给客户端 如果服务器有一个资源 x 那
  • 获取分页查询的总行数

    我有以下记录分页查询 SELECT FROM SELECT e ROWNUM row num FROM SELECT emp no emp name dob from emp outr WHERE ROWNUM lt pagenum row
  • 如何在 tkinter 窗口中设置鼠标位置

    我有一个 3D 渲染程序 可以根据鼠标在屏幕上的位置围绕观察者旋转世界 世界旋转的弧度量由这条线定义 glob worldx w winfo pointerxy 0 xy 0 250 其中xy 0 是屏幕中心的x坐标 这意味着观察者视野可以