| 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
| from Tkinter import *
"""
ButtonBar widget
Rick Lawson
r_b_lawson at yahoo dot com
Easy widget to mimic the ButtonBar which is showing up a lot in Windows
Inspired by Iuri Wickert's notebook.py widget (esp. the Radiobutton tricks)
config options
--------------
BusyBar is derived from frame so all frame options are fine
Here are the options specific to this widget
labels = sequence of button labels
images = sequence of PhotoImage objects
commands = sequence of commands to be executed when particular button is selected
"""
class ButtonBar(Frame):
def __init__(self, master=None, **options):
# make sure we have sane defaults
self.master=master
self.options=options
self.labels = pop(options, 'labels')
self.images = pop(options, 'images')
self.commands = pop(options, 'commands')
options.setdefault('bd', 2)
options.setdefault('bg', 'white')
options.setdefault('relief', GROOVE)
self.tkVar = IntVar()
# init the base class
Frame.__init__(self, master, options)
# load the images & create the buttons
self.buttons = []
index = 0
for image in self.images:
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')
button.bind('<Enter>', self._onEnter)
button.bind('<Leave>', self._onLeave)
button.pack()
self.buttons.append(button)
index += 1
def getSelectedIndex(self):
return self.tkVar.get()
def _onEnter(self, event):
b = event.widget
b.config(bg='lightblue')
def _onLeave(self, event):
b = event.widget
b.config(bg='white')
def pop(dict, key):
value = dict[key]
del dict[key]
return value
if __name__=='__main__':
root = Tk()
#Done with imageEmbedder 1.0 utility img2pytk.py from
# http://www.3dartist.com/WP/python/pycode.htm#img2pytk
img00 = PhotoImage(format='gif',data=
'R0lGODlhGAAYAOb/AAAAAP///4GBl3FxgHJygH19hnx8g25uccvMUtfYW/Ly'
+'AKurAP//Dbi4DdfXLcPDLsPEL+TkOsTFNNDQO8XGOsfIQcjJQtfXSdPUSeTk'
+'UdXWUdbXVdbXVs3NVtDQYtHRY93dbODgeuHhgNbWfdbWfuPjh9jYhuTkj9ra'
+'jerqperqp+rqqN7en9/fou3tsu3ts+PjsWZmUeXluOTkt2dnVfPzzXNzYXR0'
+'Y2lpXff333d3be3t3e3t3nh4dGxsa7+bh8yolNnBs+bOwO3e1vrr49bDuuPQ'
+'x8mxp6qOhLebkbyjmvLy8g0NDcDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAE0A'
+'LAAAAAAYABgAAAfwgE2Cg4SFhoeETACKigFLiIaLFy8tKSYRi4+QggAZMCos'
+'KiglHiEOTJqQTDAuMjUEBSgiHRgAAZtMFyozOTsCAyskIBYNtpAALyw1PAE7'
+'NSwnHhoQqKotKjK9AgQqwhUTxogAKSitr7GzGA/ViEwmJSigBgekHBLgt+IR'
+'HiIjJz49PiSgMGEBO3EhOoD4oAPHBoLrUrVzgKHCDRo2Ykx4UCwfLgQTIGwc'
+'GW5TEwARFIx8wMCgxE2LFjBQUOygySZMfjACkKTkTQBAghApcgSJTZM5hQwx'
+'oqSnx5tLmAgl6vNmk6iLqlq96ujp1q9gNwUCACH+T0NvcHlyaWdodCAyMDAw'
+'IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZl'
+'ZC4NCkpMRiBHUiBWZXIgMS4wDQoAOw==')
img01 = PhotoImage(format='gif',data=
'R0lGODlhGAAYALP/AAAAAP///zAwYT09bpGRwp6ez8LC8s/P//Ly8g0NDcDA'
+'wAAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAYABgAAASWUMlJq7134G1F'
+'4qAyGF9IAQkqHEQZpocRx0X7ykSt5y2yJYadsPcL8lIJQS3hQzkDEwBriQgg'
+'BkRFIkfyKaRHr8IjBtQOAKjWyKQMxFpu+ztNT5KU7dm+pkq2Gn88aGpfSHZ6'
+'Hig8BV0TVpAIeoyMjhiTQzFzGJJcMzIocJxbB4opViYKkgZvkKkTkgKFr7Bv'
+'tBZVt7oRACH+T0NvcHlyaWdodCAyMDAwIGJ5IFN1biBNaWNyb3N5c3RlbXMs'
+'IEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCkpMRiBHUiBWZXIgMS4wDQoA'
+'Ow==')
win = Frame(root, height=300, width=300)
commands = [lambda w=win: w.config(bg='blue'), lambda w=win: w.config(bg='red')]
bb = ButtonBar(root, labels=['Command 1', 'Command 2'], images=[img00, img01], commands=commands)
bb.grid(row=0, column=0, sticky=NS)
win.grid(row=0, column=1, sticky=NSEW)
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=0)
root.columnconfigure(1, weight=1)
root.mainloop() |