VIDEO
tk.Tk()
で、本体作成
geometry
で、大きさと位置
tk.Label
で、文字やフォント
label1.place(x=0, y=10)
で、設置
import tkinter as tk
root = tk.Tk()
root.geometry("500x500+100+100" )
label1 = tk.Label(root, text='あああああ' ,font=("Arial" , 40 ))
label1.place(x=0 , y=10 )
root.attributes("-topmost" , True )
root.mainloop()
マウスの移動距離計算
インストール
pip install pyautogui
import math
import pyautogui
pix = 0.00024
dis = 0
x_old, y_old = pyautogui.position()
def mouse_move ():
global dis,x_old, y_old
x_now, y_now = pyautogui.position()
dis += math.floor(math.sqrt((x_now - x_old)**2 +(y_now - y_old)**2 ))*pix
x_old = x_now
y_old = y_now
label1.config(text=f"移動: {dis}" )
root.after(300 ,mouse_move)
root.after(300 ,mouse_move)
1ピクセル 0.00024mで計算(モニターの解像度によって違う )
pyautogui.position()
でマウスのx,y座標取得できる
math.sqrt
でルート
math.floor
で小数点以下を切り捨て
label1.config
で文字を上書き
root.after(300,mouse_move)
で0.3秒後にmouse_moveを実行
mouse_move内にroot.after(300,mouse_move)
があるのでまた0.3秒後にmouse_moveを実行…
キーボード入力監視
tkinter とは別に監視する
pynput
キーボード入力監視するために必要
インストール
pip install pynput
from pynput import keyboard
def k_press (key):
print (key)
keyboard_listener = keyboard.Listener(on_press=k_press)
keyboard_listener.start()
下の黒字2行書いておけば、裏で勝手にキーボード入力監視してくれる
keyboard_listener.stop()
で止めないとずっと監視してしまうらしい
※1回しか押していないのに、連続で押されたことになってしまう。
なので時間で制御する
マウスクリック,ホイールイベントを監視
上といっしょ
キーボードともtkinter とも別に監視する
書いておけば裏で勝手に監視してくれる
from pynput import mouse
def mo_click (x, y, button, pressed):
print (x, y, button, pressed)
def ho (x, y, dx, dy):
print (x,y,dx,dy)
mouse_listener = mouse.Listener(on_click=mo_click)
mouse_listener.start()
wheel_listener = mouse.Listener(on_scroll=ho)
wheel_listener.start()
x,y
はクリック,ホイールされた座標
button
はどのマウスクリックされたか(右、左、ホイール)
pressed
はクリックされたらTrue、離されたらFalse
dx,dy
はホイール上で(0,1),ホイール下で(0,-1)
mouse_listener.stop()
wheel_listener.stop()
で止めないとずっと監視してしまうらしい
※1回しか押していないのに、連続で押されたことになってしまう。
なので時間で制御する
まとめ
import time
import math
import tkinter as tk
import pyautogui
from pynput import keyboard
from pynput import mouse
width = 800
height = 480
pix = 0.00024
dis = 0
x_old, y_old = pyautogui.position()
def mouse_move ():
global dis,x_old, y_old
x_now, y_now = pyautogui.position()
dis += (math.sqrt((x_now - x_old)**2 +(y_now - y_old)**2 ))*pix
x_old = x_now
y_old = y_now
label1.config(text=f"移動: {round(dis, 1)}m" )
label2.config(text=f"キーボード: {key_count}" )
label3.config(text=f"クリック: {mo_count}" )
label4.config(text=f"ホイール: {ho_count}" )
root.after(300 ,mouse_move)
key_count = 0
key_old_time = 0
key_now_time = 0
last_key = None
def k_press (key):
global key_count,last_key,key_now_time,key_old_time
if key != last_key:
key_count+=1
last_key = key
key_old_time = time.time()
else :
key_now_time = time.time()
if key_now_time - key_old_time > 0.1 :
key_count+=1
key_old_time = time.time()
keyboard_listener = keyboard.Listener(on_press=k_press)
keyboard_listener.start()
mo_count = 0
mo_old_time = 0
mo_now_time = 0
last_mo = None
def mo_click (x, y, button, pressed):
global mo_count,mo_old_time,mo_now_time,last_mo
if pressed:
if button != last_mo:
mo_count += 1
last_mo = button
mo_old_time = time.time()
else :
mo_now_time = time.time()
if mo_now_time - mo_old_time > 0.05 :
mo_count+=1
mo_old_time = time.time()
mouse_listener = mouse.Listener(on_click=mo_click)
mouse_listener.start()
ho_count = 0
ho_old_time = 0
ho_old_time = time.time()
def ho (x, y, dx, dy):
global ho_count,ho_old_time
if time.time() - ho_old_time > 0.05 :
ho_count += abs (dy)
ho_old_time = time.time()
wheel_listener = mouse.Listener(on_scroll=ho)
wheel_listener.start()
root = tk.Tk()
root.title("見えるか" )
w,h= pyautogui.size()
root.geometry(f"{width}x{height}+{(w-width)}+{(h-height)}" )
label1 = tk.Label(root, text=f'移動:{round(dis, 1)}m' ,font=("Arial" , 40 ))
label1.place(x=0 , y=10 )
label2 = tk.Label(root, text=f'キーボード:{key_count}' ,font=("Arial" , 40 ))
label2.place(x=0 , y=110 )
label3 = tk.Label(root, text=f'クリック:{mo_count}' ,font=("Arial" , 40 ))
label3.place(x=0 , y=210 )
label4 = tk.Label(root, text=f'ホイール:{ho_count}' ,font=("Arial" , 40 ))
label4.place(x=0 , y=310 )
root.attributes("-topmost" , True )
root.after(300 ,mouse_move)
root.mainloop()
おまけ(時間とセーブ機能つき)