首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用tkinter (ttk)按钮使包含while循环的两个函数同时运行

如何使用tkinter (ttk)按钮使包含while循环的两个函数同时运行
EN

Stack Overflow用户
提问于 2016-02-15 13:26:01
回答 1查看 612关注 0票数 0

我目前正在做一个基本机器人的项目,在这个项目中,我决定让机器人随机移动,同时在随机持续时间内播放随机音符,从而创作自己的音乐。我目前有两个while循环(一个在function1中,另一个在function2中),我很好奇当我在图形用户界面上按下tkinter (ttk)按钮时,如何让这两个循环同时运行。我相信这将包括线程,但我没有太多的经验,任何帮助我弄清楚并在正确的轨道上将是伟大的。

EN

回答 1

Stack Overflow用户

发布于 2016-02-22 20:22:02

这里有一个

代码语言:javascript
复制
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可以非常快速地启动和运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35402028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档