From 7192e5197b6f3510f3a6846969a774cf46f84fcd Mon Sep 17 00:00:00 2001 From: 3minbe <80878623+3minbe@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:45:47 +0900 Subject: [PATCH] =?UTF-8?q?[Code]=20=EA=B8=B0=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBC_Converter.py | 94 ++++++++++++++++++++++++++++++++++++++++++------ settings.json | 1 + 2 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 settings.json diff --git a/DBC_Converter.py b/DBC_Converter.py index 96ab858..7cef51e 100644 --- a/DBC_Converter.py +++ b/DBC_Converter.py @@ -3,21 +3,37 @@ import tkinter as tk from tkinter import filedialog, ttk from tkinter import messagebox from datetime import datetime +import json class MainView(tk.Tk): def __init__(self): super().__init__() - self.setupUI() - self.setButtons() + self.version = "1.0.0" # 프로그램 버전 설정 + self.loadSettings() # 설정 로드 + self.setupUI() # UI 설정 + self.setButtons() # 버튼 설정 self.sortTreeView('파일명', True) # 기본 파일명 오름차순 정렬 + self.bindShortcuts() # 단축키 바인딩 + + def loadSettings(self): + self.settings_file = "settings.json" + if os.path.exists(self.settings_file): + with open(self.settings_file, "r") as file: + self.settings = json.load(file) # 설정 파일 로드 + else: + self.settings = {"theme": "light"} # 기본 설정 + + def saveSettings(self): + with open(self.settings_file, "w") as file: + json.dump(self.settings, file) # 설정 파일 저장 def setupUI(self): self.title("DBC to C Converter") self.geometry("800x600") # 아이콘 설정 - # icon_path = "icon/icon.ico" - # self.iconbitmap(icon_path) + icon_path = "icon/icon.ico" + self.iconbitmap(icon_path) # 메뉴바 추가 self.menu_bar = tk.Menu(self) @@ -77,6 +93,7 @@ class MainView(tk.Tk): tools_menu.add_separator() tools_menu.add_command(label="프로그램 정보", command=self.openAbout) + # Treeview 설정 self.tree = ttk.Treeview(self, columns=('파일명', '파일경로', '파일크기'), show='headings') self.tree.heading('파일명', text='파일명', command=lambda: self.sortTreeView('파일명', False)) self.tree.heading('파일경로', text='파일경로', command=lambda: self.sortTreeView('파일경로', False)) @@ -89,11 +106,13 @@ class MainView(tk.Tk): else: self.tree.column(col, stretch=tk.YES) + # Treeview 이벤트 바인딩 self.tree.bind("", self.onTreeMotion) self.tree.bind("", self.onTreeLeave) # 마우스가 Treeview를 떠날 때 이벤트 바인딩 self.tree.bind("", self.onTreeDoubleClick) # 더블클릭 이벤트 바인딩 self.tree.bind("", self.onRightClick) # 우클릭 이벤트 바인딩 + # 알림창 설정 self.alert_frame = tk.Frame(self) self.alert_frame.pack(fill=tk.BOTH, expand=True) @@ -105,23 +124,29 @@ class MainView(tk.Tk): self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.alert_text.config(yscrollcommand=self.scrollbar.set) + # 버튼 프레임 설정 self.button_frame = tk.Frame(self) self.button_frame.pack(fill=tk.X) - self.btn_list = tk.Button(self.button_frame, text="파일 추가", command=self.FilesOpen) + # 둥근 모서리를 가진 버튼 추가 + self.btn_list = tk.Button(self.button_frame, text="파일 추가", command=self.FilesOpen, relief="solid", borderwidth=1, highlightthickness=0, padx=10, pady=5) self.btn_list.grid(row=0, column=0, padx=5, pady=5) - self.btn_delete = tk.Button(self.button_frame, text="파일 삭제", command=self.deleteSelectedFiles) + self.btn_delete = tk.Button(self.button_frame, text="파일 삭제", command=self.deleteSelectedFiles, relief="solid", borderwidth=1, highlightthickness=0, padx=10, pady=5) self.btn_delete.grid(row=0, column=1, padx=5, pady=5) - self.btn_delete_all = tk.Button(self.button_frame, text="모든 파일 삭제", command=self.deleteAllFiles) + self.btn_delete_all = tk.Button(self.button_frame, text="모든 파일 삭제", command=self.deleteAllFiles, relief="solid", borderwidth=1, highlightthickness=0, padx=10, pady=5) self.btn_delete_all.grid(row=0, column=2, padx=5, pady=5) - self.btn_clear_alerts = tk.Button(self.button_frame, text="알림창 내용 삭제", command=self.clearAlerts) + self.btn_clear_alerts = tk.Button(self.button_frame, text="알림창 내용 삭제", command=self.clearAlerts, relief="solid", borderwidth=1, highlightthickness=0, padx=10, pady=5) self.btn_clear_alerts.grid(row=0, column=3, padx=5, pady=5) self.tree.bind("", self.onTreeClick) + # 초기 테마 설정 적용 + if self.settings["theme"] == "light": + self.setLightMode() + def setButtons(self): self.btn_list.config(command=self.FilesOpen) self.btn_delete.config(command=self.deleteSelectedFiles) @@ -157,6 +182,10 @@ class MainView(tk.Tk): def deleteAllFiles(self): all_items = self.tree.get_children() + if not all_items: + messagebox.showwarning("경고", "삭제할 파일이 없습니다", parent=self) + self.updateAlertText("모든 파일 삭제 실패", ["삭제할 파일이 없습니다"]) + return deleted_files = [self.tree.item(item, 'values')[0] for item in all_items] for item in all_items: self.tree.delete(item) @@ -183,7 +212,7 @@ class MainView(tk.Tk): self.tree.tooltip = tk.Toplevel(self.tree) self.tree.tooltip.wm_overrideredirect(True) self.tree.tooltip.wm_geometry(f"+{event.x_root + 20}+{event.y_root + 10}") - label = tk.Label(self.tree.tooltip, text=value, background="yellow", relief="solid", borderwidth=1, font=("Arial", 10, "normal")) + label = tk.Label(self.tree.tooltip, text=value, background="white", relief="solid", borderwidth=1, font=("Arial", 10, "normal")) label.pack() def onTreeLeave(self, event): @@ -300,13 +329,58 @@ class MainView(tk.Tk): settings_window = tk.Toplevel(self) settings_window.title("설정") settings_window.geometry("400x300") + self.centerWindow(settings_window) + settings_window.bind('', lambda event: settings_window.destroy()) tk.Label(settings_window, text="설정 창입니다.").pack(pady=20) def openAbout(self): about_window = tk.Toplevel(self) about_window.title("프로그램 정보") about_window.geometry("400x300") - tk.Label(about_window, text="프로그램 정보 창입니다.").pack(pady=20) + self.centerWindow(about_window) + about_window.bind('', lambda event: about_window.destroy()) + tk.Label(about_window, text="\n\n이 프로그램은 DBC 파일을 C 파일로 변환합니다.\n\n").pack(pady=20) + tk.Label(about_window, text="프로그램 정보").pack(pady=10) + tk.Label(about_window, text=f"버전: {self.version}").pack(pady=10) + + def centerWindow(self, window): + window.update_idletasks() + x = self.winfo_x() + (self.winfo_width() // 2) - (window.winfo_width() // 2) + y = self.winfo_y() + (self.winfo_height() // 2) - (window.winfo_height() // 2) + window.geometry(f"+{x}+{y}") + + def setLightMode(self): + self.configure(bg="white") + self.alert_text.configure(bg="white", fg="black") + self.tree.configure(style="Light.Treeview") + self.menu_bar.configure(bg="white", fg="black") + for menu in self.menu_bar.winfo_children(): + menu.configure(bg="white", fg="black") + self.button_frame.configure(bg="white") + for button in self.button_frame.winfo_children(): + button.configure(bg="white", fg="black", activebackground="white", activeforeground="black") + self.alert_frame.configure(bg="white") + self.scrollbar.configure(bg="white") + + def bindShortcuts(self): + self.bind('', lambda event: self.selectAllFiles()) + self.bind('', lambda event: self.deleteSelectedFiles()) + self.bind('', lambda event: self.selectFirstFile()) + self.bind('', lambda event: self.selectLastFile()) + + def selectFirstFile(self): + items = self.tree.get_children() + if items: + self.tree.selection_set(items[0]) + self.tree.focus(items[0]) + self.tree.see(items[0]) + + def selectLastFile(self): + items = self.tree.get_children() + if items: + self.tree.selection_set(items[-1]) + self.tree.focus(items[-1]) + self.tree.see(items[-1]) if __name__ == '__main__': app = MainView() diff --git a/settings.json b/settings.json new file mode 100644 index 0000000..6a5d1e0 --- /dev/null +++ b/settings.json @@ -0,0 +1 @@ +{"theme": "light"} \ No newline at end of file