qq自动骂人工具,用python写,公开源码仅供娱乐
下载地址: http://www.pan123.fun/share.php?id=pA2XodFea&pwd=5HFS
`import random
import time
import json
import os
import threading
import tkinter as tk
import pythoncom
import comtypes.client
from tkinter import ttk, messagebox, scrolledtext
class VoicePlayerUI:
def init(self, root):
self.root = root
self.root.title("语音播放工具")
self.root.geometry("600x750")
self.root.resizable(False, False)
self.keywords = []
self.is_playing = False
self.play_thread = None
self.speed_rate = 0
self.config_file = os.path.join(os.path.dirname(os.path.abspath(file)), "voice_player_config.json")
self.load_config()
self.setup_ui()
def load_config(self):
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
self.speed_rate = config.get('speed_rate', 0)
saved_keywords = config.get('keywords', [])
if saved_keywords:
self.keywords = saved_keywords
except:
pass
def save_config(self):
config = {
'speed_rate': self.speed_rate,
'keywords': self.keywords
}
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)
def setup_ui(self):
main_frame = ttk.Frame(self.root, padding="15")
main_frame.pack(fill=tk.BOTH, expand=True)
keyword_frame = ttk.LabelFrame(main_frame, text="关键词输入 (每行一个)", padding="10")
keyword_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
self.keyword_text = scrolledtext.ScrolledText(keyword_frame, height=12, font=("Microsoft YaHei", 11))
self.keyword_text.pack(fill=tk.BOTH, expand=True)
if self.keywords:
for kw in self.keywords:
self.keyword_text.insert(tk.END, kw + "\n")
btn_frame = ttk.Frame(keyword_frame)
btn_frame.pack(fill=tk.X, pady=(5, 0))
ttk.Button(btn_frame, text="保存关键词", command=self.save_keywords).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2)
ttk.Button(btn_frame, text="清空", command=self.clear_keywords).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2)
speed_frame = ttk.LabelFrame(main_frame, text="语速设置 (-10最慢 ~ +10最快)", padding="10")
speed_frame.pack(fill=tk.X, pady=(0, 10))
ttk.Label(speed_frame, text="语速:").pack(side=tk.LEFT)
self.speed_var = tk.IntVar(value=self.speed_rate)
speed_scale = ttk.Scale(speed_frame, from_=-10, to=10, variable=self.speed_var, orient=tk.HORIZONTAL)
speed_scale.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=10)
self.speed_label = ttk.Label(speed_frame, text=str(self.speed_rate))
self.speed_label.pack(side=tk.LEFT)
speed_scale.config(command=self.on_speed_change)
ttk.Button(speed_frame, text="应用", command=self.apply_speed).pack(side=tk.RIGHT, padx=(10, 0))
control_frame = ttk.LabelFrame(main_frame, text="播放控制", padding="10")
control_frame.pack(fill=tk.X, pady=(0, 10))
btn_frame2 = ttk.Frame(control_frame)
btn_frame2.pack(fill=tk.X)
self.play_btn = ttk.Button(btn_frame2, text="开始播放", command=self.toggle_play)
self.play_btn.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2)
ttk.Button(btn_frame2, text="播放一次", command=self.play_once).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2)
status_frame = ttk.LabelFrame(main_frame, text="状态", padding="10")
status_frame.pack(fill=tk.X, pady=(0, 10))
self.status_label = ttk.Label(status_frame, text="就绪", font=("Microsoft YaHei", 10))
self.status_label.pack()
info_frame = ttk.Frame(main_frame)
info_frame.pack(fill=tk.X)
self.keyword_count_var = tk.StringVar(value=f"关键词数量: {len(self.keywords)}")
ttk.Label(info_frame, textvariable=self.keyword_count_var).pack(side=tk.LEFT)
self.play_status_var = tk.StringVar(value="状态: 未播放")
ttk.Label(info_frame, textvariable=self.play_status_var).pack(side=tk.RIGHT)
def on_speed_change(self, value):
self.speed_label.config(text=str(int(float(value))))
def apply_speed(self):
self.speed_rate = int(self.speed_var.get())
self.save_config()
self.status_label.config(text=f"语速已设置为: {self.speed_rate}")
def save_keywords(self):
content = self.keyword_text.get("1.0", tk.END).strip()
if not content:
messagebox.showwarning("警告", "请输入关键词")
return
self.keywords = [line.strip() for line in content.split("\n") if line.strip()]
self.save_config()
self.keyword_count_var.set(f"关键词数量: {len(self.keywords)}")
self.status_label.config(text=f"已保存 {len(self.keywords)} 个关键词")
def clear_keywords(self):
if messagebox.askyesno("确认", "确定要清空所有关键词吗?"):
self.keyword_text.delete("1.0", tk.END)
self.keywords = []
self.save_config()
self.keyword_count_var.set("关键词数量: 0")
self.status_label.config(text="已清空关键词")
def speak_text(self, text, rate):
pythoncom.CoInitialize()
try:
voice = comtypes.client.CreateObject("SAPI.SpVoice")
voice.Rate = rate
voice.Speak(text, 0)
finally:
pythoncom.CoUninitialize()
def play_once(self):
self.save_keywords_from_ui()
if not self.keywords:
messagebox.showwarning("警告", "请先输入关键词")
return
keyword = random.choice(self.keywords)
self.status_label.config(text=f"正在播放: {keyword}")
self.root.update()
self.speak_text(keyword, self.speed_rate)
self.status_label.config(text="播放完成")
def save_keywords_from_ui(self):
content = self.keyword_text.get("1.0", tk.END).strip()
if content:
self.keywords = [line.strip() for line in content.split("\n") if line.strip()]
self.save_config()
self.keyword_count_var.set(f"关键词数量: {len(self.keywords)}")
def toggle_play(self):
if self.is_playing:
self.stop_play()
else:
self.start_play()
def start_play(self):
self.save_keywords_from_ui()
if not self.keywords:
messagebox.showwarning("警告", "请先输入关键词")
return
self.is_playing = True
self.play_btn.config(text="停止播放")
self.play_status_var.set("状态: 播放中")
self.play_thread = threading.Thread(target=self.play_loop)
self.play_thread.daemon = True
self.play_thread.start()
self.status_label.config(text="开始循环播放...")
def stop_play(self):
self.is_playing = False
self.play_btn.config(text="开始播放")
self.play_status_var.set("状态: 已停止")
self.status_label.config(text="已停止播放")
def play_loop(self):
pythoncom.CoInitialize()
try:
while self.is_playing:
try:
keyword = random.choice(self.keywords)
current_rate = self.speed_rate
self.root.after(0, lambda k=keyword: self.status_label.config(text=f"正在播放: {k}"))
voice = comtypes.client.CreateObject("SAPI.SpVoice")
voice.Rate = current_rate
voice.Speak(keyword, 0)
time.sleep(0.5)
except Exception as e:
print(f"播放错误: {e}")
break
finally:
pythoncom.CoUninitialize()
def main():
root = tk.Tk()
app = VoicePlayerUI(root)
root.mainloop()
if name == "main":
main()
`

浙公网安备 33010602011771号