Пример 19.21. PP4E\Lang\Calculator\calculator_test.py
проверка калькулятора: используется как расширяемый и встраиваемый компонент графического интерфейса
from tkinter import *
from calculator import CalcGui
def calcContainer(parent=None):
frm = Frame(parent)
frm.pack(expand=YES, fill=BOTH)
Label(frm, text=’Calc Container’).pack(side=TOP)
CalcGui(frm)
Label(frm, text=’Calc Container’).pack(side=BOTTOM) return frm
class calcSubclass(CalcGui):
def makeWidgets(self, fg, bg, font):
Label(self, text=’Calc Subclass’).pack(side=TOP)
Label(self, text=’Calc Subclass’).pack(side=BOTTOM) CalcGui.makeWidgets(self, fg, bg, font) #Label(self, text=’Calc Subclass’).pack(side=BOTTOM)
if __name__ == ‘__main__’: import sys if len(sys.argv) == 1: # % calculator_test.py
root = Tk() # запуск 3 калькуляторов в том же процессе
CalcGui(Toplevel()) # каждый в новом окне верхнего уровня
calcContainer(Toplevel()) calcSubclass(Toplevel()) Button(root, text=’quit’, command=root.quit).pack() root.mainloop()
if len(sys.argv) == 2: # % calculator_testl.py —
CalcGui().mainloop() # как самостоятельное окно (корневое) elif len(sys.argv) == 3: # % calculator_test.py — —
calcContainer().mainloop() # как встраиваемый компонент elif len(sys.argv) == 4: # % calculator_test.py — — —
calcSubclass().mainloop() # как настраиваемый суперкласс
На рис. 19.7 показан результат выполнения этого сценария без аргументов командной строки. Мы получили экземпляры первоначального класса калькулятора плюс класс контейнера и подкласс, определенные в этом сценарии, которые все прикреплены к новым окнам верхнего уровня.
Два окна справа повторно используют базовый программный код PyCalc, выполняющийся в левом окне. Все эти окна действуют в рамках одного процесса (например, закрытие одного окна вызовет закрытие остальных), но все они действуют как независимые окна. Обратите внимание, что при таком выполнении трех калькуляторов в одном процессе у каждого из них имеется собственное пространство имен для вычисления выражений, потому что это атрибут экземпляра класса, а не глобальная переменная уровня модуля. Поэтому установка переменных в одном калькуляторе касается только этого калькулятора и не изменяет значений, присваиваемых в других окнах. Аналогично у каждого калькулятора имеется собственный объект, управляющий стеками вычислений, благодаря чему вычисления в одном окне не отображаются в других окнах и не влияют на них.
Рис. 19.7. Сценарий calculator_test: прикрепление и расширение
Два расширения в этом сценарии, конечно, искусственные — они просто добавляют метки вверху и внизу окна — но сама концепция имеет широкий круг применения. Класс калькулятора можно использовать повторно, прикрепляя его к любому графическому интерфейсу, где требуется калькулятор, и произвольным образом настраивать его с помощью подклассов. Это повторно используемый виджет.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011