我正在嘗試使用 discord.py 庫將訊息發送到使用其名稱的頻道。這個庫是異步的,我在發送超過 1 條訊息時遇到問題。當我嘗試在該send函式已被呼叫后發送訊息時,我得到了這個
Task exception was never retrieved
future: <Task finished name='Task-13' coro=<send() done, defined at C:\Users\paula\DiscordBot\Bot.py:65> exception=RuntimeError('cannot reuse already awaited coroutine')>
RuntimeError: cannot reuse already awaited coroutine
發送功能:
async def send():
global en_message, en_ChannelName
guild = client.get_guild(some_guild_ID_you_want)
for channel in guild.channels:
if en_ChannelName.get().lower() in channel.name.lower() and type(channel) == discord.channel.TextChannel and en_ChannelName.get() != "":
await channel.send(en_message.get())
break
它被呼叫的代碼:
bt_Send = tk.Button(text="Send", command=partial(client.loop.create_task, send()))
我還必須提到不和諧客戶端在非主執行緒上運行(代碼:
thread_runBot = t.Thread(target=partial(client.run, botToken))
thread_runBot.start()
TK_dialog.mainloop()
)
uj5u.com熱心網友回復:
正如錯誤所述,您不能兩次使用協程。
不過有辦法解決這個問題。您可以創建一個具有自定義的類,該類__call__在嘗試呼叫時會更改其行為。
class CoroutineCaller:
def __call__(*args, **kwargs):
# you can also use `asyncio.get_event_loop().create_task` if this doesn't work
client.loop.create_task(send(*args, **kwargs))
sender = CoroutineCaller()
當您這樣做sender()時,它將創建一個新的協程并將其添加到客戶端回圈中。
然后,您可以執行以下操作:
bt_Send = tk.Button(text="Send", command=sender)
這是一個更新版本,可讓您多次呼叫任何協程。
class CoroutineCaller:
def __call__(coro, *args, **kwargs):
client.loop.create_task(coro(*args, **kwargs))
你可以這樣稱呼caller(ctx.send, 'random message', embed=discord.Embed(title='test'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496636.html
