[Python] 纯文本查看 复制代码
# -*- coding: utf8 -*-
import time,re,os,pickle
import tkinter as tk
from tkinter import messagebox,ttk
import pyautogui
import keyboard
import logging
import threading
# 初始化一个空列表来保存坐标点
coordinates = []
# 声明一个全局变量,用于控制循环的启动和停止
is_running = False
click_count = 0 # 循环计数器
clickNum = 0 # 标记
# 设置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def get_mouse_position():
global clickNum
x, y = pyautogui.position()
coordinates.append((x, y))
update_message(f"{x}, {y}\n")
# 清空信息
def clear():
global click_count
#清空已获取的坐标点
entry1.delete(0, tk.END)
entry2.delete(0, tk.END)
coordinates.clear()
is_running = False
click_count = 0 # 循环计数器
message.config(state='normal') # 确保Text组件是可编辑的
message.delete('1.0', tk.END) # 删除从第一行第一个字符到最后一个字符的所有内容
message.config(state='disabled') # 清空后再次设置为禁止输入状态
# 清空并删除已保存到文件里的数据
messagebox.showinfo("信息","所有数据已清空")
# 启动连点
def startClickThread():
global is_running,click_count
seconds1 = float(entry1.get())
seconds2 = float(entry2.get())
while is_running:
try:
# 遍历coordinates列表中的每个坐标点
for x, y in coordinates:
# 移动鼠标到坐标点(x, y)
pyautogui.moveTo(x, y)
# 模拟鼠标点击
pyautogui.click()
time.sleep(seconds2)
# 一轮循环完成,增加计数器
click_count += 1
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
update_message(f"{current_time} 第 {click_count} 次循环结束\n")
# 等待-秒
time.sleep(seconds1)
except pyautogui.FailSafeException:
update_message("操作取消,因为鼠标移动到了屏幕角落。\n")
is_running = False
except Exception as e:
logging.error(f"发生错误:{e}")
is_running = False
# 启动或停止
def startOrStop():
global is_running
if check_empty():
# 如果两者都为空,则不执行任何操作
messagebox.showwarning("警告", "时间和坐标列表都不能为空!\n")
return
if not is_running:
is_running = True
update_message("-----启动连点,当前每 {} 秒点击一次-----\n".format(entry2.get()))
threading.Thread(target=startClickThread).start() # 使用线程启动连点操作
else:
is_running = False
update_message("-----停止连点-----\n")
def check_empty():
# 检查entry1,entry2是否为空
if entry1.get().strip() == "" or entry2.get().strip() == "":
return True
if len(coordinates) == 0:
return True
return False
def update_message(message_text):
def safe_update():
message.config(state='normal')
message.insert(tk.END, message_text)
message.config(state='disabled')
# 滚动到最底部
message.yview(tk.END)
root.after(0, safe_update)
# 监听F6键
keyboard.add_hotkey('f6', get_mouse_position)
# 监听F7键
keyboard.add_hotkey('f7', startOrStop)
# 创建主窗口
root = tk.Tk()
# 获取屏幕宽度和高度
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 获取窗口的宽度和高度
win_width = 650 # 假设窗口宽度为650像素
win_height = 400 # 假设窗口高度为400像素
# 计算窗口在屏幕上的位置
x = (screen_width / 2) - (win_width / 2)
y = (screen_height / 2) - (win_height / 2)
# 设置窗口的位置
root.geometry(f'{win_width}x{win_height}+{int(x)}+{int(y)}')
# 获取当前脚本的绝对路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建图标文件的绝对路径
icon_path = os.path.join(script_dir, 'config', 'click.png')
win_image = tk.PhotoImage(file='.\\config\\click.png')
root.iconphoto(False, win_image)
root.title("自动连点器")
root.geometry("650x400")
# 创建标签
label = tk.Label(root, text="按下F6获取当前鼠标坐标")
label.pack(pady=10)
# 下一个大循环
frame1 = tk.Frame(root)
frame1.pack(fill=tk.X, expand=True)
label1 = tk.Label(frame1, text="距离下一个循环点击时间:")
label1.pack(side=tk.LEFT, fill=tk.X, padx=(20, 10))
entry1 = tk.Entry(frame1, width=10)
entry1.pack(side=tk.LEFT, fill=tk.X, expand=True)
label2 = tk.Label(frame1, text="s/秒")
label2.pack(side=tk.LEFT, fill=tk.X, padx=(20, 10))
# 下一次点击
frame2 = tk.Frame(root)
frame2.pack(fill=tk.X, expand=True)
label3 = tk.Label(frame2, text="距离下一个点击时间:")
label3.pack(side=tk.LEFT, fill=tk.X, padx=(20, 10))
entry2 = tk.Entry(frame2, width=10)
entry2.pack(side=tk.LEFT, fill=tk.X, expand=True)
label4 = tk.Label(frame2, text="s/秒")
label4.pack(side=tk.LEFT, fill=tk.X, padx=(20, 10))
# 创建按钮
frame5 = tk.Frame(root)
frame5.pack(fill=tk.X, expand=True)
button1 = tk.Button(frame5, text="清空", command=clear)
button1.pack(side=tk.LEFT, fill=tk.X, expand=True)
button2 = tk.Button(frame5, text="启动/停止(F7)", command=startOrStop)
button2.pack(side=tk.LEFT, fill=tk.X, expand=True)
# 创建一个Label用于显示信息
message = tk.Text(root, state='disabled')
message.pack(fill=tk.BOTH, expand=True,padx=5, pady=5)
# 运行主循环
root.mainloop()
keyboard.wait()