upload_file.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import os
  2. import sys
  3. import tkinter as tk
  4. from tkinter import ttk, messagebox
  5. import requests
  6. class ServerCli:
  7. serve_url = 'http://127.0.0.1:5855'
  8. def get_folder_tree(self):
  9. return requests.post(self.serve_url + '/get_folder_tree').json()
  10. def create_cloud_file(self, local_file, folder_id):
  11. return requests.post(self.serve_url + '/create_cloud_file',
  12. json={'local_file': local_file, 'folder_id': folder_id}).json()
  13. def resource_path(relative_path):
  14. """打包后资源路径处理"""
  15. if hasattr(sys, '_MEIPASS'):
  16. return os.path.join(sys._MEIPASS, relative_path)
  17. return relative_path
  18. class FolderSelector(tk.Tk):
  19. def __init__(self, file_path):
  20. super().__init__()
  21. self.title("选择文件夹")
  22. self.geometry("500x400")
  23. self.minsize(400, 300)
  24. self.local_file = file_path
  25. self.server = ServerCli()
  26. self.base_data = {}
  27. self.iconbitmap(resource_path("icon.ico"))
  28. # 加载中提示
  29. self.loading_label = ttk.Label(self, text="正在加载目录,请稍候...")
  30. self.loading_label.pack(pady=20)
  31. # 树控件先占位但不显示
  32. self.tree = ttk.Treeview(self)
  33. self.tree.pack(fill='both', expand=True, padx=10, pady=10)
  34. self.tree.pack_forget() # 等加载完再显示
  35. self.tree.bind("<<TreeviewOpen>>", self.on_open_node)
  36. # 确定按钮
  37. self.confirm_btn = ttk.Button(self, text="确定", command=self.on_confirm)
  38. self.confirm_btn.pack(side="bottom", anchor="e", padx=10, pady=10)
  39. self.confirm_btn["state"] = "disabled" # 先禁用
  40. # 延迟加载数据
  41. self.after(100, self.load_initial_data)
  42. def load_initial_data(self):
  43. try:
  44. self.tree_data = self.server.get_folder_tree()
  45. self.init_tree_data('root', self.tree_data)
  46. self.insert_node('', 'root', '我的文库', is_leaf=False)
  47. # 隐藏 loading,显示树
  48. self.loading_label.pack_forget()
  49. self.tree.pack(fill='both', expand=True, padx=10, pady=10)
  50. self.confirm_btn["state"] = "normal"
  51. except Exception as e:
  52. messagebox.showwarning("错误", f"办公助手未启动")
  53. self.destroy() # 关闭主窗口
  54. sys.exit(1) # 可选:退出程序(非必须)
  55. def insert_node(self, parent, node_id, text, is_leaf, prefix=''):
  56. self.tree.insert(parent, 'end', iid=node_id, text=prefix + text, values=(node_id,))
  57. if not is_leaf:
  58. self.tree.insert(node_id, 'end') # 占位符,表明它可以展开
  59. def init_tree_data(self, parent, data):
  60. node_list = []
  61. for row in data:
  62. if len(row['children']) == 0:
  63. row['children'] = False
  64. else:
  65. self.init_tree_data(row['id'], row['children'])
  66. row['children'] = True
  67. node_list.append(row)
  68. self.base_data[parent] = node_list
  69. def on_open_node(self, event):
  70. node_id = self.tree.focus()
  71. children = self.tree.get_children(node_id)
  72. if len(children) == 1 and self.tree.item(children[0], 'text') == '':
  73. self.tree.delete(children[0])
  74. self.load_children(node_id)
  75. def load_children(self, parent_id=None):
  76. """通过接口获取 parent_id 下的子文件夹"""
  77. children_data = self.fetch_children_from_api(parent_id)
  78. for item in children_data:
  79. self.insert_node(
  80. parent_id,
  81. item['id'],
  82. item['name'],
  83. is_leaf=not item['children'],
  84. prefix='📁'
  85. )
  86. def on_confirm(self):
  87. selected = self.tree.focus()
  88. if selected == 'root':
  89. return
  90. try:
  91. res = self.server.create_cloud_file(self.local_file, selected)
  92. if res.get("success", True): # 这里假设返回中有 success 字段
  93. messagebox.showinfo('上传到我的文库', res.get('msg', '未知错误'))
  94. else:
  95. messagebox.showerror('上传到我的文库', res.get('msg', '未知错误'))
  96. except Exception as e:
  97. messagebox.showerror('上传到我的文库', f"请求出错:{e}")
  98. finally:
  99. self.destroy()
  100. def fetch_children_from_api(self, folder_id):
  101. # 你应当用 requests 等请求实际接口
  102. # 这里只是模拟返回
  103. return self.base_data.get(folder_id, [])
  104. if __name__ == "__main__":
  105. file_path = sys.argv[1]
  106. app = FolderSelector(file_path)
  107. app.mainloop()