Читать «Программирование на Python. Том 1» онлайн - страница 643

Марк Лутц

class PhotoClockConfig(ClockConfig):

#    пример комплекта настроек size = 320

picture = ‘../gifs/ora-pp.gif’

bg, hh, mh = ‘white’, ‘blue’, ‘orange’

##############################################################################

#    Объект цифрового интерфейса

##############################################################################

class DigitalDisplay(Frame):

def __init__(self, parent, cfg):

Frame.__init__(self, parent) self.hour = Label(self) self.mins = Label(self) self.secs = Label(self) self.ampm = Label(self)

for label in self.hour, self.mins, self.secs, self.ampm: label.config(bd=4, relief=SUNKEN, bg=cfg.bg, fg=cfg.fg) label.pack(side=LEFT) # TBD: при изменении размеров можно было бы # изменять размер шрифта def onUpdate(self, hour, mins, secs, ampm, cfg):

mins = str(mins).zfill(2)    # или ‘%02d’ % x

self.hour.config(text=str(hour), width=4) self.mins.config(text=str(mins), width=4) self.secs.config(text=str(secs), width=4) self.ampm.config(text=str(ampm), width=4)

def onResize(self, newWidth, newHeight, cfg):

pass # здесь ничего перерисовывать не требуется

##############################################################################

# Объект аналогового интерфейса

##############################################################################

class AnalogDisplay(Canvas):

def __init__(self, parent, cfg):

Canvas.__init__(self, parent,

width=cfg.size, height=cfg.size, bg=cfg.bg) self.drawClockface(cfg)

self.hourHand = self.minsHand = self.secsHand = self.cog = None

def drawClockface(self, cfg): # при запуске и изменении размеров if cfg.picture:    # рисует овалы, картинку

try:

self.image = PhotoImage(file=cfg.picture) # фон except:

self.image = BitmapImage(file=cfg.picture) # сохранить ссылку imgx = (cfg.size - self.image.width()) // 2    #    центрировать

imgy = (cfg.size - self.image.height()) // 2    #    3.x деление //

self.create_image(imgx+1, imgy+1, anchor=NW, image=self.image) originX = originY = radius = cfg.size // 2    # 3.x деление //

for i in range(60):

x, y = self.point(i, 60, radius-6, originX, originY) self.create_rectangle(x-1, y-1, x+1, y+1, fill=cfg.fg) # минуты for i in range(12):

x, y = self.point(i, 12, radius-6, originX, originY) self.create_rectangle(x-3, y-3, x+3, y+3, fill=cfg.fg) # часы self.ampm = self.create_text(3, 3, anchor=NW, fill=cfg.fg)

def point(self, tick, units, radius, originX, originY): angle = tick * (360.0 / units) radiansPerDegree = math.pi / 180

pointX = int( round( radius * math.sin(angle * radiansPerDegree) )) pointY = int( round( radius * math.cos(angle * radiansPerDegree) )) return (pointX + originX+1), (originY+1 - pointY)

def onUpdate(self, hour, mins,    secs, ampm, cfg): #    вызывается из

if self.cog:    #    обработчика событий

self.delete(self.cog)    #    таймера, перерисовывает

self.delete(self.hourHand)    #    стрелки, центр

self.delete(self.minsHand) self.delete(self.secsHand)

originX = originY = radius = cfg.size // 2    # 3.x деление //

hour =    hour + (mins / 60.0)

hx,    hy    =    self.point(hour,    12,    (radius    *    .80),    originX,    originY)