This tabbed interface is very useful for Tkinter users. I am sure there is a better way to do it, but I did the best I could.
Please enjoy this tabbed interface by SunjayVarma - www.sunjay-varma.com
UPDATES: Fixed the index issues. Made it easier to use.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | ###################################################
# Tabbed interface script
# www.sunjay-varma.com
###################################################
__doc__ = info = '''
This script was written by Sunjay Varma - www.sunjay-varma.com
This script has two main classes:
Tab - Basic tab used by TabBar for main functionality
TabBar - The tab bar that is placed above tab bodies (Tabs)
It uses a pretty basic structure:
root
-->TabBar(root, init_name) (For switching tabs)
-->Tab (Place holder for content)
\t-->content (content of the tab; parent=Tab)
-->Tab (Place holder for content)
\t-->content (content of the tab; parent=Tab)
-->Tab (Place holder for content)
\t-->content (content of the tab; parent=Tab)
etc.
'''
from Tkinter import *
BASE = RAISED
SELECTED = FLAT
# a base tab class
class Tab(Frame):
def __init__(self, master, name):
Frame.__init__(self, master)
self.tab_name = name
# the bulk of the logic is in the actual tab bar
class TabBar(Frame):
def __init__(self, master=None, init_name=None):
Frame.__init__(self, master)
self.tabs = {}
self.buttons = {}
self.current_tab = None
self.init_name = init_name
def show(self):
self.pack(side=TOP, expand=YES, fill=X)
self.switch_tab(self.init_name or self.tabs.keys()[-1])# switch the tab to the first tab
def add(self, tab):
tab.pack_forget() # hide the tab on init
self.tabs[tab.tab_name] = tab # add it to the list of tabs
b = Button(self, text=tab.tab_name, relief=BASE, # basic button stuff
command=(lambda name=tab.tab_name: self.switch_tab(name))) # set the command to switch tabs
b.pack(side=LEFT) # pack the buttont to the left mose of self
self.buttons[tab.tab_name] = b # add it to the list of buttons
def delete(self, tabname):
if tabname == self.current_tab:
self.current_tab = None
self.tabs[tabname].pack_forget()
del self.tabs[tabname]
self.switch_tab(self.tabs.keys()[0])
else: del self.tabs[tabname]
self.buttons[tabname].pack_forget()
del self.buttons[tabname]
def switch_tab(self, name):
if self.current_tab:
self.buttons[self.current_tab].config(relief=BASE)
self.tabs[self.current_tab].pack_forget() # hide the current tab
self.tabs[name].pack(side=BOTTOM) # add the new tab to the display
self.current_tab = name # set the current tab to itself
self.buttons[name].config(relief=SELECTED) # set it to the selected style
if __name__ == '__main__':
def write(x): print x
root = Tk()
root.title("Tabs")
bar = TabBar(root, "Info")
tab1 = Tab(root, "Wow...") # notice how this one's master is the root instead of the bar
Label(tab1, text="Sunjay Varma is an extra ordinary little boy.\n\n\n\n\nCheck out his website:\nwww.sunjay-varma.com", bg="white", fg="red").pack(side=TOP, expand=YES, fill=BOTH)
Button(tab1, text="PRESS ME!", command=(lambda: write("YOU PRESSED ME!"))).pack(side=BOTTOM, fill=BOTH, expand=YES)
Button(tab1, text="KILL THIS TAB", command=(lambda: bar.delete("Wow..."))).pack(side=BOTTOM, fill=BOTH, expand=YES)
tab2 = Tab(root, "Hi there!")
Label(tab2, text="How are you??", bg='black', fg='#3366ff').pack(side=TOP, fill=BOTH, expand=YES)
txt = Text(tab2, width=50, height=20)
txt.focus()
txt.pack(side=LEFT, fill=X, expand=YES)
Button(tab2, text="Get", command=(lambda: write(txt.get('1.0', END).strip()))).pack(side=BOTTOM, expand=YES, fill=BOTH)
tab3 = Tab(root, "Info")
Label(tab3, bg='white', text="This tab was given as an argument to the TabBar constructor.\n\nINFO:\n"+info).pack(side=LEFT, expand=YES, fill=BOTH)
bar.add(tab1) # add the tabs to the tab bar
bar.add(tab2)
bar.add(tab3)
#bar.config(bd=2, relief=RIDGE) # add some border
bar.show()
root.mainloop()
|
Just run it once to see a demo of its use.
It would be great if you could tell me what you don't like, instead of just rating down.
Hey Sunjay, this is very cool. One issue I had when I tried it out: When you resize the window all the widgets on each tab are stuck to the bottom of the window. I'm very new to Tkinter, so far I haven't been able to figure out what's causing it. Do you know which line, is causing this, or what code needs to be added to change this? I'd rather the widgets be anchored to the NW corner of each tab.