【问题标题】:Python tkinter start and stop loop?Python tkinter 启动和停止循环?
【发布时间】:2013-12-25 18:24:23
【问题描述】:

我一直在尝试制作一个有 2 个按钮的程序,按其中一个将启动无限循环,按另一个将停止。

我尝试过的所有方法都会暂停循环。

from Tkinter import *
import time
s = 0

def stopit():
    s = 1
    print "stoped"
#
def callback():

    if s == 0:
        while True:
            print "called the callback!"
            time.sleep(3)
            if s == 1:
                break
            #
        #
    #
#

root = Tk()

def main():


    # create a menu
    menu = Menu(root)
    root.config(menu=menu)

    b = Button(root, command=stopit)
    b.pack()


    filemenu = Menu(menu)
    menu.add_cascade(label="File", menu=filemenu)
    filemenu.add_command(label="New", command=callback)
    filemenu.add_command(label="Open...", command=callback)
    filemenu.add_separator()
    filemenu.add_command(label="Exit", command=callback)

    helpmenu = Menu(menu)
    menu.add_cascade(label="Help", menu=helpmenu)
    helpmenu.add_command(label="About...", command=callback)

    mainloop()
    time.sleep(3)
#

main()

【问题讨论】:

  • 问题是什么?另外,请贴出相关代码。
  • 我正在尝试这样做,所以如果你按下一个按钮,它将运行一个循环,如果你按下另一个按钮,它将停止它。
  • @tobias_k。你的意思是?我想要它,让它跳出循环,而不是只是暂停。
  • 当我运行程序时,GUI 只是冻结,因为callback 方法永远不会完成,所以我根本无法按下“停止”按钮。您应该尝试改用Tkinter.after
  • @tobias_K 谢谢!!这似乎有效!

标签: python loops tkinter


【解决方案1】:

你的代码有两个问题:

  • 您的 callback 方法永远不会完成(由于无限循环),导致 GUI 冻结。相反,请使用after 方法安排在该方法完成后再次执行callback
  • 您的stopit 方法创建了一个局部变量s,而不是更改全局变量。使用 global 关键字来解决此问题。

把这两种方法改成这样,应该可以了:

def stopit():
    global s
    s = 1
    print "stopped"

def callback():
    if s == 0:
        print "called the callback!"
        root.after(3000, callback)

【讨论】:

  • 我试过这个pastebin.com/gmwc9nTx,但我在 Tkinter 回调 Traceback 中遇到了这个错误异常(最近一次调用最后一次):文件“/usr/lib/python2.7/lib-tk/Tkinter.py” ,第 1473 行,在 call 中返回 self.func(*args) 文件“gui.py”,第 12 行,在回调中 if s == 0: NameError: global name 's' is not defined
  • 我通过这样做pastebin.com/SwknxkCs 修复了错误,但现在当我点击停止时,它只是说停止但继续进行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多