lengyue869 发表于 2020-12-9 16:27:38

怎么实时显示鼠标坐标?


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


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 17:56:23

本帖最后由 lengyue869 于 2020-12-9 21:47 编辑

................
@hrp
@Twilight6
@qiuyouzhi

lengyue869 发表于 2020-12-9 21:48:09

up up!~~

兰竹皋 发表于 2020-12-9 22:39:40

本帖最后由 兰竹皋 于 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()

lengyue869 发表于 2020-12-9 23:25:15

兰竹皋 发表于 2020-12-9 22:39
不需要用pyautogui
tkinter中每个组件可以事件绑定(通过.bind()),
定义一个事件函数,用就行


tkinter只能显示frame中的坐标,我想要显示整个桌面任意地方的坐标,比如网页的窗口最大化的坐标是多少...

hrp 发表于 2020-12-10 00:31:17

tk我不太熟悉,像Qt5中可以重写鼠标移动事件,让鼠标移动就触发将鼠标坐标写入编辑栏内的函数。

lengyue869 发表于 2020-12-10 07:52:10

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

Qt跟tk差不多,好像都是在一個框架內显示

lengyue869 发表于 2020-12-10 22:51:10

这样写可以打包在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)

hrp 发表于 2020-12-11 09:11:40

新建一个线程监听鼠标移动应该就ok了吧

lengyue869 发表于 2020-12-11 09:58:42

hrp 发表于 2020-12-11 09:11
新建一个线程监听鼠标移动应该就ok了吧

不會寫呀...

hrp 发表于 2020-12-11 10:33:43

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()

lengyue869 发表于 2020-12-11 11:10:57

hrp 发表于 2020-12-11 10:33
因为是用手机写的测试不了,不知道能不能运行

出錯啦...

UnboundLocalError: local variable 'THREAD_LISTENING' referenced before assignment

hrp 发表于 2020-12-11 11:31:20

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()

lengyue869 发表于 2020-12-11 13:31:53

hrp 发表于 2020-12-11 11:31


还是不行,运行后文本框一直停留在左上角,并没有随着鼠标移动而移动,也没有将鼠标的坐标写进去...

hrp 发表于 2020-12-11 15:13:33

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()

lengyue869 发表于 2020-12-11 15:55:02

hrp 发表于 2020-12-11 15:13
应该是子线程不能刷新界面的原因
试试这个(手机写码不能测试真难受)

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

hrp 发表于 2020-12-11 16:16:38

lengyue869 发表于 2020-12-11 15:55
感謝熱情回復,,不過還是不行...
這個不急,等你方便用電腦的時候再幫忙看看吧!

上面import pyautogui as ag忘记去掉注释了,你把#去掉{:10_247:}

lengyue869 发表于 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 了

hrp 发表于 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 了

回家一试竟然发现是参数忘改了{: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()

lengyue869 发表于 2020-12-11 23:03:26

hrp 发表于 2020-12-11 22:19
回家一试竟然发现是参数忘改了

完美,我先用着,再慢慢研究,多谢多谢!
页: [1] 2
查看完整版本: 怎么实时显示鼠标坐标?