Читать «Программирование на 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)