Skip to content

Instantly share code, notes, and snippets.

@secemp9
Created December 26, 2023 08:03
Show Gist options
  • Save secemp9/366873fb571766d9fbba133e3553f30c to your computer and use it in GitHub Desktop.
Save secemp9/366873fb571766d9fbba133e3553f30c to your computer and use it in GitHub Desktop.
tkinter tabs editor
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