-2

我想用我启动它的同一个按钮来打破一个循环。下面的代码不起作用,因为它在“sleep(2)”之后结束循环。

我知道“camera.capture_continuous”是 PiCamera 特有的,但也许有人仍然可以帮助我找到解决方案。;)

import tkinter as tk
from picamera import PiCamera
root = tk.Tk()
camera = PiCamera()




def start_tl():
    if rec_btn.config('text')[-1] == 'START':
        rec_btn.config(text='STOP')
        for filename in camera.capture_continuous('/tl_img{counter:03d}.jpg', use_video_port=True):
            sleep(2)
            if rec_btn.config('text')[-1] == 'START':
                break

    
             
rec_btn = tk.Button(root,text="START", command=start_tl)
rec_btn.pack()



root.mainloop()
4

1 回答 1

-1

我没有使用 picamera,所以该行被注释掉了,但是尝试以下,你将不得不使用线程,否则你的主 UI 线程将被锁定。我添加了另一个按钮和一个标签,只是为了帮助显示该进程正在单独的线程上运行。

import tkinter as tk
from time import sleep
import threading

root = tk.Tk()

def start_tl():
    if rec_btn['text'] == 'STOP':
        t.join(1)
        rec_btn.config(text='START')
        return

    if rec_btn['text'] == 'START':
        t.start()
        rec_btn.config(text='STOP')
        return
def exit_tl():
    root.destroy()

def process_file():
    i = 1
    while rec_btn['text'] == 'STOP':
        i = i+1
        rec_btn.update()
        sleep(5)
        rec_lbl["text"] = "{}".format(i)
        # for filename in camera.capture_continuous('/tl_img{counter:03d}.jpg', use_video_port=True):
            #do something with the file??


rec_btn = tk.Button(root, text="START", command=lambda: start_tl())
rec_btn_exit = tk.Button(root, text="Exit", command=lambda: exit_tl())
rec_lbl = tk.Label(root,text="")
rec_btn.pack()
rec_btn_exit.pack()
rec_lbl.pack()

t = threading.Thread(target=process_file)

root.mainloop()

如果您需要您的线程能够启动、停止、启动、停止,请查看此问题和答案

于 2020-07-06T21:47:57.657 回答