采集卡bug修复
This commit is contained in:
128
gui_config.py
128
gui_config.py
@@ -200,26 +200,37 @@ class ConfigGUI:
|
||||
def scan_cameras(self, max_index: int = 10):
|
||||
"""扫描系统可用的采集卡索引,并填充下拉框"""
|
||||
import warnings
|
||||
import sys
|
||||
import io
|
||||
found = []
|
||||
|
||||
# 临时设置OpenCV日志级别(兼容不同版本)
|
||||
import os
|
||||
old_level = os.environ.get('OPENCV_LOG_LEVEL', '')
|
||||
os.environ['OPENCV_LOG_LEVEL'] = 'ERROR'
|
||||
os.environ['OPENCV_LOG_LEVEL'] = 'SILENT' # 尝试更严格的级别
|
||||
os.environ['OPENCV_IO_ENABLE_OPENEXR'] = '0'
|
||||
|
||||
# 尝试设置日志级别(不同版本的OpenCV API不同)
|
||||
try:
|
||||
if hasattr(cv2, 'setLogLevel'):
|
||||
# OpenCV 4.x
|
||||
if hasattr(cv2, 'LOG_LEVEL_ERROR'):
|
||||
if hasattr(cv2, 'LOG_LEVEL_SILENT'):
|
||||
cv2.setLogLevel(cv2.LOG_LEVEL_SILENT)
|
||||
elif hasattr(cv2, 'LOG_LEVEL_ERROR'):
|
||||
cv2.setLogLevel(cv2.LOG_LEVEL_ERROR)
|
||||
elif hasattr(cv2, 'utils'):
|
||||
# 某些版本的OpenCV
|
||||
cv2.utils.setLogLevel(0) # 0=ERROR级别
|
||||
cv2.utils.setLogLevel(0) # 0=SILENT/ERROR级别
|
||||
except Exception:
|
||||
pass # 如果设置失败,继续执行
|
||||
pass
|
||||
|
||||
# 重定向stderr来捕获OpenCV的错误输出
|
||||
old_stderr = sys.stderr
|
||||
suppressed_output = io.StringIO()
|
||||
|
||||
try:
|
||||
# 暂时重定向stderr以抑制OpenCV的错误消息
|
||||
sys.stderr = suppressed_output
|
||||
|
||||
for idx in range(max_index + 1):
|
||||
cap = None
|
||||
try:
|
||||
@@ -245,11 +256,14 @@ class ConfigGUI:
|
||||
pass
|
||||
continue
|
||||
finally:
|
||||
# 恢复stderr
|
||||
sys.stderr = old_stderr
|
||||
# 恢复原来的日志级别
|
||||
if old_level:
|
||||
os.environ['OPENCV_LOG_LEVEL'] = old_level
|
||||
else:
|
||||
os.environ.pop('OPENCV_LOG_LEVEL', None)
|
||||
os.environ.pop('OPENCV_IO_ENABLE_OPENEXR', None)
|
||||
|
||||
if not found:
|
||||
found = ["0"] # 至少给一个默认项,避免为空
|
||||
@@ -320,29 +334,46 @@ class ConfigGUI:
|
||||
def save_config(self):
|
||||
"""保存当前编辑的配置"""
|
||||
# 检查索引有效性
|
||||
if self.selected_index >= len(config_manager.config['groups']):
|
||||
messagebox.showerror("错误", f"配置组索引 {self.selected_index} 无效")
|
||||
if self.selected_index < 0 or self.selected_index >= len(config_manager.config['groups']):
|
||||
messagebox.showerror("错误", f"请先选择一个有效的配置组")
|
||||
return False
|
||||
|
||||
# 保存当前组的配置
|
||||
group = config_manager.get_group_by_index(self.selected_index)
|
||||
if group:
|
||||
for key, var in self.config_vars.items():
|
||||
if not key.startswith('display_'):
|
||||
try:
|
||||
value_str = var.get().strip()
|
||||
# 特殊处理:某些字段需要转换为整数
|
||||
if key in ['camera_index', 'camera_width', 'camera_height', 'serial_baudrate', 'move_velocity']:
|
||||
try:
|
||||
value = int(value_str) if value_str else group.get(key, 0)
|
||||
except:
|
||||
if not group:
|
||||
messagebox.showerror("错误", f"配置组不存在")
|
||||
return False
|
||||
|
||||
for key, var in self.config_vars.items():
|
||||
if not key.startswith('display_'):
|
||||
try:
|
||||
value_str = var.get().strip() if var.get() else ""
|
||||
|
||||
# 特殊处理:某些字段需要转换为整数
|
||||
if key in ['camera_index', 'camera_width', 'camera_height', 'serial_baudrate', 'move_velocity']:
|
||||
try:
|
||||
# 如果为空,使用当前值或默认值
|
||||
if value_str:
|
||||
value = int(value_str)
|
||||
else:
|
||||
# 如果下拉框为空,尝试从当前配置获取
|
||||
value = group.get(key, 0)
|
||||
else:
|
||||
value = value_str if value_str else group.get(key, '')
|
||||
group[key] = value
|
||||
except Exception as e:
|
||||
print(f"保存字段 {key} 时出错: {e}")
|
||||
pass
|
||||
except ValueError:
|
||||
# 转换失败,使用当前值
|
||||
value = group.get(key, 0)
|
||||
print(f"⚠️ 字段 {key} 的值 '{value_str}' 无效,使用当前值 {value}")
|
||||
else:
|
||||
# 字符串字段
|
||||
value = value_str if value_str else group.get(key, '')
|
||||
|
||||
group[key] = value
|
||||
except Exception as e:
|
||||
print(f"保存字段 {key} 时出错: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
# 保存失败时使用当前值
|
||||
if key in group:
|
||||
pass # 保持原值不变
|
||||
|
||||
# 保存预览配置
|
||||
display = config_manager.config.get('display', {})
|
||||
@@ -384,28 +415,43 @@ class ConfigGUI:
|
||||
def save_config_silent(self):
|
||||
"""静默保存配置(不显示消息框)"""
|
||||
# 保存当前组的配置
|
||||
if self.selected_index >= len(config_manager.config['groups']):
|
||||
print(f"⚠️ 选中索引 {self.selected_index} 超出范围")
|
||||
if self.selected_index < 0 or self.selected_index >= len(config_manager.config['groups']):
|
||||
print(f"⚠️ 选中索引 {self.selected_index} 无效")
|
||||
return False
|
||||
|
||||
group = config_manager.get_group_by_index(self.selected_index)
|
||||
if group:
|
||||
for key, var in self.config_vars.items():
|
||||
if not key.startswith('display_'):
|
||||
try:
|
||||
value_str = var.get().strip()
|
||||
# 特殊处理:某些字段需要转换为整数
|
||||
if key in ['camera_index', 'camera_width', 'camera_height', 'serial_baudrate', 'move_velocity']:
|
||||
try:
|
||||
value = int(value_str) if value_str else group.get(key, 0)
|
||||
except:
|
||||
if not group:
|
||||
print(f"⚠️ 配置组不存在")
|
||||
return False
|
||||
|
||||
for key, var in self.config_vars.items():
|
||||
if not key.startswith('display_'):
|
||||
try:
|
||||
value_str = var.get().strip() if var.get() else ""
|
||||
|
||||
# 特殊处理:某些字段需要转换为整数
|
||||
if key in ['camera_index', 'camera_width', 'camera_height', 'serial_baudrate', 'move_velocity']:
|
||||
try:
|
||||
# 如果为空,使用当前值或默认值
|
||||
if value_str:
|
||||
value = int(value_str)
|
||||
else:
|
||||
# 如果下拉框为空,尝试从当前配置获取
|
||||
value = group.get(key, 0)
|
||||
else:
|
||||
value = value_str if value_str else group.get(key, '')
|
||||
group[key] = value
|
||||
except Exception as e:
|
||||
print(f"保存字段 {key} 时出错: {e}")
|
||||
pass
|
||||
except ValueError:
|
||||
# 转换失败,使用当前值
|
||||
value = group.get(key, 0)
|
||||
print(f"⚠️ 字段 {key} 的值 '{value_str}' 无效,使用当前值 {value}")
|
||||
else:
|
||||
# 字符串字段
|
||||
value = value_str if value_str else group.get(key, '')
|
||||
|
||||
group[key] = value
|
||||
except Exception as e:
|
||||
print(f"保存字段 {key} 时出错: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
# 保存失败时保持原值不变
|
||||
|
||||
# 保存预览配置
|
||||
display = config_manager.config.get('display', {})
|
||||
|
||||
Reference in New Issue
Block a user