用按钮Tkinter Python 3停止程序

用按钮Tkinter Python 3停止程序,python,python-3.x,tkinter,pthreads,Python,Python 3.x,Tkinter,Pthreads,我有一个与用户界面一起工作的程序:我使用一个按钮启动它,我希望在使用用户界面的过程中能够停止它: 问题是:当我启动程序时,我不能点击任何按钮,因为当我在tkinter窗口中拖动鼠标时,我有“循环”/“等待”光标,它不允许我点击界面内的任何按钮 我试图在一个新线程中启动无穷循环函数,但我不知道这是否真的是解决我的问题的好方法。。。你们有什么解决办法吗 我尝试用一个简单的代码来模拟我的问题: from tkinter import * import loop window = Tk() win

我有一个与用户界面一起工作的程序:我使用一个按钮启动它,我希望在使用用户界面的过程中能够停止它:

问题是:当我启动程序时,我不能点击任何按钮,因为当我在tkinter窗口中拖动鼠标时,我有“循环”/“等待”光标,它不允许我点击界面内的任何按钮

我试图在一个新线程中启动无穷循环函数,但我不知道这是否真的是解决我的问题的好方法。。。你们有什么解决办法吗

我尝试用一个简单的代码来模拟我的问题:

from tkinter import *
import loop


window = Tk()
window.title("test")

start = Button(window, text="start", bg ="green", command=loop.start)
stop  = Button(window, text="stop", bg ="green", command=loop.stop)
thread = Button(window, text="threads", bg ="green", command=loop.how_many_threads)

start.grid(column = 1, row = 1)
stop.grid(column = 2, row = 1)
thread.grid(column = 3 , row = 1)



window.mainloop()
而且功能很少:

import threading

continu = True



def infinit(x):
    cpt = 0
    while(x):
        cpt += 1
        #print(cpt)

    print("loop is over !")

def start():
    threadSimulation = threading.Thread(target= infinit(continu)).start()

def stop():
    self.continu = False

def how_many_threads():
    for t in threading.enumerate():
        print("thread names : ",t.getName())

如果要关闭程序,可以在按钮的命令部分使用“window.quit”,如下所示:

stop=按钮(window,text=“stop”,bg=“green”,command=window.quit)

以下是如何修复您的实现。最大的错误是您必须在
args
部分中为线程提供参数,这与普通函数调用不同

import tkinter as tk
import threading
import time

def infinit(x):
    cpt = 0
    while(continu):
        cpt += 1
        print(cpt)
        time.sleep(1)
    print("loop is over !")

def start():
    threadSimulation = threading.Thread(target= infinit, args=(continu,))
    threadSimulation.daemon = True
    threadSimulation.start()

def stop():
    global continu
    continu = False

def how_many_threads():
    for t in threading.enumerate():
        print("thread names : ",t.getName())

continu = True

window = tk.Tk()
window.title("test")

start = tk.Button(window, text="start", bg ="green", command=start)
stop  = tk.Button(window, text="stop", bg ="green", command=stop)
thread = tk.Button(window, text="threads", bg ="green", command=how_many_threads)

start.grid(column = 1, row = 1)
stop.grid(column = 2, row = 1)
thread.grid(column = 3 , row = 1)

window.mainloop()

您的实现是错误的,但是概念是正确的。为了阻止IO绑定的应用程序,线程是运行它们并保持tkinter窗口处于活动状态的好方法。如果这对你来说是一个好的解决方案,这取决于你实际想做什么;您的实际问题是阻塞IO绑定的应用程序吗?您直接在
infinite()
中使用了
continu
,因此不需要参数
x
。或者
continu
应该是
x
而不是
infinite()
?如果传入变量,它将不起作用,除非它是可变的。这就是为什么我用了全局搜索。但是我留下了这个参数,尽管它不需要仅仅显示参数是如何传递到线程的,因为这是导致OP最初问题的原因。