""" 刷怪辅助脚本 - GUI版本 一键运行,自动打包exe """ import tkinter as tk from tkinter import ttk, messagebox import threading import time import sys import os # 尝试导入 pynput try: from pynput import keyboard, mouse LIBRARY_OK = True except ImportError as e: LIBRARY_OK = False MISSING_LIB = str(e) class FarmApp: def __init__(self): self.root = tk.Tk() self.root.title("刷怪辅助工具 v1.0") self.root.geometry("600x500") self.root.resizable(False, False) # 状态 self.running = False self.paused = False self.current_loop = 0 self.loop_count = 0 self.mouse_controller = None self.keyboard_controller = None self.setup_ui() # 快捷键监听 self.setup_hotkeys() def setup_hotkeys(self): def on_press(key): try: if key == keyboard.Key.f9: self.paused = not self.paused self.update_status(f"[{'暂停' if self.paused else '继续'}]") elif key == keyboard.Key.esc: self.stop() except AttributeError: pass listener = keyboard.Listener(on_press=on_press) listener.daemon = True listener.start() def setup_ui(self): # 标题 title_frame = tk.Frame(self.root, bg="#2c3e50", height=50) title_frame.pack(fill="x") title_frame.pack_propagate(False) tk.Label( title_frame, text="🗡️ 刷怪辅助工具", font=("Microsoft YaHei", 18, "bold"), fg="white", bg="#2c3e50" ).pack(pady=10) main_frame = tk.Frame(self.root, padx=20, pady=10) main_frame.pack(fill="both", expand=True) # --- 坐标输入区 --- tk.Label(main_frame, text="📍 路径点坐标 (每行一个点,格式: x,y)", font=("Microsoft YaHei", 11)).pack(anchor="w") coord_frame = tk.Frame(main_frame) coord_frame.pack(fill="both", pady=5) self.coord_text = tk.Text(coord_frame, height=8, font=("Consolas", 10)) self.coord_text.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(coord_frame, command=self.coord_text.yview) scrollbar.pack(side="right", fill="y") self.coord_text.config(yscrollcommand=scrollbar.set) # 默认示例 self.coord_text.insert("1.0", "300,400\n500,400\n700,400\n500,600") # --- 设置区 --- settings_frame = tk.Frame(main_frame) settings_frame.pack(fill="x", pady=10) # 技能键 tk.Label(settings_frame, text="技能键:", font=("Microsoft YaHei", 10)).grid(row=0, column=0, sticky="w") self.skill_var = tk.StringVar(value="1") skill_spin = ttk.Spinbox(settings_frame, from_=1, to=9, textvariable=self.skill_var, width=5) skill_spin.grid(row=0, column=1, sticky="w", padx=(0, 20)) # 循环次数 tk.Label(settings_frame, text="循环次数:", font=("Microsoft YaHei", 10)).grid(row=0, column=2, sticky="w") self.loop_var = tk.StringVar(value="0") tk.Label(settings_frame, text="(0=无限)", font=("Microsoft YaHei", 8), fg="gray").grid(row=0, column=3, sticky="w") loop_spin = ttk.Spinbox(settings_frame, from_=0, to=9999, textvariable=self.loop_var, width=8) loop_spin.grid(row=0, column=4, sticky="w", padx=(0, 20)) # 移动延迟 tk.Label(settings_frame, text="移动延迟(s):", font=("Microsoft YaHei", 10)).grid(row=0, column=5, sticky="w") self.move_delay_var = tk.StringVar(value="0.3") move_spin = ttk.Spinbox(settings_frame, from_=0.1, to=5.0, increment=0.1, textvariable=self.move_delay_var, width=6) move_spin.grid(row=0, column=6, sticky="w") # --- 控制按钮 --- btn_frame = tk.Frame(main_frame) btn_frame.pack(pady=15) self.start_btn = tk.Button( btn_frame, text="▶ 开始", command=self.start, width=12, height=2, font=("Microsoft YaHei", 12), bg="#27ae60", fg="white", relief="flat", cursor="hand" ) self.start_btn.pack(side="left", padx=10) self.stop_btn = tk.Button( btn_frame, text="■ 停止", command=self.stop, width=12, height=2, font=("Microsoft YaHei", 12), bg="#e74c3c", fg="white", relief="flat", cursor="hand" ) self.stop_btn.pack(side="left", padx=10) # --- 状态显示 --- status_frame = tk.Frame(main_frame, bg="#ecf0f1", relief="sunken", bd=1) status_frame.pack(fill="x", pady=10) self.status_label = tk.Label( status_frame, text="状态: 等待开始", font=("Microsoft YaHei", 11), anchor="w", padx=10, pady=8 ) self.status_label.pack(fill="x") # --- 日志区 --- tk.Label(main_frame, text="📋 日志", font=("Microsoft YaHei", 10)).pack(anchor="w") log_frame = tk.Frame(main_frame) log_frame.pack(fill="both", expand=True, pady=5) self.log_text = tk.Text(log_frame, height=6, font=("Consolas", 9), state="disabled") self.log_text.pack(side="left", fill="both", expand=True) log_scroll = ttk.Scrollbar(log_frame, command=self.log_text.yview) log_scroll.pack(side="right", fill="y") self.log_text.config(yscrollcommand=log_scroll.set) # --- 底部提示 --- tk.Label( main_frame, text="💡 提示: 开始前先切换到游戏窗口 | F9暂停 | ESC停止", font=("Microsoft YaHei", 8), fg="gray" ).pack(pady=5) def log(self, message): self.log_text.config(state="normal") self.log_text.insert("end", f"{message}\n") self.log_text.see("end") self.log_text.config(state="disabled") def update_status(self, message): self.status_label.config(text=f"状态: {message}") def parse_waypoints(self): waypoints = [] content = self.coord_text.get("1.0", "end").strip() for line in content.split("\n"): line = line.strip() if not line: continue try: parts = line.split(",") x = int(parts[0].strip()) y = int(parts[1].strip()) waypoints.append((x, y)) except: self.log(f"⚠️ 跳过无效行: {line}") return waypoints def start(self): global LIBRARY_OK if not LIBRARY_OK: messagebox.showerror("错误", f"缺少库: {MISSING_LIB}\n请运行: pip install pynput") return if self.running and not self.paused: return if self.paused: self.paused = False self.log("▶ 继续执行") return waypoints = self.parse_waypoints() if len(waypoints) < 2: messagebox.showwarning("警告", "请至少输入2个路径点") return skill_key = self.skill_var.get() try: self.loop_count = int(self.loop_var.get()) self.move_delay = float(self.move_delay_var.get()) except ValueError: messagebox.showerror("错误", "请输入有效的数字") return self.log(f"🚀 开始刷怪循环") self.log(f" 路径点: {len(waypoints)} 个") self.log(f" 技能键: {skill_key}") self.log(f" 循环: {'无限' if self.loop_count == 0 else self.loop_count}") self.running = True self.paused = False self.current_loop = 0 self.start_btn.config(text="⏸ 暂停中", bg="#f39c12") # 启动工作线程 thread = threading.Thread(target=self.run_loop, args=(waypoints, skill_key), daemon=True) thread.start() def stop(self): self.running = False self.paused = False self.log("■ 已停止") self.update_status("已停止") self.start_btn.config(text="▶ 开始", bg="#27ae60") def run_loop(self, waypoints, skill_key): self.mouse_controller = mouse.Controller() self.keyboard_controller = keyboard.Controller() while self.running: if self.loop_count > 0 and self.current_loop >= self.loop_count: self.root.after(0, lambda: self.log("✅ 完成指定循环次数")) self.root.after(0, lambda: self.stop()) break self.current_loop += 1 self.root.after(0, lambda n=self.current_loop: self.log(f"--- 第 {n} 轮 ---")) self.root.after(0, lambda: self.update_status(f"执行中: 第{self.current_loop}轮")) for i, (x, y) in enumerate(waypoints): if not self.running: break while self.paused and self.running: time.sleep(0.1) if not self.running: break # 移动 self.mouse_controller.position = (x, y) time.sleep(0.05) self.mouse_controller.click(mouse.Button.left, 1) self.root.after(0, lambda px=x, py=y, idx=i: self.log(f" 点{idx+1}: ({px}, {py})")) time.sleep(self.move_delay) # 技能 with self.keyboard_controller.press(skill_key): pass self.root.after(0, lambda k=skill_key: self.log(f" 技能 {k}")) time.sleep(0.1) time.sleep(0.5) self.root.after(0, lambda: self.start_btn.config(text="▶ 开始", bg="#27ae60")) def run(self): self.root.mainloop() if __name__ == "__main__": # 检查依赖 if not LIBRARY_OK: root = tk.Tk() root.withdraw() msg = f"缺少 pynput 库\n\n请在命令行运行:\npip install pynput" messagebox.showerror("缺少依赖", msg) sys.exit(1) app = FarmApp() app.run()