我目前正在做一个基本机器人的项目,在这个项目中,我决定让机器人随机移动,同时在随机持续时间内播放随机音符,从而创作自己的音乐。我目前有两个while循环(一个在function1中,另一个在function2中),我很好奇当我在图形用户界面上按下tkinter (ttk)按钮时,如何让这两个循环同时运行。我相信这将包括线程,但我没有太多的经验,任何帮助我弄清楚并在正确的轨道上将是伟大的。
发布于 2016-02-22 20:22:02
这里有一个
from tkinter import *
from tkinter.scrolledtext import ScrolledText
import asyncio
from random import random
async def loop1(text: ScrolledText):
while True:
text.insert(END, 'loop1\n')
text.see('end')
await asyncio.sleep(random())
async def loop2(text: ScrolledText):
while True:
text.insert(END, 'loop2\n')
text.see('end')
await asyncio.sleep(random())
async def run_tk(root, interval=0.05):
try:
while True:
root.update()
await asyncio.sleep(interval)
except TclError as e:
if "application has been destroyed" not in e.args[0]:
raise
def main():
root = Tk()
text = ScrolledText(root)
text.grid(column=0, row=0, sticky=NW+SE)
asyncio.ensure_future(loop1(text))
asyncio.ensure_future(loop2(text))
loop = asyncio.get_event_loop()
loop.run_until_complete(run_tk(root))
if __name__ == "__main__":
main()在您的应用程序中,您可以播放一个音符(或和弦),然后等待一定的时间,这对于asyncio.sleep()来说将是完美的。通常,在并发应用程序中,您需要等待一些外部资源来为您提供数据,而在这些场景中,只有当您拥有与asyncio完全协作的库时,asyncio才能真正工作。在您的情况下,您可以控制显示,因此asyncio将非常适合您(假设您播放的音符在保留的音符持续时间内不会阻塞;否则它将无法工作,您将不得不使用线程)。
另一方面,像这样手动执行tk事件循环肯定会引起一些人的不满,并可能招致鄙视。
如果您想采用线程化路线,也没问题,但请确保通过作业Queue传递线程和主循环之间的所有通信。它会变得有些复杂,而使用asyncio可以非常快速地启动和运行。
https://stackoverflow.com/questions/35402028
复制相似问题