gpt4 book ai didi

python - 如何在编译器休眠时杀死 python 3 中的 time.sleep()

转载 作者:行者123 更新时间:2023-12-01 01:49:18 31 4
gpt4 key购买 nike

我想在按下停止按钮后立即退出循环。但是使用这段代码,我只能在执行当前迭代和下一次迭代后才能出来。

这对我的应用程序非常重要,因为我将使用它来自动化仪器,按下停止按钮后必须立即停止操作。

# -*- coding: utf-8 -*-
"""
Created on Sun Jun 17 17:01:12 2018

@author: Lachu
"""

import time
from tkinter import *
from tkinter import ttk

root=Tk()

def start():

global stop_button_state

for i in range(1,20):
if (stop_button_state==True):
break
else:
print('Iteration started')
print('Iteration number: ', i)

root.update()
time.sleep(10)
print('Iteration completed \n')

def stop_fun():
global stop_button_state
stop_button_state=True


start=ttk.Button(root, text="Start", command=start).grid(row=0,column=0,padx=10,pady=10)

p=ttk.Button(root, text="Stop", command=stop_fun).grid(row=1,column=0)

stop_button_state=False

root.mainloop()

最佳答案

在 GUI 程序中使用 time.sleep 通常不是一个好主意,因为它会使一切进入休眠状态,因此 GUI 无法更新自身,也无法响应事件。此外,当您想要中断 sleep 时,它会变得困惑。

我已经调整了您的代码以使用 threading 中的Timer模块。我们可以轻松地立即中断这个Timer,并且它不会阻塞 GUI。

为了实现此目的,我将计数 for 循环移至生成器中。

如果您在计数过程中按“开始”按钮,它会告诉您已经开始计数。当计数周期结束时,通过按“停止”或到达数字末尾,您可以再次按“开始”开始新的计数。

import tkinter as tk
from tkinter import ttk
from threading import Timer

root = tk.Tk()

delay = 2.0
my_timer = None

# Count up to `hi`, one number at a time
def counter_gen(hi):
for i in range(1, hi):
print('Iteration started')
print('Iteration number: ', i)
yield
print('Iteration completed\n')

# Sleep loop using a threading Timer
# The next `counter` step is performed, then we sleep for `delay`
# When we wake up, we call `sleeper` to repeat the cycle
def sleeper(counter):
global my_timer
try:
next(counter)
except StopIteration:
print('Finished\n')
my_timer = None
return
my_timer = Timer(delay, sleeper, (counter,))
my_timer.start()

def start_fun():
if my_timer is None:
counter = counter_gen(10)
sleeper(counter)
else:
print('Already counting')

def stop_fun():
global my_timer
if my_timer is not None:
my_timer.cancel()
print('Stopped\n')
my_timer = None

ttk.Button(root, text="Start", command=start_fun).grid(row=0, column=0, padx=10, pady=10)
ttk.Button(root, text="Stop", command=stop_fun).grid(row=1,column=0)

root.mainloop()

关于python - 如何在编译器休眠时杀死 python 3 中的 time.sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50896847/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com