CustomTkinter GUI调用VTubeStudio/VoiceVox API时WebSocket连接断开求助
解决CustomTkinter中VTubeStudio WebSocket连接保持问题
问题核心是你原来的代码把VTS的WebSocket连接放在main()函数里当局部变量用,main()执行完之后这个连接实例就被垃圾回收了,连接直接断开,等点击按钮调用myvts.request()时自然会报错。要解决这个问题,得把VTS连接实例绑定到GUI的生命周期上,让它在窗口打开期间一直保持活跃。
具体修改方案
1. 把VTS连接实例封装到GUI类中
不要在main()里临时创建连接,而是在CustomTkinter的窗口类初始化时建立连接,把连接实例存为类的属性,这样只要窗口没关闭,连接就不会被销毁。
2. 修改后的示例代码
import customtkinter as ctk # 替换成你实际使用的VTS API客户端库 from vts_api_client import VTubeStudioClient class VTSVoiceVoxController(ctk.CTk): def __init__(self): super().__init__() self.title("VTS + VoiceVox 控制器") self.geometry("400x200") # 初始化并保持VTS连接 self.vts_client = VTubeStudioClient() try: # 建立WebSocket连接,根据你用的库调整方法名 self.vts_client.connect() print("VTubeStudio 连接成功") except Exception as e: print(f"VTS连接失败: {str(e)}") # 创建功能按钮 self.execute_btn = ctk.CTkButton( self, text="启动VTS与VoiceVox", command=self.run_services ) self.execute_btn.pack(pady=60) def run_services(self): # 调用VTS热键请求,用类属性里的活跃连接 hotkey_request = { "apiName": "VTubeStudioPublicAPI", "apiVersion": "1.0", "requestID": "123", "messageType": "TriggerHotkeyRequest", "data": {"hotkeyID": "your_hotkey_id_here"} } try: self.vts_client.request(hotkey_request) # 这里添加VoiceVox的执行代码 print("服务执行完成") except Exception as e: print(f"执行出错: {str(e)}") def destroy(self): # 窗口关闭时主动断开VTS连接 if hasattr(self, 'vts_client'): self.vts_client.disconnect() super().destroy() if __name__ == "__main__": app = VTSVoiceVoxController() app.mainloop()
关键注意事项
- 连接异常处理:初始化连接时要捕获异常,避免连接失败直接导致GUI崩溃
- 主动关闭连接:在窗口销毁时调用
disconnect(),避免残留无效连接 - VoiceVox同理:如果VoiceVox也需要长期连接或实例,同样把它封装到GUI类里,不要用局部变量
内容的提问来源于stack exchange,提问作者user60739
相关产品推荐
相关产品推荐

