我一起使用Tkinter和discord.py,我想让它在按下按钮时更改用户的昵称。要更改昵称,discord.py使用命令yield from client.change_nickname(server.me, string)
但是当我在一个按钮的命令中运行该代码时,该函数永远不会运行。我使用了print语句来确保,并且没有任何函数被运行。我试图使用多线程来启动该功能,但是没有用,任何帮助都会受到赞赏
async def test2():
server = client.get_server("345548250432012298")
await client.change_nickname(server.me, "testing")
def test():
threading.Thread(target=test2).start()
def makeThing(nicks):
frame = Tk()
for i in range(0, len(nicks)):
Button(frame, text=nicks[i], command= test).grid(row=i)
frame.mainloop()
答案 0 :(得分:0)
您的问题是您尝试使用async def
模块调用threading
协程。要使其工作,您需要使用asyncio
在test
函数中运行事件循环。假设您不关心主线程中长时间运行的调用的含义,您可以直接使用run_until_complete
。
import asyncio
async def test2():
server = client.get_server("345548250432012298")
await client.change_nickname(server.me, "testing")
def test():
loop = asyncio.get_event_loop()
loop.run_until_complete(test2())
loop.close()
def makeThing(nicks):
frame = Tk()
for i in range(0, len(nicks)):
Button(frame, text=nicks[i], command= test).grid(row=i)
frame.mainloop()
如果您需要在一个事件循环中进行更多异步调用,请改用ensure_future
。请注意,只要您在线程中调用threading
,就可以使用run_until_complete
(正如您所推测的那样)将异步调用断开到其自己的线程中。
此answer应该可以帮助您使用带有asyncio的线程(在该答案中,@asyncio.coroutine
通常等同于async def
but there do exist some differences),此async/await tutorial应该投放你很适合一般学习。