🍣
自分用copilot生成 asyncioエラー解消
もちろんです。別のアプローチとしては、asyncio
のTask
オブジェクトを使用して非同期タスクを管理する方法があります。以下にその例を示します。
from voicevox_adapter import VoicevoxAdapter
from play_sound import PlaySound
import pyvts
import asyncio
import customtkinter as ctk
input_str = "こんにちは"
va = VoicevoxAdapter()
ps = PlaySound("スピーカー")
data,rate = va.get_voice(input_str)
app = ctk.CTk()
app.geometry("400x240")
plugin_info = {
"plugin_name": "trigger hotkey",
"developer": "OverHome",
"authentication_token_path": "./pyvts_token.txt"
}
async def voice():
ps.play_sound(data,rate)
async def main():
myvts = pyvts.vts(plugin_info=plugin_info)
await myvts.connect()
await myvts.request_authenticate_token() # get token
await myvts.request_authenticate() # use token
response_data = await myvts.request(myvts.vts_request.requestHotKeyList())
hotkey_list = []
for hotkey in response_data['data']['availableHotkeys']:
hotkey_list.append(hotkey['name'])
send_hotkey_request = myvts.vts_request.requestTriggerHotKey(hotkey_list[0])
return myvts,send_hotkey_request
myvts, send_hotkey_list = asyncio.run(main())
async def doing():
await asyncio.sleep(5)
await myvts.request(send_hotkey_list)
await voice()
def doing_def():
task = asyncio.create_task(doing())
asyncio.get_event_loop().run_until_complete(task)
button = ctk.CTkButton(app,
text="実行",
command=doing_def,
width=200,height=120)
button.grid(column=2,row=1)
app.mainloop()
このコードでは、asyncio.create_task(doing())
を使用して新しいタスクを作成し、そのタスクをasyncio.get_event_loop().run_until_complete(task)
で実行しています。これにより、WebSocket接続が適切に閉じられるまでイベントループが開いたままになります。
ただし、この修正がすべての問題を解決するわけではない可能性があります。他にも問題が発生する場合は、詳細な情報を提供してください。よろしくお願いいたします。
Discussion