Читать «Программирование на 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, - в нем определяется несколько стилей часов и производится запуск одновременно семи экземпляров часов, прикрепляемых к новым окнам верхнего уровня для создания демонстрационного эффекта (хотя на практике обычно достаточно иметь на экране одни часы, даже мне!).