Python 在不中断循环的情况下休眠,以便在tkinter中写入新条目

Python 在不中断循环的情况下休眠,以便在tkinter中写入新条目,python,tkinter,while-loop,Python,Tkinter,While Loop,此UI中有2个按钮和1个输入框。名为“开始循环”和“打印”的按钮 当我在输入框中写入文本时,按下相关按钮时,我应该能够看到它的打印输出。我想做的是,把按钮按成一个循环。但有趣的是每10秒钟打印一个新条目 当您输入一个条目并按下“开始循环”按钮时,它将变为运行。同时,用户界面窗口将冻结。无法写入新条目或按“打印”按钮。即使我使用时间。睡眠功能它仍然冻结。它打印旧条目,但我想在每次迭代时编写一个新条目。查看代码: import time from tkinter import * class tk

此UI中有2个按钮和1个输入框。名为“开始循环”和“打印”的按钮

当我在输入框中写入文本时,按下相关按钮时,我应该能够看到它的打印输出。我想做的是,把按钮按成一个循环。但有趣的是每10秒钟打印一个新条目

当您输入一个条目并按下“开始循环”按钮时,它将变为运行。同时,用户界面窗口将冻结。无法写入新条目或按“打印”按钮。即使我使用时间。睡眠功能它仍然冻结。它打印旧条目,但我想在每次迭代时编写一个新条目。查看代码:

import time
from tkinter import *

class tkin(Frame):
    def __init__(self,parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.UI()

    def UI(self):
        self.down = StringVar()
        self.down_entry = Entry(self, textvariable=self.down)
        self.down_entry.grid(row=2, column=0)


        self.start_loop_buuton = Button(text="Start Loop", command=self.loop_func)
        self.start_loop_buuton.place(x=10,y=40)
        self.print_func_button = Button(text="Print ", command=self.pprint)
        self.print_func_button.place(x=120,y=40)
        self.pack()

    def loop_func(self):
        start = time.time()
        while True:
            print("standart print out")
            end = time.time()
            if (end- start) >10:
                time.sleep(10)
                self.print_func_button.invoke()           ## press print_func_button
                start = time.time()
                

    def pprint(self):
        print("WHICH PRINT LINE I WANT TO PRINT IN LIKE EVERY 10 SECONDS")
        print(self.down.get())

def main():
    root = Tk()
    tkin(root)
    root.geometry("195x100+300+300")
    root.mainloop()

main()

任何建议都很好。提前感谢。

这就是我将如何重新定义您的方法:

def循环函数(self):
self.print_func_按钮。invoke()#按print_func_按钮
self.after(3000,self.loop_func)

时间是以毫秒为单位的,因此这将是3秒。在本例中,我刚刚使用按钮函数的命令参数中的线程分离了循环“loop_func()”。就像这样:

import threading

...
...
...

self.start_loop_buuton = Button(text="Start Loop", command=threading.Thread(target=self.loop_func).start())

因此,这两个循环是分开的。

你必须将它放在一个单独的线程中,否则你会干扰tkinter的主循环,或者你可以使用
after()
method也
time。sleep()
冻结整个脚本,正如@Matiiss所说的。这将在按下按钮之前执行该功能。