【问题标题】:How to make two functions containing while loops run simultaneously with tkinter (ttk) button如何使包含while循环的两个函数与tkinter(ttk)按钮同时运行
【发布时间】:2016-05-25 22:19:11
【问题描述】:

我目前正在做一个与基本机器人有关的项目,我决定让机器人随机移动,同时随机播放随机音符,从而创作自己的音乐。我目前有两个while循环(一个在function1中,另一个在function2中),我很好奇当我按下GUI上的tkinter(ttk)按钮时如何让这两个循环同时运行。我相信这将包括线程,但我对此没有太多经验,任何能帮助我弄清楚并走上正轨的东西都会很棒。

【问题讨论】:

  • 任何同时运行的东西都需要线程(或多个进程,但不要从那里开始)。查找有关线程和开始工作的基本教程是开始的地方。
  • 在这两个循环体中,代码是不是需要很长时间才能运行?只要任何单个音符或任何单个动作可能需要 100 毫秒或更短的时间,您就不需要线程。您的问题的答案取决于您在这些其他循环中实际执行的操作。

标签: python multithreading lambda tkinter ttk


【解决方案1】:

这里有一个?

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 对你来说是完美的(假设你的 played note 在持有的笔记期间不会阻塞;否则它不会工作,你将必须使用线程)。

另一方面,像这样手动泵送tk 事件循环肯定会引起一些人的注意,并且可能会引起嘲笑。

如果你想走线程路线,那也没关系,但请确保你通过作业Queue 传递线程和主循环之间的所有通信。它变得有些复杂,而您可以使用asyncio 快速启动并运行。

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多