Python3,Tkinter GUI崩溃和按钮保持单击

时间:2018-01-23 10:07:05

标签: python user-interface tkinter

我制作了一个包含无限循环的代码,并制作了一个带有开始按钮的Tkinter接口。

当我点击按钮时,Windows认为GUI已经崩溃 - 即使它在后台工作 - 并且按钮仍然被点击。

- 如何取消点击按钮?

- 当再次点击时,如何让同一个Tkinter窗口开始新的循环?使窗口保持响应。

示例代码:

import time
from tkinter import *

def do():
    while x > 0:
        try:
            x = 1
            x += 1
            return x
        except:
            time.sleep(x)
            x = 0

window = Tk()

Button(text='Start',width=30, command=do).grid(row=0, column=0)

mainloop()

except有一个被认为发生的异常错误,

添加一些上下文我将其与selenium库一起使用

2 个答案:

答案 0 :(得分:1)

我在这里看到了几个问题:

1。)do()前面没有def

2。)expect应为except

3。)您的while循环阻止了您的程序流程。相反,您应该使用Tk().after(wait_time, method)

话虽如此,我假设您想在按下按钮后计数。

单击按钮后,从0开始计数。 再次单击该按钮时,它将停止打印count并重置它:

from tkinter import *

class App:

    def __init__(self):
        self.root = Tk()

        self.count = 0
        self.do_count = False

        self.button = Button(self.root, text="Click me.", command=self.do)
        self.button.pack()

        self.root.mainloop()

    def do(self):
        self.do_count = not self.do_count
        if not self.do_count:
            self.count = 0
        self.update()

    def update(self):
        if self.do_count:
            print(self.count)
            self.count += 1
            self.root.after(1000, self.update)


app = App()

答案 1 :(得分:0)

这有效:

import threading
import time
from tkinter import *

def clicked():
    threading.Thread(target=do).start()

def do():
    while x > 0:
        try:
            x = 1
            x += 1
            return x
        except:
            time.sleep(x)
            x = 0

window = Tk()

Button(text='Start',width=30, command=clicked).grid(row=0, column=0)

mainloop()

使用风险,因为它自己不会让你打破循环,如果我找到了办法就会更新

编辑:

最简单的解决方案是制作守护程序线程,这有助于在关闭GUI时关闭代码,您可以通过编辑上面代码中的一行来完成此操作:

threading.Thread(target=do, daemon=True).start()