Читать «Программирование на Python. Том 1» онлайн - страница 645
Марк Лутц
self.onCountdownExpire() # таймер обратного отсчета
self.after(1000 // ChecksPerSec, self.onTimer) # вызывать N раз в сек.
# 3.x // целочисленное
# деление с усечением
def onCountdownSec(self, event):
secs = askinteger(‘Countdown’, ‘Seconds?’) if secs: self.countdownSeconds = secs
def onCountdownMin(self, event):
secs = askinteger(‘Countdown’, ‘Minutes’) if secs: self.countdownSeconds = secs * 60
def onCountdownExpire(self):
# ВНИМАНИЕ: только один активный таймер,
# текущее состояние таймера не отображается win = Toplevel()
msg = Button(win, text=’Timer Expired!’, command=win.destroy) msg.config(font=(‘courier’, 80, ‘normal’), fg=’white’, bg=’navy’) msg.config(padx=10, pady=10) msg.pack(expand=YES, fill=BOTH)
win.lift() # поднять над другими окнами
if sys.platform[:3] == ‘win’: # в Windows - на полный экран win.state(‘zoomed’)
##############################################################################
# Автономные часы
##############################################################################
appname = ‘PyClock 2.1’
# использовать новые окна Tk, Toplevel со своими значками и так далее from PP4E.Gui.Tools.windows import PopupWindow, MainWindow
class ClockPopup(PopupWindow):
def __init__(self, config=ClockConfig, name=’’):
PopupWindow.__init__(self, appname, name) clock = Clock(config, self) clock.pack(expand=YES, fill=BOTH)
class ClockMain(MainWindow):
def __init__(self, config=ClockConfig, name=’’):
MainWindow.__init__(self, appname, name) clock = Clock(config, self) clock.pack(expand=YES, fill=BOTH)
# для обратной совместимости: рамки окна устанавливаются вручную,
# передается родитель class ClockWindow(Clock):
def __init__(self, config=ClockConfig, parent=None, name=’’):
Clock.__init__(self, config, parent) self.pack(expand=YES, fill=BOTH) title = appname
if name: title = appname + ‘ - ‘ + name
self.master.title(title) # владелец=parent или окно по умолчанию self.master.protocol('WM_DELETE_WINDOW', self.quit)
##############################################################################
# Запуск программы
##############################################################################
if __name__ == ‘__main__’:
def getOptions(config, argv):
for attr in dir(ClockConfig): # заполнить объект с настройками
try: # из арг. ком. строки “-attr val”
ix = argv.index(‘-’ + attr) # пропустит внутр. __x__
except:
continue else:
if ix in range(1, len(argv)-1):
if type(getattr(ClockConfig, attr)) == int: setattr(config, attr, int(argv[ix+1])) else:
setattr(config, attr, argv[ix+1])
#config = PhotoClockConfig() config = ClockConfig() if len(sys.argv) >= 2:
getOptions(config, sys.argv) # clock.py -size n -bg ‘blue’...
#myclock = ClockWindow(config, Tk()) # при автономном выполнении
#myclock = ClockPopup(ClockConfig(), ‘popup’) # родителем является корневое myclock = ClockMain(config) # окно Tk
myclock.mainloop()
И наконец, в примере 11.13 приводится модуль, выполняемый сценарием PyDemos, - в нем определяется несколько стилей часов и производится запуск одновременно семи экземпляров часов, прикрепляемых к новым окнам верхнего уровня для создания демонстрационного эффекта (хотя на практике обычно достаточно иметь на экране одни часы, даже мне!).