如何解决如何将我的 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 举报,一经查实,本站将立刻删除。