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:

buttonbar.png

tkinter: ButtonBar (last edited 2010-07-26 11:59:11 by localhost)