You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:43:14