微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将我的 python 代码实现为 tkinter gui 代码,因为由于多个 while 循环运行,没有任何工作可以停止程序

如何解决如何将我的 python 代码实现为 tkinter gui 代码,因为由于多个 while 循环运行,没有任何工作可以停止程序

我想将此代码添加到我的 tkinter gui 代码中,我尝试使用按钮中的命令来制作它,但问题是,程序不会停止运行,它只是死机,我已经尝试过 window.destroy(),exit() 之类的东西,但它只是关闭窗口但退出不会让我退出程序,直到我自己按下停止按钮

程序代码

import cv2
import numpy as np
from PIL import ImageGrab
screen_size = (1366,768)
def recorder():
    fourcc = cv2.VideoWriter_fourcc(*"XVID")
    fps = 20.0
    output = cv2.VideoWriter("output.avi",fourcc,fps,(screen_size))
    while True:
        img = ImageGrab.grab()
        img_np = np.array(img)
        frame = cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB)
        output.write(frame)
    output.release()
    cv2.destroyAllWindows()

有人可以帮我添加这两个代码并且不冻结窗口....我也尝试过线程,但它没有阻止程序。

tkinter gui 代码

from tkinter import *

window = Tk()
window.geometry("500x200+460+170")
window.resizable(0,0)
window.configure(bg='#030818')

Label(window,text="Recording",fg="white",bg="#030818",font=("Helvetica",23,"bold")).pack()
Button(window,text="Start Recording",bd=0,bg="gray",15,"bold")).place(x=170,y=60)
Button(window,text="Stop Recording",y=110)


window.mainloop()

解决方法

首先,您的代码从未执行过 recorder(),因为您没有为这两个按钮分配任何功能。

其次,您需要在线程中运行 recorder(),以便它不会阻塞 tkinter mainloop()

为了停止录音,你需要想办法从while循环中跳出来。通常 threading.Event 对象用于多线程应用程序中。

以下是实现目标所需的更改:

import threading
...

recording = threading.Event()  # flag used for breaking out the while loop

def recorder():
    print("recording started")
    fourcc = cv2.VideoWriter_fourcc(*"XVID")
    fps = 20.0
    output = cv2.VideoWriter("output.avi",fourcc,fps,screen_size)
    recording.set()  # set the recording flag
    while recording.is_set(): # keep running until recording flag is clear
        img = ImageGrab.grab().resize(screen_size)
        img_np = np.array(img)
        frame = cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB)
        output.write(frame)
    output.release()
    cv2.destroyAllWindows()
    print("recording stopped")

def start_recording():
    # make sure only one recording thread is running
    if not recording.is_set():
        # start the recording task in a thread
        threading.Thread(target=recorder).start()

def stop_recording():
    # stop recording by clearing the flag
    recording.clear()

...
Button(window,text="Start Recording",command=start_recording,bd=0,bg="gray",fg="white",font=("Helvetica",15,"bold")).place(x=170,y=60)
Button(window,text="Stop Recording",command=stop_recording,y=110)
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。