当前位置: 首页 > 面试题库 >

如何创建Tkinter GUI停止按钮以打破无限循环?

卫财
2023-03-14
问题内容

因此,我有一个Tkinter GUI,其中有两个简单的选项,即开始和停止按钮。我已经定义了GUI布局:

from Tkinter import *

def scanning():
    while True:
        print "hello"

root = Tk()
root.title("Title")
root.geometry("500x500")

app = Frame(root)
app.grid()

此处的“开始”按钮运行无限循环扫描,而“停止”按钮在按下时应会中断:

start = Button(app, text="Start Scan",command=scanning)
stop = Button(app, text="Stop",command="break")

start.grid()
stop.grid()

但是,当我按下“开始”按钮时,它总是被按下(假定由于无限循环)。但是,我 无法单击“停止”按钮 来打破while循环。


问题答案:

您不能while True:在Tkinter事件循环所处的同一线程中启动循环。这样做将阻塞Tkinter的循环并导致程序冻结。

对于一个简单的解决方案,您可以Tk.after每秒钟左右在后台运行一个进程。下面是一个脚本来演示:

from Tkinter import *

running = True  # Global flag

def scanning():
    if running:  # Only do this if the Stop button has not been clicked
        print "hello"

    # After 1 second, call scanning again (create a recursive loop)
    root.after(1000, scanning)

def start():
    """Enable scanning by setting the global flag to True."""
    global running
    running = True

def stop():
    """Stop scanning by setting the global flag to False."""
    global running
    running = False

root = Tk()
root.title("Title")
root.geometry("500x500")

app = Frame(root)
app.grid()

start = Button(app, text="Start Scan", command=start)
stop = Button(app, text="Stop", command=stop)

start.grid()
stop.grid()

root.after(1000, scanning)  # After 1 second, call scanning
root.mainloop()

当然,您可能希望将此代码重构为一个类并running成为其属性。另外,如果您的程序变得很复杂,那么研究Python的threading模块将是有益的,这样您的scanning函数可以在单独的线程中执行。



 类似资料:
  • 启动无限循环后,我无法关闭JFrame。 我想停止无限循环使用停止按钮。 我用开始按钮开始一个无限循环。我想用“停止”按钮关闭那个回路。 > if(stop.getModel(). isP的()){中断;}不工作 actionListener用于识别按钮单击并在循环也不起作用时使用中断语句终止 点击停止按钮,无限循环必须终止。在使用start Button启动无限循环后,我无法使用JFrame中的

  • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。

  • 我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 问题内容: 我有一个运行在无限循环上的脚本,并将其添加到数据库中,并且执行了一些我不能只停止一半的事情,所以我不能只按ctrl + C并停止它。 我希望能够以某种方式停止while循环,但是让它在停止之前完成最后一次迭代。 让我澄清一下: 我的代码看起来像这样: 我希望能够在结束或开始时中断while循环,但不要在执行操作之间中断,因为那样会很不好。 而且我不希望它在每次迭代后问我是否要继续。 感

  • 问题内容: 尽管我知道问这个问题会有点愚蠢,但我仍然想查询有关它的技术观点的更多信息。 无限循环的简单示例: 如何从此类外部中断(停止)此无限循环(例如,在继承的帮助下)? 问题答案: 即使写这篇文章我也觉得很脏,但是… 从不同的线程,你可以调用一个实现,抛出一个当你调用。