diff light8/uihelpers.py @ 30:e9d2e7754fd9

sideways subs, new x/y buttons (which don't draw right, but they work)
author drewp
date Sun, 07 Jul 2002 10:48:38 +0000
parents 219d6fcbc28d
children 411de8b46aef
line wrap: on
line diff
--- a/light8/uihelpers.py	Sun Jul 07 10:41:06 2002 +0000
+++ b/light8/uihelpers.py	Sun Jul 07 10:48:38 2002 +0000
@@ -39,3 +39,46 @@
     out = [int(l+lev*(h-l)) for h,l in zip(high,low)]
     col="#%02X%02X%02X" % tuple(out)
     label.config(bg=col)
+
+class Togglebutton(Button):
+    """works like a single radiobutton, but it's a button so the label's on the button face, not to the side"""
+    def __init__(self,parent,**kw):
+        if kw['variable']:
+            self.variable = kw['variable']
+            self.variable.trace('w',self.varchanged)
+            del kw['variable']
+        else:
+            self.variable=None
+        self.oldcommand = kw.get('command',None)
+        kw['command'] = self.invoke
+        Button.__init__(self,parent,**kw)
+
+        self.origbkg = self.cget('bg')
+
+        self.state=0
+        if self.variable:
+            self.state = self.variable.get()
+
+        self.setstate(self.state)
+
+        self.bind("<Enter>",lambda ev: self.setstate)
+        self.bind("<Leave>",lambda ev: self.setstate)
+
+    def varchanged(self,*args):
+        self.setstate(self.variable.get())
+        
+    def invoke(self):
+        self.setstate(not self.state)
+        
+        if self.oldcommand:
+            self.oldcommand()
+
+    def setstate(self,newstate):
+        self.variable.set(newstate)
+        if newstate: # set
+            self.tk.call('tkButtonDown',self)
+            self.config(bg='green')
+        else: # unset
+            self.tk.call('tkButtonUp',self)
+            self.config(bg=self.origbkg)
+        return "break"