当前位置: 首页 > 面试题库 >

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

姚臻
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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

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

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

在Tcl / Tk中执行此操作的方法是使用生成一个<Motion>事件-warp 1。有关此文档的文档很少,并且散布在几个不同的页面上(始于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, 69
motion 65, 70
motion 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))


 类似资料:
  • 问题内容: 有没有一种方法可以获取鼠标的位置并将其设置为var? 问题答案: 您可以设置一个回调来响应事件: 我不确定您想要哪种变量。在上面,我设置了局部变量并设置了鼠标坐标。 如果创建类方法,则可以设置实例属性和鼠标坐标,然后可以从其他类方法访问它们。

  • 问题内容: 我正在用Java做一些Swing GUI,我想我的问题很简单。如何设置鼠标的位置? 问题答案: 您需要使用机器人 此类用于生成本机系统输入事件,用于测试自动化,自运行演示以及需要控制鼠标和键盘的其他应用程序。Robot的主要目的是促进Java平台实现的自动化测试。 使用类生成输入事件与将事件发布到AWT事件队列或AWT组件不同,因为事件是在平台的本机输入队列中生成的。例如,实际上将移动

  • 问题内容: 如何根据屏幕尺寸告诉Tkinter窗口打开的位置?我希望它在中间打开。 问题答案: 该答案基于Rachel的答案。她的代码本来就不起作用,但是通过一些调整,我得以解决错误。

  • 我目前有以下的类: 老实说,代码并不重要,请相信我,当用户将鼠标悬停在我的< code>Item对象上时,它会显示一个弹出窗口,如下所示: 这个弹出窗口在我的屏幕中间打开。如果我移动窗口,弹出窗口将在同一位置打开。我需要我的弹出窗口以某种方式在鼠标指针下打开。我知道具有此功能(据称),但我已经致力于设计这个,它具有我的许多设计目标。 这有可能让显示在某个位置吗? 谢谢。

  • 问题内容: 在Linux下如何使用C程序在X窗口中设置 鼠标 光标的位置?谢谢:)(就像WIN中的setcursorpos()一样) 编辑:我尝试过此代码,但不起作用: 问题答案: 12.4- 移动指针 尽管通常 应将 指针的移动留给最终用户控制,但有时有必要在程序控制下将指针移动到新位置。 要将指针移动到窗口中的任意点,请使用XWarpPointer()。 例:

  • 问题内容: 我将Python 2与和一起使用,然后使用。 该程序运行良好,但是每次打开该程序时,窗口都会显示为隐藏状态,因此,直到我单击扩展坞上的图标以将其打开时,该窗口才会出现。 有什么方法可以控制此,使该窗口位于应用程序启动时打开的其他窗口之上? 需要澄清的是,在应用程序运行的整个过程中,它不一定都位于最前面。我只需要它在启动时位于其他窗口之上。 问题答案: 如果我接受您提供的代码并添加第一行