Mega Code Archive

 
Categories / Python / GUI Tk
 

LED control

#/* #Python and Tkinter Programming #John E. Grayson #ISBN: 1884777813 #Publisher: Manning #*/ from Tkinter   import * SQUARE      = 1 ROUND       = 2 ARROW       = 3 POINT_DOWN  = 0 POINT_UP    = 1 POINT_RIGHT = 2 POINT_LEFT  = 3 STATUS_OFF   = 1 STATUS_ON    = 2 STATUS_WARN  = 3 STATUS_ALARM = 4 STATUS_SET   = 5 class DummyClass:     pass Color  = DummyClass() Color.PANEL     = '#545454' Color.OFF       = '#656565' Color.ON        = '#00FF33' Color.WARN      = '#ffcc00' Color.ALARM     = '#ff4422' class LED:     def __init__(self, master=None, width=25, height=25,                   appearance=FLAT,                  status=STATUS_ON, bd=1,                   bg=None,                   shape=SQUARE, outline="",                  blink=0, blinkrate=1,                  orient=POINT_UP,                  takefocus=0):         # preserve attributes         self.master       = master         self.shape        = shape         self.onColor      = Color.ON         self.offColor     = Color.OFF         self.alarmColor   = Color.ALARM         self.warningColor = Color.WARN         self.specialColor = '#00ffdd'         self.status       = status         self.blink        = blink         self.blinkrate    = int(blinkrate)         self.on           = 0         self.onState      = None         if not bg:             bg = Color.PANEL         ## Base frame to contain light         self.frame=Frame(master, relief=appearance, bg=bg, bd=bd,                           takefocus=takefocus)         basesize = width         d = center = int(basesize/2)         if self.shape == SQUARE:             self.canvas=Canvas(self.frame, height=height, width=width,                                 bg=bg, bd=0, highlightthickness=0)             self.light=self.canvas.create_rectangle(0, 0, width, height,                                                     fill=Color.ON)         elif self.shape == ROUND:             r = int((basesize-2)/2)             self.canvas=Canvas(self.frame, width=width, height=width,                                 highlightthickness=0, bg=bg, bd=0)             if bd > 0:                 self.border=self.canvas.create_oval(center-r, center-r,                                                      center+r, center+r)                 r = r - bd             self.light=self.canvas.create_oval(center-r-1, center-r-1,                                 center+r, center+r, fill=Color.ON,                                outline=outline)         else:  # Default is an ARROW             self.canvas=Canvas(self.frame, width=width, height=width,                                highlightthickness=0, bg=bg, bd=0)             x = d             y = d             if orient == POINT_DOWN:                 self.light=self.canvas.create_polygon(x-d,y-d, x,y+d,                                x+d,y-d, x-d,y-d, outline=outline)             elif orient == POINT_UP:                 self.light=self.canvas.create_polygon(x,y-d, x-d,y+d,                                x+d,y+d, x,y-d, outline=outline)             elif orient == POINT_RIGHT:                 self.light=self.canvas.create_polygon(x-d,y-d, x+d,y,                                x-d,y+d, x-d,y-d, outline=outline)             elif orient == POINT_LEFT:                 self.light=self.canvas.create_polygon(x-d,y, x+d,y+d,                                x+d,y-d, x-d,y, outline=outline)         self.canvas.pack(side=TOP, fill=X, expand=NO)         self.update()     def turnon(self):         self.status = STATUS_ON         if not self.blink: self.update()     def turnoff(self):         self.status = STATUS_OFF         if not self.blink: self.update()     def alarm(self):         self.status = STATUS_ALARM         if not self.blink: self.update()     def warn(self):         self.status = STATUS_WARN         if not self.blink: self.update()     def set(self, color):         self.status       = STATUS_SET         self.specialColor = color         self.update()     def blinkon(self):         if not self.blink:             self.blink   = 1             self.onState = self.status             self.update()     def blinkoff(self):         if self.blink:             self.blink   = 0             self.status  = self.onState             self.onState = None             self.on      = 0             self.update()     def blinkstate(self, blinkstate):         if blinkstate:             self.blinkon()         else:             self.blinkoff()     def update(self):         # First do the blink, if set to blink         if self.blink:             if self.on:                 if not self.onState:                     self.onState = self.status                 self.status  = STATUS_OFF                 self.on      = 0                                         else:                 if self.onState:                     self.status = self.onState     # Current ON color                 self.on = 1         if self.status == STATUS_ON:             self.canvas.itemconfig(self.light, fill=self.onColor)         elif self.status == STATUS_OFF:             self.canvas.itemconfig(self.light, fill=self.offColor)         elif self.status == STATUS_WARN:             self.canvas.itemconfig(self.light, fill=self.warningColor)         elif self.status == STATUS_SET:             self.canvas.itemconfig(self.light, fill=self.specialColor)         else:             self.canvas.itemconfig(self.light, fill=self.alarmColor)         self.canvas.update_idletasks()         if self.blink:             self.frame.after(self.blinkrate * 1000, self.update) if __name__ == '__main__':     class TestLEDs(Frame):         def __init__(self, parent=None):             # List of Colors and Blink On/Off             states = [(STATUS_OFF,   0),                            (STATUS_ON,    0),                       (STATUS_WARN,  0),                       (STATUS_ALARM, 0),                       (STATUS_SET,   0),                       (STATUS_ON,    1),                       (STATUS_WARN,  1),                       (STATUS_ALARM, 1),                       (STATUS_SET,   1)]             # List of LED types to display,             # with sizes and other attributes             leds = [(ROUND,  25, 25, FLAT,   0, None,        ""),                     (ROUND,  15, 15, RAISED, 1, None,        ""),                     (SQUARE, 20, 20, SUNKEN, 1, None,        ""),                     (SQUARE,  8,  8, FLAT,   0, None,        ""),                     (SQUARE,  8,  8, RAISED, 1, None,        ""),                     (SQUARE, 16,  8, FLAT,   1, None,        ""),                     (ARROW,  14, 14, RIDGE,  1, POINT_UP,    ""),                     (ARROW,  14, 14, RIDGE,  0, POINT_RIGHT, ""),                     (ARROW,  14, 14, FLAT,   0, POINT_DOWN,  "white")]             Frame.__init__(self)              # Do superclass init             self.pack()             self.master.title('LED Example - Stage 1')             # Iterate for each type of led             for shape, w, h, app, bd, orient, outline in leds:                 frame = Frame(self, bg=Color.PANEL)                 frame.pack(anchor=N, expand=YES, fill=X)                 # Iterate for selected states                 for state, blink in states:                     LED(frame, shape=shape, status=state,                         width=w, height=h, appearance=app,                         orient=orient, blink=blink, bd=bd,                          outline=outline).frame.pack(side=LEFT,                                       expand=YES, padx=1, pady=1) TestLEDs().mainloop()