Использование PyCalc как компонента

ispolzovanie pycalc kak komponenta Текст и язык

Я использую PyCalc как самостоятельную программу на моем компьютере, но этот калькулятор можно также использовать и в контексте других графических интерфейсов. Как и большинство классов реализации графического интерфейса в этой книге, PyCalc можно настраивать, наследуя его в подклассах, или встраивать в более крупные графические интерфейсы. Модуль, представленный в примере 19.21, демонстрирует один из способов повторного использования класса CalcGui путем расширения и встраивания подобно тому, как это делалось выше для простого калькулятора.

Пример 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

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий