怎么实时显示鼠标坐标?
我的想法是如果鼠标移动,就把当前鼠标坐标写入文本框,请问该怎么实现呢?
import tkinter as tk
import pyautogui as ag
root = tk.Tk()
root.attributes("-alpha", 0.6)
root.overrideredirect(True)
etyText = tk.StringVar()
if ag.position() != (0, 0):# <--------------這裡该怎麼寫?
xx = ag.position() + 20
yy = ag.position() + 20
root.geometry(f'60x20+{xx}+{yy}')
etyText.set(f'{ag.position()},{ag.position()}')
ety = tk.Entry(root, textvariable=etyText)
ety.pack()
tk.mainloop()
本帖最后由 lengyue869 于 2020-12-9 21:47 编辑
................
@hrp
@Twilight6
@qiuyouzhi up up!~~ 本帖最后由 兰竹皋 于 2020-12-9 22:43 编辑
不需要用pyautogui
tkinter中每个组件可以事件绑定(通过.bind()),
定义一个事件函数,用<Motion>就行
你看看扩展教程中 事件绑定那章,很简单的
例如:
from tkinter import *
root = Tk()
def callback(event):
print("当前位置:", event.x, event.y)
frame = Frame(root, width=200, height=200)
frame.bind("<Motion>", callback)
frame.pack()
mainloop() 兰竹皋 发表于 2020-12-9 22:39
不需要用pyautogui
tkinter中每个组件可以事件绑定(通过.bind()),
定义一个事件函数,用就行
tkinter只能显示frame中的坐标,我想要显示整个桌面任意地方的坐标,比如网页的窗口最大化的坐标是多少... tk我不太熟悉,像Qt5中可以重写鼠标移动事件,让鼠标移动就触发将鼠标坐标写入编辑栏内的函数。 hrp 发表于 2020-12-10 00:31
tk我不太熟悉,像Qt5中可以重写鼠标移动事件,让鼠标移动就触发将鼠标坐标写入编辑栏内的函数。
Qt跟tk差不多,好像都是在一個框架內显示 这样写可以打包在CMD窗口显示鼠标坐标
import pyautogui as ag
import time
import os
while True:
oldX, oldY = ag.position()
time.sleep(0.3)
nowX, nowY = ag.position()
if nowX!=oldX or nowY!=oldY:
os.system('cls')
print(nowX,nowY) 新建一个线程监听鼠标移动应该就ok了吧 hrp 发表于 2020-12-11 09:11
新建一个线程监听鼠标移动应该就ok了吧
不會寫呀... lengyue869 发表于 2020-12-11 09:58
不會寫呀...
因为是用手机写的测试不了,不知道能不能运行
from threading import Thread
from time import sleep
import tkinter as tk
import pyautogui as ag
KEEP_LISTEN = False
THREAD_LISTENING = None
def listening(t):
old_pos = 0, 0
while KEEP_LISTEN:
new_pos = ag.position()
if new_pos != old_pos:
mouse_move_event(new_pos)
old_pos = new_pos
sleep(t)
def start_listen(t):
# t 是刷新时间间隔
if THREAD_LISTENING:
return
THREAD_LISTENING = Thread(target=listening, args=(t,))
THREAD_LISTENING.start()
def stop_listen():
KEEP_LISTEN = False
THREAD_LISTENING.join()
THREAD_LISTENING = None
root = tk.Tk()
root.attributes("-alpha", 0.6)
root.overrideredirect(True)
etyText = tk.StringVar()
def mouse_move_event(pos):
root.geometry(f'60x20+{pos}+{pos}')
etyText.set(f'{pos},{pos}')
ety = tk.Entry(root, textvariable=etyText)
ety.pack()
# 刷新间隔0.1秒
start_listen(0.1)
tk.mainloop() hrp 发表于 2020-12-11 10:33
因为是用手机写的测试不了,不知道能不能运行
出錯啦...
UnboundLocalError: local variable 'THREAD_LISTENING' referenced before assignment
lengyue869 发表于 2020-12-11 11:10
出錯啦...
UnboundLocalError: local variable 'THREAD_LISTENING' referenced before assignment
from threading import Thread
from time import sleep
import tkinter as tk
import pyautogui as ag
KEEP_LISTEN = False
THREAD_LISTENING = None
def listening(t):
old_pos = 0, 0
while KEEP_LISTEN:
new_pos = ag.position()
if new_pos != old_pos:
mouse_move_event(new_pos)
old_pos = new_pos
sleep(t)
def start_listen(t):
global THREAD_LISTENING
# t 是刷新时间间隔
if THREAD_LISTENING:
return
THREAD_LISTENING = Thread(target=listening, args=(t,))
THREAD_LISTENING.start()
def stop_listen():
global THREAD_LISTENING
KEEP_LISTEN = False
THREAD_LISTENING.join()
THREAD_LISTENING = None
root = tk.Tk()
root.attributes("-alpha", 0.6)
root.overrideredirect(True)
etyText = tk.StringVar()
def mouse_move_event(pos):
root.geometry(f'60x20+{pos}+{pos}')
etyText.set(f'{pos},{pos}')
ety = tk.Entry(root, textvariable=etyText)
ety.pack()
# 刷新间隔0.1秒
start_listen(0.1)
tk.mainloop() hrp 发表于 2020-12-11 11:31
还是不行,运行后文本框一直停留在左上角,并没有随着鼠标移动而移动,也没有将鼠标的坐标写进去... lengyue869 发表于 2020-12-11 13:31
还是不行,运行后文本框一直停留在左上角,并没有随着鼠标移动而移动,也没有将鼠标的坐标写进去...
应该是子线程不能刷新界面的原因{:10_266:}
试试这个(手机写码不能测试真难受{:10_250:})
import tkinter as tk
#import pyautogui as ag
from time import sleep
from threading import Thread
KEEP_LISTEN = False
THREAD_LISTENING = None
POSITION = 0, 0
def listening(time_interval):
global POSITION
while KEEP_LISTEN:
new_position = ag.position()
if new_pos != POSITION:
POSITION = new_position
sleep(time_interval)
def start_listen(t):
global THREAD_LISTENING
# t 是刷新时间间隔
if THREAD_LISTENING:
return
THREAD_LISTENING = Thread(target=listening, args=(t,))
THREAD_LISTENING.start()
def stop_listen():
global KEEP_LISTEN, THREAD_LISTENING
KEEP_LISTEN = False
THREAD_LISTENING.join()
THREAD_LISTENING = None
root = tk.Tk()
root.attributes("-alpha", 0.6)
root.overrideredirect(True)
etyText = tk.StringVar()
def mouse_move_event():
root.geometry(f'60x20+{POSITION}+{POSITION}')
etyText.set(f'{POSITION},{POSITION}')
root.after(100, mouse_move_event)
ety = tk.Entry(root, textvariable=etyText)
ety.pack()
# 刷新间隔0.1秒
start_listen(0.1)
root.after(100, mouse_move_event)
tk.mainloop() hrp 发表于 2020-12-11 15:13
应该是子线程不能刷新界面的原因
试试这个(手机写码不能测试真难受)
感謝熱情回復,{:5_110:},不過還是不行...{:7_121:}
這個不急,等你方便用電腦的時候再幫忙看看吧!
lengyue869 发表于 2020-12-11 15:55
感謝熱情回復,,不過還是不行...
這個不急,等你方便用電腦的時候再幫忙看看吧!
上面import pyautogui as ag忘记去掉注释了,你把#去掉{:10_247:} hrp 发表于 2020-12-11 16:16
上面import pyautogui as ag忘记去掉注释了,你把#去掉
注釋掉了,還有第14行if new_pos != POSITION 也改成 if new_position != POSITION 了 本帖最后由 hrp 于 2020-12-11 22:40 编辑
lengyue869 发表于 2020-12-11 16:21
注釋掉了,還有第14行if new_pos != POSITION 也改成 if new_position != POSITION 了
回家一试竟然发现是参数忘改了{:10_247:}
import tkinter as tk
from threading import Thread
from time import sleep
import pyautogui as ag
# 不生效的原因是KEEP_LISTEN = False忘记改True了我的天
KEEP_LISTEN = True
THREAD_LISTENING = None
POSITION = 0, 0
def listening(time_interval):
global POSITION
while KEEP_LISTEN:
new_position = ag.position()
if new_position != POSITION:
POSITION = new_position
sleep(time_interval)
def start_listen(t):
'''调用此函数开始监听'''
global THREAD_LISTENING
# t 是刷新时间间隔
if THREAD_LISTENING:
return
THREAD_LISTENING = Thread(target=listening, args=(t,))
THREAD_LISTENING.start()
def stop_listen():
'''调用此函数停止监听'''
global KEEP_LISTEN, THREAD_LISTENING
KEEP_LISTEN = False
THREAD_LISTENING.join()
THREAD_LISTENING = None
root = tk.Tk()
root.attributes("-alpha", 0.6)
root.overrideredirect(True)
etyText = tk.StringVar()
def mouse_move_event():
# POSITION + 20 原因是使输入框离鼠标远点防止影响鼠标点击,实际使用可以改回来
root.geometry(f'80x20+{POSITION + 20}+{POSITION}')
etyText.set(f'{POSITION},{POSITION}')
root.after(100, mouse_move_event)
ety = tk.Entry(root, textvariable=etyText)
ety.pack()
# 刷新间隔0.05秒
start_listen(0.05)
root.after(50, mouse_move_event)
tk.mainloop()
hrp 发表于 2020-12-11 22:19
回家一试竟然发现是参数忘改了
完美,我先用着,再慢慢研究,多谢多谢!
页:
[1]
2