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