sam*_*sam 8 python mouse tkinter
我有一个3d渲染程序,它根据鼠标在屏幕上的位置围绕观察者旋转世界.旋转世界的弧度数由此线定义
glob.worldx=-(w.winfo_pointerxy()[0]-xy[0])/250
Run Code Online (Sandbox Code Playgroud)
其中xy [0]是屏幕中心的x坐标
这意味着观察者视野可以旋转的数量受到鼠标距离的限制.如果我能让鼠标回到屏幕中心,我可以解决这个问题.有任何想法吗?
好消息是有办法做到这一点.
中间新闻是它没有很好的记录.
坏消息是它只适用于某些平台.
另一个中间新闻是你可以在至少某些平台上走出Tk.
在Tcl/Tk中执行此操作的方法是使用生成<Motion>事件-warp 1.关于这个的文档是稀疏的,并且分散在几个不同的页面(从开始bind),但是这里描述了细节.基本上,就是这样:
event generate . <Motion> -warp 1 -x 50 -y 50
Run Code Online (Sandbox Code Playgroud)
那么,你是如何从Tkinter做到这一点的?
好吧,event_generate没有记录在任何地方,也没有<Motion>事件或warp参数......但是如果你知道Tk如何映射到Tkinter那么很简单:
window.event_generate('<Motion>', warp=True, x=50, y=50)
Run Code Online (Sandbox Code Playgroud)
这确实会产生一个事件,正如您可以通过绑定看到的那样<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()
Run Code Online (Sandbox Code Playgroud)
运行它,单击窗口以确保它具有焦点,移动光标,你会看到它打印出这样的东西:
motion 65, 69
motion 65, 70
motion 65, 71
Run Code Online (Sandbox Code Playgroud)
然后点击一个键,它将打印出来:
motion 50, 50
Run Code Online (Sandbox Code Playgroud)
这很棒...除了它实际上可能无法移动你的光标,在这种情况下,所有这一切都会让Tk认为光标移动了.
从浏览各种论坛,它看起来像:
对于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)
Run Code Online (Sandbox Code Playgroud)
对于Windows,您需要调用SetCursorPosAPI,或生成并发送MOUSEEVENT.前者不适用于例如DirectX游戏; 后者可能无法与远程桌面一起使用.对于这种情况,你可能想要前者.无论哪种方式,最简单的方法是安装pywin32,然后它只是:
win32api.SetCursorPos((50, 50))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5882 次 |
| 最近记录: |