class pyvcp_checkbutton(Checkbutton): """ (control) a checkbutton halpin is 1 when checkbutton-momentary pressed, 0 otherwise halpin is O (the btn sees it as write only) halpin changes state when checkbutton-toggle pressed, unchanged otherwise halpin is IO (the btn can read it and write it [set it the opp state] ) 20070123 added parameter 'btnType' to allowed token list allow values "Opin" & "IOpin" this preserves the original checkbutton with an 'o' pin but allows the 'new' IOpin type the IOpin type stays pressed until some xtrnl force releases it "mybtn" "O" halpin is ouput only "mybtn" optional default is created from "checkbutton" & a counter "IO" optional default it O "Flood" optional default is from a counter True optional default is True """ #TJP 20070125 only chg the halpin when pressed, not when release, so: dont cnx halpin to self.v!!! n=0 def __init__(self,master,pycomp,halpin=None,btnType=None,text=None,init=None, **kw): if btnType==None: btnType="Opin" if ((btnType!="Opin")&(btnType!="IOpin")): return if init==None: init=True if ((init!=True)&(init!=False)): return if text==None: btntxt=str(pyvcp_checkbutton.n) else: btntxt = text self.v = BooleanVar(master) #for original 'Opin' type checkbutton self.downVal=init # the logic value to emit when pressed self.btntype=btnType # "Opin" or "IOpin" #i dont see why this is necc, else update gives # AttributeError: pyvcp_checkbutton instance has no attribute 'newstate' self.newstate=self.oldstate=None if btnType=="Opin": Checkbutton.__init__(self,master, \ variable=self.v, \ text=None, indicatoron=0, \ onvalue=1, offvalue=0, \ **kw) else: Checkbutton.__init__(self,master, \ text=None, indicatoron=0, \ **kw) if halpin == None: halpin = "checkbutton."+str(pyvcp_checkbutton.n) self.halpin=halpin if btnType=="Opin": pycomp.newpin(halpin, HAL_BIT, HAL_OUT) self.configure(text=btntxt) else: pycomp.newpin(halpin, HAL_BIT, HAL_IO) self.configure(text=btntxt) #show the color according to , set the pin & history to opposite of presed state ( becuz not pressed yet ) if self.downVal==True: colr="red" self.configure(activebackground=colr) self.configure(bg=colr) pycomp[self.halpin]=self.oldstate=self.newstate=False # if init was True, then begin UP, Red, and oldstate = False else: colr="green" self.configure(activebackground=colr) self.configure(selectcolor=colr) self.configure(bg=colr) pycomp[self.halpin]=self.oldstate=self.newstate=True # if init was False, then begin UP, Green & oldstate = True self.bind('',self.bdown) # only bind the IOpin vrsn of cbtn chg output state when pressed pyvcp_checkbutton.n += 1 self.mirror=None # this func requests a change in state def bdown(self,event): if self.btntype=="IOpin": if self.downVal==True: self.newstate=True else: self.newstate=False self.configure(state=DISABLED) #def bup(self) # there is no bup, only external srcs can release the btn, not this widget def update(self,pycomp): if self.btntype=="Opin": pycomp[self.halpin]=self.v.get() else: # btnType = "IO" dirty = False # no need to change appearance till we know theres been a change if self.newstate!=self.oldstate: # detect a change caused by btn press ( an internal change ) pycomp[self.halpin]=self.newstate dirty=True # need to chg appearance self.oldstate=self.newstate elif pycomp[self.halpin]!=self.oldstate: # detect a change caused by by external src dirty=True # need to chg appearance self.oldstate=self.newstate=pycomp[self.halpin] if dirty==True: tmp=pycomp[self.halpin] if self.downVal==True: # downVal is True if tmp==True: # halpin is True self.select() # btn looks down looks decided by downVal & halpin colr="green" # colr is green color decided by halpin else: # halpin is False self.deselect() # btn looks up colr="red" # colr is red else: # downVal is False if tmp==True: # halpin is True self.deselect() # btn looks up colr="green" # colr is green else: # halpin is False self.select() # btn looks down colr="red" # colr is red self.configure(selectcolor=colr) self.configure(activebackground=colr) self.configure(state=NORMAL) dirty=False