|
|
@@ -33,14 +33,26 @@ class StreamlitOCRValidator:
|
|
|
self.text_bbox_mapping = {}
|
|
|
self.selected_text = None
|
|
|
self.marked_errors = set()
|
|
|
- self.show_all_boxes = False
|
|
|
- self.fit_to_container = True
|
|
|
- self.zoom_level = 1.0
|
|
|
- self.current_angle = 0
|
|
|
+ self.file_info = []
|
|
|
+ self.selected_file_index = 0
|
|
|
+ self.display_options = []
|
|
|
+ self.file_paths = []
|
|
|
|
|
|
# 初始化布局管理器
|
|
|
self.layout_manager = OCRLayoutManager(self)
|
|
|
+
|
|
|
+ # 加载文件信息
|
|
|
+ self.load_file_info()
|
|
|
|
|
|
+ def load_file_info(self):
|
|
|
+ # 查找可用的OCR文件
|
|
|
+ self.file_info = find_available_ocr_files(self.config['paths']['ocr_out_dir'])
|
|
|
+ # 初始化session_state中的选择索引
|
|
|
+ if self.file_info:
|
|
|
+ # 创建显示选项列表
|
|
|
+ self.display_options = [f"{info['display_name']}" for info in self.file_info]
|
|
|
+ self.file_paths = [info['path'] for info in self.file_info]
|
|
|
+
|
|
|
def setup_page_config(self):
|
|
|
"""设置页面配置"""
|
|
|
ui_config = self.config['ui']
|
|
|
@@ -347,8 +359,17 @@ def main():
|
|
|
"""主应用"""
|
|
|
# 初始化应用
|
|
|
if 'validator' not in st.session_state:
|
|
|
- st.session_state.validator = StreamlitOCRValidator()
|
|
|
+ validator = StreamlitOCRValidator()
|
|
|
+ st.session_state.validator = validator
|
|
|
st.session_state.validator.setup_page_config()
|
|
|
+ # 页面标题
|
|
|
+ config = st.session_state.validator.config
|
|
|
+ st.title(config['ui']['page_title'])
|
|
|
+ # st.markdown("---")
|
|
|
+ else:
|
|
|
+ # 主内容区域
|
|
|
+ validator = st.session_state.validator
|
|
|
+ config = st.session_state.validator.config
|
|
|
|
|
|
if 'selected_text' not in st.session_state:
|
|
|
st.session_state.selected_text = None
|
|
|
@@ -356,60 +377,47 @@ def main():
|
|
|
if 'marked_errors' not in st.session_state:
|
|
|
st.session_state.marked_errors = set()
|
|
|
|
|
|
- # 同步标记的错误到validator
|
|
|
- st.session_state.validator.marked_errors = st.session_state.marked_errors
|
|
|
-
|
|
|
- # 页面标题
|
|
|
- config = st.session_state.validator.config
|
|
|
- st.title(config['ui']['page_title'])
|
|
|
- # st.markdown("---")
|
|
|
-
|
|
|
with st.container(height=100, horizontal=True, horizontal_alignment='left'):
|
|
|
# st.subheader("📁 文件选择")
|
|
|
- # 查找可用的OCR文件
|
|
|
- file_info = find_available_ocr_files(config['paths']['ocr_out_dir'])
|
|
|
# 初始化session_state中的选择索引
|
|
|
if 'selected_file_index' not in st.session_state:
|
|
|
st.session_state.selected_file_index = 0
|
|
|
- if file_info:
|
|
|
+ if validator.display_options:
|
|
|
# 创建显示选项列表
|
|
|
- display_options = [f"{info['display_name']}" for info in file_info]
|
|
|
- file_paths = [info['path'] for info in file_info]
|
|
|
-
|
|
|
selected_index = st.selectbox("选择OCR结果文件",
|
|
|
- range(len(display_options)),
|
|
|
- format_func=lambda i: display_options[i],
|
|
|
+ range(len(validator.display_options)),
|
|
|
+ format_func=lambda i: validator.display_options[i],
|
|
|
index=st.session_state.selected_file_index,
|
|
|
key="selected_selectbox",
|
|
|
label_visibility="collapsed")
|
|
|
# 更新session_state
|
|
|
if selected_index != st.session_state.selected_file_index:
|
|
|
st.session_state.selected_file_index = selected_index
|
|
|
-
|
|
|
- selected_file = file_paths[selected_index]
|
|
|
+
|
|
|
+ selected_file = validator.file_paths[selected_index]
|
|
|
|
|
|
# number_input, 范围是文件数量,默认值是1,步长是1
|
|
|
# 页码输入器
|
|
|
- current_page = file_info[selected_index]['page']
|
|
|
+ current_page = validator.file_info[selected_index]['page']
|
|
|
page_input = st.number_input("输入一个数字",
|
|
|
placeholder="输入页码",
|
|
|
label_visibility="collapsed",
|
|
|
- min_value=1, max_value=len(display_options), value=current_page, step=1,
|
|
|
+ min_value=1, max_value=len(validator.display_options), value=current_page, step=1,
|
|
|
key="page_input"
|
|
|
)
|
|
|
# 当页码输入改变时,更新文件选择
|
|
|
if page_input != current_page:
|
|
|
# 查找对应页码的文件索引
|
|
|
- for i, info in enumerate(file_info):
|
|
|
+ for i, info in enumerate(validator.file_info):
|
|
|
if info['page'] == page_input:
|
|
|
st.session_state.selected_file_index = i
|
|
|
- selected_file = file_paths[i]
|
|
|
+ selected_file = validator.file_paths[i]
|
|
|
st.rerun()
|
|
|
break
|
|
|
|
|
|
if st.button("🔄 加载文件", type="secondary") and selected_file:
|
|
|
st.session_state.validator.load_ocr_data(selected_file)
|
|
|
- st.success(f"✅ 已加载第{file_info[selected_index]['page']}页")
|
|
|
+ st.success(f"✅ 已加载第{validator.file_info[selected_index]['page']}页")
|
|
|
st.rerun()
|
|
|
else:
|
|
|
st.warning("未找到OCR结果文件")
|
|
|
@@ -423,13 +431,6 @@ def main():
|
|
|
st.session_state.marked_errors = set()
|
|
|
st.rerun()
|
|
|
|
|
|
- # 主内容区域
|
|
|
- validator = st.session_state.validator
|
|
|
-
|
|
|
- if not validator.ocr_data:
|
|
|
- st.info("👈 请在左侧选择并加载OCR结果文件")
|
|
|
- return
|
|
|
-
|
|
|
# 显示统计信息
|
|
|
stats = validator.get_statistics()
|
|
|
|