鱼C论坛

 找回密码
 立即注册
查看: 3265|回复: 21

[已解决]怎么实时显示鼠标坐标?

[复制链接]
发表于 2020-12-9 16:27:38 | 显示全部楼层 |阅读模式

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

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

x

我的想法是如果鼠标移动,就把当前鼠标坐标写入文本框,请问该怎么实现呢?


  1. import tkinter as tk
  2. import pyautogui as ag

  3. root = tk.Tk()
  4. root.attributes("-alpha", 0.6)
  5. root.overrideredirect(True)

  6. etyText = tk.StringVar()
  7. if ag.position() != (0, 0):  # <--------------這裡该怎麼寫?
  8.     xx = ag.position()[0] + 20
  9.     yy = ag.position()[1] + 20
  10.     root.geometry(f'60x20+{xx}+{yy}')
  11.     etyText.set(f'{ag.position()[0]},{ag.position()[1]}')

  12. ety = tk.Entry(root, textvariable=etyText)
  13. ety.pack()
  14. tk.mainloop()
复制代码
最佳答案
2020-12-11 22:19:38
本帖最后由 hrp 于 2020-12-11 22:40 编辑
lengyue869 发表于 2020-12-11 16:21
注釋掉了,還有第14行if new_pos != POSITION 也改成 if new_position != POSITION 了


回家一试竟然发现是参数忘改了
  1. import tkinter as tk
  2. from threading import Thread
  3. from time import sleep

  4. import pyautogui as ag

  5. # 不生效的原因是KEEP_LISTEN = False忘记改True了我的天
  6. KEEP_LISTEN = True
  7. THREAD_LISTENING = None
  8. POSITION = 0, 0


  9. def listening(time_interval):
  10.     global POSITION
  11.     while KEEP_LISTEN:
  12.         new_position = ag.position()
  13.         if new_position != POSITION:
  14.             POSITION = new_position
  15.         sleep(time_interval)


  16. def start_listen(t):
  17.     '''调用此函数开始监听'''
  18.     global THREAD_LISTENING
  19.     # t 是刷新时间间隔
  20.     if THREAD_LISTENING:
  21.         return
  22.     THREAD_LISTENING = Thread(target=listening, args=(t,))
  23.     THREAD_LISTENING.start()


  24. def stop_listen():
  25.     '''调用此函数停止监听'''
  26.     global KEEP_LISTEN, THREAD_LISTENING
  27.     KEEP_LISTEN = False
  28.     THREAD_LISTENING.join()
  29.     THREAD_LISTENING = None


  30. root = tk.Tk()
  31. root.attributes("-alpha", 0.6)
  32. root.overrideredirect(True)

  33. etyText = tk.StringVar()


  34. def mouse_move_event():
  35.     # POSITION[0] + 20 原因是使输入框离鼠标远点防止影响鼠标点击,实际使用可以改回来
  36.     root.geometry(f'80x20+{POSITION[0] + 20}+{POSITION[1]}')
  37.     etyText.set(f'{POSITION[0]},{POSITION[1]}')
  38.     root.after(100, mouse_move_event)


  39. ety = tk.Entry(root, textvariable=etyText)
  40. ety.pack()

  41. # 刷新间隔0.05秒
  42. start_listen(0.05)
  43. root.after(50, mouse_move_event)

  44. tk.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-9 17:56:23 | 显示全部楼层
本帖最后由 lengyue869 于 2020-12-9 21:47 编辑

................
@hrp
@Twilight6
@qiuyouzhi
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 21:48:09 | 显示全部楼层
up up!~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-9 22:39:40 | 显示全部楼层
本帖最后由 兰竹皋 于 2020-12-9 22:43 编辑

不需要用pyautogui
tkinter中每个组件可以事件绑定(通过.bind()),
定义一个事件函数,用<Motion>就行
你看看扩展教程中 事件绑定那章,很简单的   

例如:
  1. from tkinter import *

  2. root = Tk()

  3. def callback(event):
  4.     print("当前位置:", event.x, event.y)

  5. frame = Frame(root, width=200, height=200)
  6. frame.bind("<Motion>", callback)
  7. frame.pack()

  8. mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 23:25:15 | 显示全部楼层
兰竹皋 发表于 2020-12-9 22:39
不需要用pyautogui
tkinter中每个组件可以事件绑定(通过.bind()),
定义一个事件函数,用就行

tkinter只能显示frame中的坐标,我想要显示整个桌面任意地方的坐标,比如网页的窗口最大化的坐标是多少...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 00:31:17 From FishC Mobile | 显示全部楼层
tk我不太熟悉,像Qt5中可以重写鼠标移动事件,让鼠标移动就触发将鼠标坐标写入编辑栏内的函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 07:52:10 | 显示全部楼层
hrp 发表于 2020-12-10 00:31
tk我不太熟悉,像Qt5中可以重写鼠标移动事件,让鼠标移动就触发将鼠标坐标写入编辑栏内的函数。

Qt跟tk差不多,好像都是在一個框架內显示
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 22:51:10 | 显示全部楼层
这样写可以打包在CMD窗口显示鼠标坐标

  1. import pyautogui as ag
  2. import time
  3. import os

  4. while True:
  5.     oldX, oldY = ag.position()
  6.     time.sleep(0.3)
  7.     nowX, nowY = ag.position()

  8.     if nowX!=oldX or nowY!=oldY:
  9.         os.system('cls')
  10.         print(nowX,nowY)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 09:11:40 From FishC Mobile | 显示全部楼层
新建一个线程监听鼠标移动应该就ok了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 09:58:42 | 显示全部楼层
hrp 发表于 2020-12-11 09:11
新建一个线程监听鼠标移动应该就ok了吧

不會寫呀...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 10:33:43 From FishC Mobile | 显示全部楼层
lengyue869 发表于 2020-12-11 09:58
不會寫呀...

因为是用手机写的测试不了,不知道能不能运行

  1. from threading import Thread
  2. from time import sleep
  3. import tkinter as tk
  4. import pyautogui as ag

  5. KEEP_LISTEN = False
  6. THREAD_LISTENING = None

  7. def listening(t):
  8.     old_pos = 0, 0
  9.     while KEEP_LISTEN:
  10.         new_pos = ag.position()
  11.         if new_pos != old_pos:
  12.             mouse_move_event(new_pos)
  13.         old_pos = new_pos
  14.         sleep(t)

  15. def start_listen(t):
  16.     # t 是刷新时间间隔
  17.     if THREAD_LISTENING:
  18.         return
  19.     THREAD_LISTENING = Thread(target=listening, args=(t,))
  20.     THREAD_LISTENING.start()
  21.    
  22. def stop_listen():
  23.     KEEP_LISTEN = False
  24.     THREAD_LISTENING.join()
  25.     THREAD_LISTENING = None

  26. root = tk.Tk()
  27. root.attributes("-alpha", 0.6)
  28. root.overrideredirect(True)

  29. etyText = tk.StringVar()

  30. def mouse_move_event(pos):
  31.     root.geometry(f'60x20+{pos[0]}+{pos[1]}')
  32.     etyText.set(f'{pos[0]},{pos[1]}')

  33. ety = tk.Entry(root, textvariable=etyText)
  34. ety.pack()

  35. # 刷新间隔0.1秒
  36. start_listen(0.1)

  37. tk.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 11:10:57 | 显示全部楼层
hrp 发表于 2020-12-11 10:33
因为是用手机写的测试不了,不知道能不能运行

出錯啦...

UnboundLocalError: local variable 'THREAD_LISTENING' referenced before assignment

20201211110951.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 11:31:20 From FishC Mobile | 显示全部楼层
lengyue869 发表于 2020-12-11 11:10
出錯啦...

UnboundLocalError: local variable 'THREAD_LISTENING' referenced before assignment
  1. from threading import Thread
  2. from time import sleep
  3. import tkinter as tk
  4. import pyautogui as ag

  5. KEEP_LISTEN = False
  6. THREAD_LISTENING = None

  7. def listening(t):
  8.     old_pos = 0, 0
  9.     while KEEP_LISTEN:
  10.         new_pos = ag.position()
  11.         if new_pos != old_pos:
  12.             mouse_move_event(new_pos)
  13.         old_pos = new_pos
  14.         sleep(t)

  15. def start_listen(t):
  16.     global THREAD_LISTENING
  17.     # t 是刷新时间间隔
  18.     if THREAD_LISTENING:
  19.         return
  20.     THREAD_LISTENING = Thread(target=listening, args=(t,))
  21.     THREAD_LISTENING.start()
  22.    
  23. def stop_listen():
  24.     global THREAD_LISTENING
  25.     KEEP_LISTEN = False
  26.     THREAD_LISTENING.join()
  27.     THREAD_LISTENING = None

  28. root = tk.Tk()
  29. root.attributes("-alpha", 0.6)
  30. root.overrideredirect(True)

  31. etyText = tk.StringVar()

  32. def mouse_move_event(pos):
  33.     root.geometry(f'60x20+{pos[0]}+{pos[1]}')
  34.     etyText.set(f'{pos[0]},{pos[1]}')

  35. ety = tk.Entry(root, textvariable=etyText)
  36. ety.pack()

  37. # 刷新间隔0.1秒
  38. start_listen(0.1)

  39. tk.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 13:31:53 | 显示全部楼层

还是不行,运行后文本框一直停留在左上角,并没有随着鼠标移动而移动,也没有将鼠标的坐标写进去...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 15:13:33 From FishC Mobile | 显示全部楼层
lengyue869 发表于 2020-12-11 13:31
还是不行,运行后文本框一直停留在左上角,并没有随着鼠标移动而移动,也没有将鼠标的坐标写进去...

应该是子线程不能刷新界面的原因
试试这个(手机写码不能测试真难受)
  1. import tkinter as tk
  2. #import pyautogui as ag
  3. from time import sleep
  4. from threading import Thread

  5. KEEP_LISTEN = False
  6. THREAD_LISTENING = None
  7. POSITION = 0, 0

  8. def listening(time_interval):
  9.     global POSITION
  10.     while KEEP_LISTEN:
  11.         new_position = ag.position()
  12.         if new_pos != POSITION:
  13.             POSITION = new_position
  14.         sleep(time_interval)

  15. def start_listen(t):
  16.     global THREAD_LISTENING
  17.     # t 是刷新时间间隔
  18.     if THREAD_LISTENING:
  19.         return
  20.     THREAD_LISTENING = Thread(target=listening, args=(t,))
  21.     THREAD_LISTENING.start()

  22. def stop_listen():
  23.     global KEEP_LISTEN, THREAD_LISTENING
  24.     KEEP_LISTEN = False
  25.     THREAD_LISTENING.join()
  26.     THREAD_LISTENING = None

  27. root = tk.Tk()
  28. root.attributes("-alpha", 0.6)
  29. root.overrideredirect(True)

  30. etyText = tk.StringVar()

  31. def mouse_move_event():
  32.     root.geometry(f'60x20+{POSITION[0]}+{POSITION[1]}')
  33.     etyText.set(f'{POSITION[0]},{POSITION[1]}')
  34.     root.after(100, mouse_move_event)

  35. ety = tk.Entry(root, textvariable=etyText)
  36. ety.pack()

  37. # 刷新间隔0.1秒
  38. start_listen(0.1)
  39. root.after(100, mouse_move_event)

  40. tk.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-11 15:55:02 | 显示全部楼层
hrp 发表于 2020-12-11 15:13
应该是子线程不能刷新界面的原因
试试这个(手机写码不能测试真难受)

感謝熱情回復,,不過還是不行...
這個不急,等你方便用電腦的時候再幫忙看看吧!

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 16:16:38 From FishC Mobile | 显示全部楼层
lengyue869 发表于 2020-12-11 15:55
感謝熱情回復,,不過還是不行...
這個不急,等你方便用電腦的時候再幫忙看看吧!


上面import pyautogui as ag忘记去掉注释了,你把#去掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 16:21:03 | 显示全部楼层
hrp 发表于 2020-12-11 16:16
上面import pyautogui as ag忘记去掉注释了,你把#去掉

注釋掉了,還有第14行if new_pos != POSITION 也改成 if new_position != POSITION 了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 22:19:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrp 于 2020-12-11 22:40 编辑
lengyue869 发表于 2020-12-11 16:21
注釋掉了,還有第14行if new_pos != POSITION 也改成 if new_position != POSITION 了


回家一试竟然发现是参数忘改了
  1. import tkinter as tk
  2. from threading import Thread
  3. from time import sleep

  4. import pyautogui as ag

  5. # 不生效的原因是KEEP_LISTEN = False忘记改True了我的天
  6. KEEP_LISTEN = True
  7. THREAD_LISTENING = None
  8. POSITION = 0, 0


  9. def listening(time_interval):
  10.     global POSITION
  11.     while KEEP_LISTEN:
  12.         new_position = ag.position()
  13.         if new_position != POSITION:
  14.             POSITION = new_position
  15.         sleep(time_interval)


  16. def start_listen(t):
  17.     '''调用此函数开始监听'''
  18.     global THREAD_LISTENING
  19.     # t 是刷新时间间隔
  20.     if THREAD_LISTENING:
  21.         return
  22.     THREAD_LISTENING = Thread(target=listening, args=(t,))
  23.     THREAD_LISTENING.start()


  24. def stop_listen():
  25.     '''调用此函数停止监听'''
  26.     global KEEP_LISTEN, THREAD_LISTENING
  27.     KEEP_LISTEN = False
  28.     THREAD_LISTENING.join()
  29.     THREAD_LISTENING = None


  30. root = tk.Tk()
  31. root.attributes("-alpha", 0.6)
  32. root.overrideredirect(True)

  33. etyText = tk.StringVar()


  34. def mouse_move_event():
  35.     # POSITION[0] + 20 原因是使输入框离鼠标远点防止影响鼠标点击,实际使用可以改回来
  36.     root.geometry(f'80x20+{POSITION[0] + 20}+{POSITION[1]}')
  37.     etyText.set(f'{POSITION[0]},{POSITION[1]}')
  38.     root.after(100, mouse_move_event)


  39. ety = tk.Entry(root, textvariable=etyText)
  40. ety.pack()

  41. # 刷新间隔0.05秒
  42. start_listen(0.05)
  43. root.after(50, mouse_move_event)

  44. tk.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 23:03:26 | 显示全部楼层
hrp 发表于 2020-12-11 22:19
回家一试竟然发现是参数忘改了

完美,我先用着,再慢慢研究,多谢多谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 15:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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