增加了删除图片的功能。
This commit is contained in:
@@ -151,12 +151,16 @@ class PreviewPanel(ctk.CTkFrame):
|
||||
parent,
|
||||
sqlite_manager,
|
||||
on_download_callback: Callable,
|
||||
mysql_manager=None,
|
||||
on_delete_callback: Callable = None,
|
||||
**kwargs
|
||||
):
|
||||
super().__init__(parent, **kwargs)
|
||||
|
||||
self.sqlite_manager = sqlite_manager
|
||||
self.mysql_manager = mysql_manager
|
||||
self.on_download_callback = on_download_callback
|
||||
self.on_delete_callback = on_delete_callback
|
||||
|
||||
# 数据
|
||||
self.current_data = []
|
||||
@@ -235,6 +239,17 @@ class PreviewPanel(ctk.CTkFrame):
|
||||
)
|
||||
self.download_btn.pack(side="left", padx=5)
|
||||
|
||||
self.delete_btn = ctk.CTkButton(
|
||||
left_buttons,
|
||||
text="🗑️ 删除选中",
|
||||
command=self._on_delete,
|
||||
width=100,
|
||||
height=30,
|
||||
fg_color="red",
|
||||
hover_color="darkred"
|
||||
)
|
||||
self.delete_btn.pack(side="left", padx=5)
|
||||
|
||||
# 分页控件
|
||||
page_frame = ctk.CTkFrame(bottom_frame)
|
||||
page_frame.pack(side="right", padx=10, pady=10)
|
||||
@@ -383,6 +398,94 @@ class PreviewPanel(ctk.CTkFrame):
|
||||
if self.on_download_callback:
|
||||
self.on_download_callback(selected_data)
|
||||
|
||||
def _on_delete(self):
|
||||
"""删除选中的图片"""
|
||||
if not self.selected_ids:
|
||||
messagebox.showwarning("提示", "请先选择要删除的图片")
|
||||
return
|
||||
|
||||
# 获取选中的图片数据
|
||||
selected_data = [
|
||||
data for data in self.current_data
|
||||
if data['id'] in self.selected_ids
|
||||
]
|
||||
|
||||
# 二次确认(简化版,不显示删除范围选项)
|
||||
count = len(selected_data)
|
||||
confirm = messagebox.askyesno(
|
||||
"确认删除",
|
||||
f"确定要删除选中的 {count} 张图片吗?\n\n"
|
||||
"此操作将:\n"
|
||||
"1. 从MySQL数据库中删除记录\n"
|
||||
"2. 删除已下载的本地文件(如有)\n\n"
|
||||
"删除后无法恢复!",
|
||||
icon='warning'
|
||||
)
|
||||
|
||||
if not confirm:
|
||||
return
|
||||
|
||||
# 在后台线程执行删除
|
||||
def delete_thread():
|
||||
try:
|
||||
from config import DELETE_MODE
|
||||
|
||||
success_count = 0
|
||||
failed_ids = []
|
||||
|
||||
for data in selected_data:
|
||||
try:
|
||||
# 模式B: 仅删除MySQL
|
||||
if DELETE_MODE == 'remote':
|
||||
# 删除MySQL记录
|
||||
if self.mysql_manager:
|
||||
deleted = self.mysql_manager.delete_records(
|
||||
data['datasource'],
|
||||
[data['id']]
|
||||
)
|
||||
if deleted > 0:
|
||||
# 删除SQLite记录和本地文件
|
||||
self.sqlite_manager.delete_download_record(
|
||||
data['datasource'],
|
||||
data['image_url'],
|
||||
delete_file=True
|
||||
)
|
||||
success_count += 1
|
||||
else:
|
||||
failed_ids.append(data['id'])
|
||||
else:
|
||||
failed_ids.append(data['id'])
|
||||
except Exception as e:
|
||||
print(f"删除记录失败 (ID: {data['id']}): {e}")
|
||||
failed_ids.append(data['id'])
|
||||
|
||||
# 更新UI(在主线程)
|
||||
self.after(0, lambda: self._on_delete_complete(success_count, len(failed_ids)))
|
||||
|
||||
except Exception as e:
|
||||
print(f"删除操作失败: {e}")
|
||||
self.after(0, lambda: messagebox.showerror("错误", f"删除失败: {e}"))
|
||||
|
||||
threading.Thread(target=delete_thread, daemon=True).start()
|
||||
|
||||
def _on_delete_complete(self, success_count: int, failed_count: int):
|
||||
"""删除完成回调"""
|
||||
# 显示结果
|
||||
if failed_count == 0:
|
||||
messagebox.showinfo("删除成功", f"成功删除 {success_count} 张图片")
|
||||
else:
|
||||
messagebox.showwarning(
|
||||
"部分删除失败",
|
||||
f"成功删除 {success_count} 张图片\n失败 {failed_count} 张"
|
||||
)
|
||||
|
||||
# 清空选中
|
||||
self.selected_ids.clear()
|
||||
|
||||
# 调用删除回调,刷新数据
|
||||
if self.on_delete_callback:
|
||||
self.on_delete_callback()
|
||||
|
||||
def _on_preview(self, data: Dict):
|
||||
"""查看大图"""
|
||||
# 创建预览窗口
|
||||
|
||||
Reference in New Issue
Block a user