鱼C论坛

 找回密码
 立即注册
查看: 2490|回复: 11

如何及时获取鼠标位置,然后用tkinter中的Label显示

[复制链接]
发表于 2018-9-24 16:23:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用控件绑定方法发现鼠标只能在绑定的控件中移动时才能及时获取位置。
然后我试了一下win32api这个库,
使用win32api.GetCursorPos()获取,然后传给Label控件
但是也只能是暂时的,固定了值,无法改变鼠标位置值了,而弄个循环就跳不出去了。
知识储备有限,实在想不出又什么方法了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-24 16:41:42 | 显示全部楼层
  1. def motion(event):
  2.     x, y = event.x, event.y
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-24 16:50:43 | 显示全部楼层

呃呃,谢谢你的回答。不过说过这个绑定只能在控件中移动时获取位置信息,我想全屏获取位置信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-24 17:18:26 | 显示全部楼层
额,找到一个比较笨的方法。
就是设置一个比较大的循环次数,然后不断用win32api.GetCursorPos()读取位置,然后用root.update()更新数值。
不过就是到一定时间停止,那么设置一个按钮,每次停止就按下按键继续及时获取鼠标位置。
  1. import tkinter as tk
  2. import win32api

  3. root = tk.Tk()
  4. pos = StringVar()
  5. pos.set('鼠标位置: (0, 0)')
  6. Label(root, textvariable=pos, width=20).pack()

  7. def go():
  8.     for i in range(10000):
  9.         x, y = map(int, win32api.GetCursorPos())
  10.         pos.set('鼠标位置: (%d, %d)'%(x, y))
  11.         root.update()
  12.         
  13. Button(root, text='获取位置', width=20, command=go).pack()
  14. mainloop()
复制代码

这个代码感觉好麻烦。但是不知道其他好方法了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-24 17:22:24 | 显示全部楼层
小默的世界 发表于 2018-9-24 16:50
呃呃,谢谢你的回答。不过说过这个绑定只能在控件中移动时获取位置信息,我想全屏获取位置信息

这两个试试,不一样的包
win32gui.GetCursorPos(point)   或者
(x,y) = win32gui.GetCursorInfo()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-24 17:33:19 | 显示全部楼层
本帖最后由 塔利班 于 2018-9-24 17:36 编辑
  1. from tkinter import *
  2. root=Tk()
  3. root.geometry('200x100+300+200')
  4. l=Label(root)
  5. l.pack()
  6. def printpos(event):
  7.     l['text']=f'鼠标位置:({event.x},{event.y})'
  8. root.bind('<Motion>',printpos)
  9. mainloop()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-24 18:08:53 | 显示全部楼层

这个是不能全屏获取的,不过谢谢你的答复了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-24 18:42:44 | 显示全部楼层
小默的世界 发表于 2018-9-24 18:08
这个是不能全屏获取的,不过谢谢你的答复了

你的意思是以屏幕来算的坐标?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-24 19:05:42 | 显示全部楼层
塔利班 发表于 2018-9-24 18:42
你的意思是以屏幕来算的坐标?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 22:59:35 From FishC Mobile | 显示全部楼层
你好,我是今天在找资料的时候看到了你的提问,这也是我很想知道的。然后我后来发现可以用canvas,坐标用canvas.create_text(x,y,text="…",options)来显示。请问你后来是怎么解决哒?想知道别的方法~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 21:48:26 | 显示全部楼层
早起去吃鸟 发表于 2020-3-20 22:59
你好,我是今天在找资料的时候看到了你的提问,这也是我很想知道的。然后我后来发现可以用canvas,坐标用ca ...

这个仍然用pos = win32api.GetCursorPos()最后还是用这个方法获取全屏的位置。
1. 写一个函数,在死循环里获取全屏鼠标位置,同时更新Label空间
2. 接着就是写一个按钮,点击这个按钮,生成一个线程执行函数1.这样就可以实时更新位置了。
3. 暂停:在写函数1的死循环时,结束条件为一个全局的BOOL变量,这样可以在函数外面,改变BOOL值停止死循环了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 21:52:00 | 显示全部楼层
早起去吃鸟 发表于 2020-3-20 22:59
你好,我是今天在找资料的时候看到了你的提问,这也是我很想知道的。然后我后来发现可以用canvas,坐标用ca ...

当初为了模仿按键精灵,写了一个按键模拟器。GITHUB:https://github.com/MoMoLT/KeySim
相关功能:
control.py的48-54行
gui.py的86行(按钮创建线程),295-311行。
希望这些代码能够给你点帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表