1 from Tkinter import *
2 """
3 ButtonBar widget
4 Rick Lawson
5 r_b_lawson at yahoo dot com
6 Easy widget to mimic the ButtonBar which is showing up a lot in Windows
7 Inspired by Iuri Wickert's notebook.py widget (esp. the Radiobutton tricks)
8
9 config options
10 --------------
11 BusyBar is derived from frame so all frame options are fine
12 Here are the options specific to this widget
13 labels = sequence of button labels
14 images = sequence of PhotoImage objects
15 commands = sequence of commands to be executed when particular button is selected
16 """
17 class ButtonBar(Frame):
18 def __init__(self, master=None, **options):
19 # make sure we have sane defaults
20 self.master=master
21 self.options=options
22 self.labels = pop(options, 'labels')
23 self.images = pop(options, 'images')
24 self.commands = pop(options, 'commands')
25 options.setdefault('bd', 2)
26 options.setdefault('bg', 'white')
27 options.setdefault('relief', GROOVE)
28 self.tkVar = IntVar()
29
30 # init the base class
31 Frame.__init__(self, master, options)
32
33 # load the images & create the buttons
34 self.buttons = []
35 index = 0
36 for image in self.images:
37 button = Radiobutton(self, indicatoron=0, text=self.labels[index], relief=FLAT, variable = self.tkVar, value=index, image=image, compound=TOP, bg='white', bd=0, pady=2, padx=2, command=self.commands[index], selectcolor='blue')
38 button.bind('<Enter>', self._onEnter)
39 button.bind('<Leave>', self._onLeave)
40 button.pack()
41 self.buttons.append(button)
42 index += 1
43
44 def getSelectedIndex(self):
45 return self.tkVar.get()
46
47 def _onEnter(self, event):
48 b = event.widget
49 b.config(bg='lightblue')
50
51 def _onLeave(self, event):
52 b = event.widget
53 b.config(bg='white')
54
55 def pop(dict, key):
56 value = dict[key]
57 del dict[key]
58 return value
59
60 if __name__=='__main__':
61 root = Tk()
62
63 #Done with imageEmbedder 1.0 utility img2pytk.py from
64 # http://www.3dartist.com/WP/python/pycode.htm#img2pytk
65 img00 = PhotoImage(format='gif',data=
66 'R0lGODlhGAAYAOb/AAAAAP///4GBl3FxgHJygH19hnx8g25uccvMUtfYW/Ly'
67 +'AKurAP//Dbi4DdfXLcPDLsPEL+TkOsTFNNDQO8XGOsfIQcjJQtfXSdPUSeTk'
68 +'UdXWUdbXVdbXVs3NVtDQYtHRY93dbODgeuHhgNbWfdbWfuPjh9jYhuTkj9ra'
69 +'jerqperqp+rqqN7en9/fou3tsu3ts+PjsWZmUeXluOTkt2dnVfPzzXNzYXR0'
70 +'Y2lpXff333d3be3t3e3t3nh4dGxsa7+bh8yolNnBs+bOwO3e1vrr49bDuuPQ'
71 +'x8mxp6qOhLebkbyjmvLy8g0NDcDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
72 +'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
73 +'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
74 +'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAE0A'
75 +'LAAAAAAYABgAAAfwgE2Cg4SFhoeETACKigFLiIaLFy8tKSYRi4+QggAZMCos'
76 +'KiglHiEOTJqQTDAuMjUEBSgiHRgAAZtMFyozOTsCAyskIBYNtpAALyw1PAE7'
77 +'NSwnHhoQqKotKjK9AgQqwhUTxogAKSitr7GzGA/ViEwmJSigBgekHBLgt+IR'
78 +'HiIjJz49PiSgMGEBO3EhOoD4oAPHBoLrUrVzgKHCDRo2Ykx4UCwfLgQTIGwc'
79 +'GW5TEwARFIx8wMCgxE2LFjBQUOygySZMfjACkKTkTQBAghApcgSJTZM5hQwx'
80 +'oqSnx5tLmAgl6vNmk6iLqlq96ujp1q9gNwUCACH+T0NvcHlyaWdodCAyMDAw'
81 +'IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZl'
82 +'ZC4NCkpMRiBHUiBWZXIgMS4wDQoAOw==')
83
84 img01 = PhotoImage(format='gif',data=
85 'R0lGODlhGAAYALP/AAAAAP///zAwYT09bpGRwp6ez8LC8s/P//Ly8g0NDcDA'
86 +'wAAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAYABgAAASWUMlJq7134G1F'
87 +'4qAyGF9IAQkqHEQZpocRx0X7ykSt5y2yJYadsPcL8lIJQS3hQzkDEwBriQgg'
88 +'BkRFIkfyKaRHr8IjBtQOAKjWyKQMxFpu+ztNT5KU7dm+pkq2Gn88aGpfSHZ6'
89 +'Hig8BV0TVpAIeoyMjhiTQzFzGJJcMzIocJxbB4opViYKkgZvkKkTkgKFr7Bv'
90 +'tBZVt7oRACH+T0NvcHlyaWdodCAyMDAwIGJ5IFN1biBNaWNyb3N5c3RlbXMs'
91 +'IEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCkpMRiBHUiBWZXIgMS4wDQoA'
92 +'Ow==')
93
94 win = Frame(root, height=300, width=300)
95 commands = [lambda w=win: w.config(bg='blue'), lambda w=win: w.config(bg='red')]
96 bb = ButtonBar(root, labels=['Command 1', 'Command 2'], images=[img00, img01], commands=commands)
97 bb.grid(row=0, column=0, sticky=NS)
98 win.grid(row=0, column=1, sticky=NSEW)
99 root.rowconfigure(0, weight=1)
100 root.columnconfigure(0, weight=0)
101 root.columnconfigure(1, weight=1)
102 root.mainloop()
103
Screenshot of buttonbar script above: