【问题标题】:Python - Abort current function without stop running tkinter mainloopPython - 在不停止运行 tkinter mainloop 的情况下中止当前函数
【发布时间】:2018-07-16 03:50:08
【问题描述】:

我是Python新手,如果有可能像下面的情况那样立即实现abort。

条件:2个按钮:Start & Abort

当我按下Start按钮时,代码应该开始做一个函数,如果我按下Abort按钮,不管它做了什么,函数都会立即停止,并变成初始状态(在按下@之前987654326@按钮)。

此外,我知道“signal.CTRL_C_EVENT / CTRL_BREAK_EVENT”,但它会关闭所有代码,包括Tkinter mainloop

【问题讨论】:

  • 你尝试了什么,为什么这个尝试失败了?又名Minimal, Complete, and Verifiable example
  • 我想象你需要一个线程和真/假变量的组合,可以由 tkinter 更新并由函数读取。这个函数是某种循环还是只是执行一些可能需要时间的命令?
  • 我有很多测试项目,可以通过检查按钮选择,每个测试项目都有自己的功能,比如发送命令,控制设备,读取反馈和延迟......等等

标签: python python-3.x tkinter


【解决方案1】:

这取决于你想要完成什么。

这是一个在类中使用循环方法的示例。如果您有某种函数要在循环中运行,则此方法有效。您只需要将运行检查放在最能有效打破循环的地方。

import tkinter as tk


class Example(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.running = False
        tk.Button(self, text="Start", command=self.start).pack()
        tk.Button(self, text="abort", command=self.abort).pack()

    def start(self):
        self.running = True
        self.running_loop()

    def abort(self):
        self.running = False

    def running_loop(self):
        if self.running == True:
            print("running")
            self.after(100, self.running_loop)
        else:
            print("stopped")


app = Example()
app.mainloop()

如果您正在做一些更复杂的事情,比如需要运行一些复杂的查询,那么您可能需要使用多线程来执行此操作,以便将进程与 Tkinter 分开。原因是 Tkinter 是单线程事件驱动程序,本身不能多线程。所以我们需要管理需要通过线程中止的事情。这有点复杂,可能需要逐案处理,所以我需要更多地了解您正在尝试做什么。

【讨论】:

  • 非常感谢,我想做的有点复杂。例如,我有3个测试项目,第一个测试是time.sleep(10),第二个测试是通过pyserial与产品通信,第三个测试是控制电源,频谱等仪表。
  • 当我测试第一个项目时,如果我想在任何时候中止这个,如果 python 正在运行 time.sleep(10) 时可能的话?
  • 不要在 Tkinter 中使用 sleep。他们打得不好。请改用after()
  • 好的!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多