采集卡bug修复
This commit is contained in:
46
preview.py
46
preview.py
@@ -68,9 +68,10 @@ class PreviewWindow:
|
||||
# 存储图像对象
|
||||
self.photo_objects = {}
|
||||
|
||||
def update_frames():
|
||||
"""更新帧"""
|
||||
while self.running:
|
||||
def update_frames_once():
|
||||
"""在主线程中更新一帧(使用after循环)"""
|
||||
if not self.running:
|
||||
return
|
||||
try:
|
||||
canvas.delete("all")
|
||||
|
||||
@@ -102,6 +103,7 @@ class PreviewWindow:
|
||||
# 转换为PIL图像
|
||||
pil_image = Image.fromarray(resized_frame)
|
||||
photo = ImageTk.PhotoImage(image=pil_image)
|
||||
# 保持引用,避免被GC
|
||||
self.photo_objects[idx] = photo
|
||||
|
||||
# 绘制图像
|
||||
@@ -114,14 +116,10 @@ class PreviewWindow:
|
||||
canvas.create_text(center_x, y + 20, text=name, fill='white', font=('Arial', 12, 'bold'))
|
||||
|
||||
frame_idx += 1
|
||||
|
||||
canvas.update()
|
||||
tk._default_root.update_idletasks()
|
||||
except Exception as e:
|
||||
print(f"更新帧错误: {e}")
|
||||
|
||||
import time
|
||||
time.sleep(0.03) # 约30fps
|
||||
# 约30fps
|
||||
root.after(33, update_frames_once)
|
||||
|
||||
def on_canvas_click(event):
|
||||
"""点击画布事件"""
|
||||
@@ -141,9 +139,8 @@ class PreviewWindow:
|
||||
|
||||
canvas.bind('<Button-1>', on_canvas_click)
|
||||
|
||||
# 启动更新线程
|
||||
update_thread = threading.Thread(target=update_frames, daemon=True)
|
||||
update_thread.start()
|
||||
# 使用after在主线程中循环刷新
|
||||
root.after(33, update_frames_once)
|
||||
|
||||
def on_closing():
|
||||
"""关闭窗口"""
|
||||
@@ -160,7 +157,7 @@ class PreviewWindow:
|
||||
if self.large_window is not None and self.large_window.winfo_exists():
|
||||
self.large_window.destroy()
|
||||
|
||||
self.large_window = tk.Tk()
|
||||
self.large_window = tk.Toplevel()
|
||||
self.large_window.title(f"放大视图 - {self.caps[idx]['name']}")
|
||||
self.large_window.geometry("1280x720")
|
||||
|
||||
@@ -169,11 +166,11 @@ class PreviewWindow:
|
||||
|
||||
photo_obj = {}
|
||||
|
||||
def update_large_frame():
|
||||
"""更新大窗口帧"""
|
||||
while self.running:
|
||||
def update_large_once():
|
||||
if not self.running or not self.large_window.winfo_exists():
|
||||
return
|
||||
try:
|
||||
if idx in self.frames and self.large_window.winfo_exists():
|
||||
if idx in self.frames:
|
||||
canvas.delete("all")
|
||||
|
||||
frame = self.frames[idx]
|
||||
@@ -192,23 +189,12 @@ class PreviewWindow:
|
||||
photo = ImageTk.PhotoImage(image=pil_image)
|
||||
photo_obj['img'] = photo
|
||||
|
||||
canvas.delete("all")
|
||||
canvas.create_image(window_width // 2, window_height // 2, image=photo, anchor='center')
|
||||
|
||||
self.large_window.update()
|
||||
else:
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"更新大窗口错误: {e}")
|
||||
break
|
||||
self.large_window.after(33, update_large_once)
|
||||
|
||||
import time
|
||||
time.sleep(0.03)
|
||||
|
||||
update_thread = threading.Thread(target=update_large_frame, daemon=True)
|
||||
update_thread.start()
|
||||
|
||||
self.large_window.mainloop()
|
||||
self.large_window.after(33, update_large_once)
|
||||
|
||||
def run(self):
|
||||
"""运行预览"""
|
||||
|
||||
Reference in New Issue
Block a user