Created
December 26, 2023 08:03
-
-
Save secemp9/366873fb571766d9fbba133e3553f30c to your computer and use it in GitHub Desktop.
tkinter tabs editor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import tkinter as tk | |
| from tkinter import simpledialog | |
| class TabBar(tk.Canvas): | |
| def __init__(self, master): | |
| super().__init__(master, height=20, bg='grey', xscrollincrement=20) | |
| self.configure(highlightthickness=0) | |
| self.tabs_frame = tk.Frame(self, bg='grey') | |
| self.tabs_window = self.create_window((0, 0), window=self.tabs_frame, anchor="nw") | |
| self.tabs = {} | |
| self.current_tab = None | |
| def add_tab(self, name): | |
| tab = tk.Button(self.tabs_frame, text=name, command=lambda: self.select_tab(name)) | |
| tab.pack(side=tk.LEFT) | |
| self.tabs[name] = tab | |
| if not self.current_tab: | |
| self.select_tab(name) | |
| self.update_scrollregion() | |
| def update_scrollregion(self): | |
| self.tabs_frame.update_idletasks() | |
| self.configure(scrollregion=self.bbox("all")) | |
| def select_tab(self, name): | |
| if self.current_tab: | |
| self.tabs[self.current_tab].config(relief=tk.RAISED) | |
| self.current_tab = name | |
| self.tabs[name].config(relief=tk.SUNKEN) | |
| self.master.display.show_frame(name) | |
| self.master.focus_on_text_widget(name) | |
| def see_tab(self, name): | |
| tab = self.tabs[name] | |
| self.update_idletasks() | |
| class Display(tk.Canvas): | |
| def __init__(self, master): | |
| super().__init__(master) | |
| self.frames = {} | |
| self.current_frame = None | |
| def add_frame(self, name, frame): | |
| frame.pack_forget() | |
| self.frames[name] = frame | |
| def show_frame(self, name): | |
| if self.current_frame: | |
| self.current_frame.pack_forget() | |
| self.current_frame = self.frames[name] | |
| self.current_frame.pack(expand=True, fill=tk.BOTH) | |
| class MyNoteBook(tk.Frame): | |
| def __init__(self, master): | |
| super().__init__(master) | |
| self.tab_count = 0 | |
| self.bar = TabBar(self) | |
| self.display = Display(self) | |
| self.scrollbar = tk.Scrollbar(self, orient="horizontal", command=self.bar.xview) | |
| self.bar.configure(xscrollcommand=self.scrollbar.set) | |
| self.backward_btn = tk.Button(self, text='<-', command=self.navigate_backward) | |
| self.forward_btn = tk.Button(self, text='->', command=self.navigate_forward) | |
| self.backward_btn.grid(row=0, column=0, padx=0, pady=0) | |
| self.bar.grid(row=0, column=1, sticky='nsew', padx=0, pady=0) | |
| self.forward_btn.grid(row=0, column=2, padx=0, pady=0) | |
| self.scrollbar.grid(row=1, column=1, sticky='ew') | |
| self.display.grid(row=2, column=0, columnspan=2, padx=0, pady=0, sticky='nsew') | |
| self.grid_columnconfigure(1, weight=1) | |
| self.grid_rowconfigure(2, weight=1) | |
| master.bind('<Control-t>', self.create_new_tab) | |
| self.text_widgets = {} | |
| def add_tab(self, name): | |
| frame = tk.Frame(self.display) | |
| text_widget = tk.Text(frame) | |
| text_widget.pack(expand=True, fill=tk.BOTH) | |
| self.display.add_frame(name, frame) | |
| self.bar.add_tab(name) | |
| self.text_widgets[name] = text_widget | |
| def focus_on_text_widget(self, tab_name): | |
| text_widget = self.text_widgets.get(tab_name) | |
| if text_widget: | |
| text_widget.focus_set() | |
| def create_new_tab(self, event=None): | |
| filename = simpledialog.askstring("New Tab", "Enter filename for the new tab:") | |
| if filename and filename.strip(): | |
| self.add_tab(filename) | |
| else: | |
| print("Tab creation cancelled or invalid filename entered.") | |
| def navigate_forward(self): | |
| tab_names = list(self.bar.tabs.keys()) | |
| if self.bar.current_tab in tab_names: | |
| current_index = tab_names.index(self.bar.current_tab) | |
| next_index = (current_index + 1) % len(tab_names) | |
| self.bar.select_tab(tab_names[next_index]) | |
| def navigate_backward(self): | |
| tab_names = list(self.bar.tabs.keys()) | |
| if self.bar.current_tab in tab_names: | |
| current_index = tab_names.index(self.bar.current_tab) | |
| next_index = (current_index - 1) % len(tab_names) | |
| self.bar.select_tab(tab_names[next_index]) | |
| root = tk.Tk() | |
| ntbk = MyNoteBook(root) | |
| ntbk.pack(fill=tk.BOTH, expand=True) | |
| root.mainloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment