增加配置对应

This commit is contained in:
ray
2025-11-06 09:48:32 +08:00
parent aaa795e00d
commit 1d0d6d0b9f
5 changed files with 338 additions and 48 deletions

View File

@@ -214,13 +214,28 @@ class ConfigGUI:
# 确保串口下拉框列表与当前值一致
if group and 'serial_port' in group:
# 如果当前串口不在选项里,追加
values = list(self.serial_port_cb.cget('values')) if self.serial_port_cb.cget('values') else []
port_value = group['serial_port']
if port_value not in values:
values.append(port_value)
self.serial_port_cb['values'] = values
self.serial_port_cb.set(port_value)
# 如果当前值不在列表中,尝试通过设备名匹配
matched = False
if hasattr(self, 'port_display_map'):
for display_text, device in self.port_display_map.items():
if device == port_value:
if display_text not in values:
values.append(display_text)
self.serial_port_cb.set(display_text)
matched = True
break
if not matched:
# 如果找不到匹配,直接添加原始值
if port_value not in values:
values.append(port_value)
if not hasattr(self, 'port_display_map'):
self.port_display_map = {}
self.port_display_map[port_value] = port_value
self.serial_port_cb.set(port_value)
def scan_cameras(self, max_index: int = 10):
"""扫描系统可用的采集卡索引,并填充下拉框"""
@@ -302,23 +317,59 @@ class ConfigGUI:
self.camera_index_cb.set(found[0])
def scan_ports(self):
"""扫描系统可用的串口,并填充下拉框"""
"""扫描系统可用的串口,并填充下拉框(显示设备描述)"""
from utils.device_scanner import scan_serial_ports_with_info
found_real = []
port_display_map = {} # 显示文本 -> 实际设备名
try:
ports = serial.tools.list_ports.comports()
found_real = [port.device for port in ports]
# 按端口名排序
found_real.sort(key=lambda x: int(x.replace('COM', '')) if x.replace('COM', '').isdigit() else 999)
ports_info = scan_serial_ports_with_info()
for port_info in ports_info:
device = port_info['device']
description = port_info.get('description', '')
hwid = port_info.get('hwid', '')
# 显示格式COM3 (设备描述) [HWID]
if description:
display_text = f"{device} ({description})"
else:
display_text = device
# 如果有HWID添加到显示中较短版本
if hwid:
# 提取VID/PID部分如果存在
if 'VID_' in hwid and 'PID_' in hwid:
import re
vid_match = re.search(r'VID_([0-9A-F]+)', hwid)
pid_match = re.search(r'PID_([0-9A-F]+)', hwid)
if vid_match and pid_match:
display_text += f" [{vid_match.group(1)}:{pid_match.group(1)}]"
found_real.append(display_text)
port_display_map[display_text] = device
except Exception as e:
print(f"扫描串口错误: {e}")
# 回退到简单扫描
try:
ports = serial.tools.list_ports.comports()
found_real = [port.device for port in ports]
found_real.sort(key=lambda x: int(x.replace('COM', '')) if x.replace('COM', '').isdigit() else 999)
port_display_map = {p: p for p in found_real}
except:
pass
# 如果没有发现实际端口,使用默认端口列表
if not found_real:
found = ["COM1", "COM2", "COM3", "COM4", "COM5", "COM6"] # 默认给一些常见端口
found = ["COM1", "COM2", "COM3", "COM4", "COM5", "COM6"]
port_display_map = {p: p for p in found}
messagebox.showwarning("警告", "未发现可用串口设备,已添加常用默认选项")
else:
found = found_real
messagebox.showinfo("扫描完成", f"发现可用串口: {', '.join(found)}")
messagebox.showinfo("扫描完成", f"发现 {len(found)} 个串口设备\n\n设备信息已包含描述和硬件ID")
# 保存映射关系,用于后续获取实际设备名
self.port_display_map = port_display_map
self.serial_port_cb['values'] = found
# 若当前无选择,则选择第一项
@@ -390,6 +441,11 @@ class ConfigGUI:
else:
# 字符串字段
value = value_str if value_str else group.get(key, '')
# 特殊处理串口:从显示文本中提取实际设备名
if key == 'serial_port' and hasattr(self, 'port_display_map'):
# 如果值是显示文本,转换为实际设备名
if value in self.port_display_map:
value = self.port_display_map[value]
group[key] = value
except Exception as e:
@@ -467,6 +523,11 @@ class ConfigGUI:
else:
# 字符串字段
value = value_str if value_str else group.get(key, '')
# 特殊处理串口:从显示文本中提取实际设备名
if key == 'serial_port' and hasattr(self, 'port_display_map'):
# 如果值是显示文本,转换为实际设备名
if value in self.port_display_map:
value = self.port_display_map[value]
group[key] = value
except Exception as e:
@@ -500,7 +561,7 @@ class ConfigGUI:
return result
def start_program(self):
"""启动单个配置组的主程序"""
"""启动单个配置组的主程序并自动弹出采集卡预览窗口"""
# 保存配置(静默)
if not self.save_config_silent():
messagebox.showerror("错误", "配置保存失败")
@@ -527,11 +588,13 @@ class ConfigGUI:
], creationflags=subprocess.CREATE_NEW_CONSOLE if sys.platform == 'win32' else 0)
messagebox.showinfo("成功", f"已启动配置组: {active_group['name']}\n\n请在控制台查看运行状态")
# 成功后弹出预览
self.start_preview()
except Exception as e:
messagebox.showerror("错误", f"启动失败: {e}")
def start_multi_program(self):
"""启动多个配置组的主程序"""
"""启动多个配置组的主程序并自动弹出采集卡预览窗口"""
# 保存配置(静默)
if not self.save_config_silent():
messagebox.showerror("错误", "配置保存失败")
@@ -547,6 +610,8 @@ class ConfigGUI:
], creationflags=subprocess.CREATE_NEW_CONSOLE if sys.platform == 'win32' else 0)
messagebox.showinfo("提示", "多配置组启动器已打开\n\n请在控制台中选择要启动的配置组")
# 成功后弹出预览
self.start_preview()
except Exception as e:
messagebox.showerror("错误", f"启动失败: {e}")
@@ -556,5 +621,4 @@ class ConfigGUI:
if __name__ == "__main__":
app = ConfigGUI()
app.run()
app.run()