Добавление новых кнопок в новые компоненты Python

dobavlenie novyh knopok v novye komponenty python Текст и язык

Один очевидный способ повторного использования калькулятора заключается в добавлении новых функциональных кнопок выражений — квадратных корней, обратных значений, кубов и так далее. Такие операции можно вводить в диалогах ввода произвольного программного кода, но кнопки несколько более удобны. Такие функции можно добавить и в саму основную реализацию калькулятора, но поскольку набор таких полезных функций может различаться в зависимости от пользователей и приложений, более правильным подходом явится их добавление в отдельные расширения. Например, класс в примере 19.22 добавляет в PyCalc несколько новых кнопок путем встраивания его (то есть прикрепления) в контейнер.

Пример 19.22. PP4E\Lang\Calculator\calculator_ plus_emb.py

############################################################################ контейнер с дополнительным рядом кнопок, выполняющих типичные операции;

более практичное усовершенствование: добавляет кнопки для дополнительных операций (sqrt, 1/x и так далее), используя прием встраивания/композиции без создания подкласса; новые кнопки добавляются после всего фрейма CalGui, из-за особенностей операции компоновки;

############################################################################

from tkinter import *

from calculator import CalcGui, getCalcArgs

from PP4E.Gui.Tools.widgets import frame, button, label

class CalcGuiPlus(Toplevel):

def __init__(self, **args):

Toplevel.__init__(self) label(self, TOP, ‘PyCalc Plus Container’) self.calc = CalcGui(self, **args) frm = frame(self, BOTTOM) extras = [(‘sqrt’, ‘sqrt(%s)’), (‘x~2 ‘, ‘(%s)**2’), (‘x"3 ‘, ‘(%s)**3’), (‘1/x ‘, ‘1.0/(%s)’)] for (lab, expr) in extras:

button(frm, LEFT, lab, (lambda expr=expr: self.onExtra(expr))) button(frm, LEFT, ‘ pi ‘, self.onPi)

def onExtra(self, expr): text = self.calc.text eval = self.calc.eval try:

text.set(eval.runstring(expr % text.get())) except:

text.set(‘ERROR’)

def onPi(self):

self.calc.text.set(self.calc.eval.runstring(‘pi’))

if __name__ == ‘__main__’:

root = Tk()

button(root, TOP, ‘Quit’, root.quit)

подпись: # -bg,-fg в calcguiCalcGuiPlus(**getCalcArgs()).mainloop()

Поскольку PyCalc реализован как класс Python, аналогичного эффекта всегда можно добиться, расширив PyCalc в новом подклассе, вместо его встраивания, как показано в примере 19.23.

Пример 19.23. PP4E\Lang\Calculator\calculator_ plus_ext.py

############################################################################ усовершенствование, добавляющее дополнительный ряд кнопок, выполняющих типичные операции; более практичное усовершенствование: добавляет кнопки для дополнительных операций (sqrt, 1/x и так далее) в подклассе путем наследования оригинального класса, а не встраивания; новые кнопки отображаются перед фреймом, присоединенным к низу класса calcgui;

############################################################################

from tkinter import *

from calculator import CalcGui, getCalcArgs

from PP4E.Gui.Tools.widgets import label, frame, button

class CalcGuiPlus(CalcGui):

def makeWidgets(self, *args):

label(self, TOP, ‘PyCalc Plus Subclass’) CalcGui.makeWidgets(self, *args) frm = frame(self, BOTTOM) extras = [(‘sqrt’, ‘sqrt(%s)’), (‘x~2 ‘, ‘(%s)**2’), (‘x"3 ‘, ‘(%s)**3’), (‘1/x ‘, ‘1.0/(%s)’)] for (lab, expr) in extras:

button(frm, LEFT, lab, (lambda expr=expr: self.onExtra(expr))) button(frm, LEFT, ‘ pi ‘, self.onPi)

def onExtra(self, expr): try:

self.text.set(self.eval.runstring(expr % self.text.get())) except:

self.text.set(‘ERROR’)

def onPi(self):

self.text.set(self.eval.runstring(‘pi’))

if __name__ == ‘__main__’:

CalcGuiPlus(**getCalcArgs()).mainloop() # передает -bg, -fg

Обратите внимание, что функции обратного вызова этих кнопок принудительно используют вещественное деление при обращении величин, потому что так действует оператор / в Python 3.X (оператор //, выполняющий деление целых чисел, отсекает остатки). Кнопки также заключают значения поля ввода в скобки, чтобы обойти проблемы старшинства операций. Вместо этого можно было бы преобразовывать текст поля ввода в число и выполнять операции с действительными числами, но Python автоматически проделывает всю работу, когда строки выражений выполняются в необработанном виде.

Отметьте также, что добавляемые в этом сценарии кнопки выполняют операции над текущим значением поля ввода непосредственно. Это не совсем то же самое, что операторы выражений, применяемые со стековым механизмом вычислений (чтобы сделать их настоящими операторами, нужны дополнительные переделки). Тем не менее эти кнопки подтверждают то, что должны продемонстрировать эти сценарии. — они используют PyCalc как компонент, как снаружи, так и изнутри.

Наконец, для тестирования расширенных классов калькулятора и параметров настройки PyCalc в примере 19.24 представлен сценарий, который отображает четыре отдельных окна калькулятора (этот сценарий запускается программой PyDemos).

Пример 19.24. PP4E\Lang\Calculator\calculator_plusplus.py

#!/usr/local/bin/python

демонстрация всех 3 разновидностей калькулятора

каждая из них является отдельным объектом калькулятора и окном

from tkinter import Tk, Button, Toplevel import calculator, calculator_plus_ext, calculator_plus_emb

root=Tk()

calculator.CalcGui(Toplevel())

calculator.CalcGui(Toplevel(), fg=’white’, bg=’purple’) calculator_plus_ext.CalcGuiPlus(Toplevel(), fg=’gold’, bg=’black’) calculator_plus_emb.CalcGuiPlus(fg=’black’, bg=’red’) Button(root, text=’Quit Calcs’, command=root.quit).pack() root.mainloop()

На рис. 19.8 изображен результат — четыре независимых калькулятора в окнах верхнего уровня, открытых одним и тем же процессом. Два окна справа представляют специализированное повторное использование PyCalc как компонента и диалог справки справа внизу. Хотя в данной книге это может быть не видно, во всех четырех используются разные цветовые схемы — классы калькулятора принимают параметры настройки цвета и шрифта и при необходимости передают их по цепочке вызовов.

Как мы узнали ранее, эти калькуляторы могут также выполняться в виде независимых процессов и запускаться с помощью модуля launchmodes, с которым мы познакомились в главе 5. В действительности панели запуска PyGadgets и PyDemos так и запускают калькуляторы, поэтому дополнительные подробности смотрите в их программном коде. И, как обычно, читайте программный код и экспериментируйте с ним самостоятельно, чтобы получить более полное представление о том, как он действует. В конце концов — это Python.

Эта глава завершает обсуждение темы синтаксического анализа в этой книге. Следующая и последняя техническая глава познакомит нас с приемами интеграции Python с программами, написанными на компилируемых языках программирования, таких как C и C++. Далеко не всем требуется знать, как реализуется такая интеграция, поэтому некоторые читатели могут пропустить ее и перейти к заключительной главе 21. Однако, так как большинство программистов на Python используют библиотеки C, обернутые в модули Python (даже если такое обертывание они выполняют не сами), я рекомендую бегло просмотреть следующую главу, прежде чем вы отложите эту книгу.


PyCalc Plus — Container

 

PyCalc 3.0+

A Python/tkinter calculator

Programming Python 4E

May, 2010

(3.0 2005, 2.01999,1.0 1996)

 

Use mouse or keyboard to

 


3.1415Э26535Э

 


Рис. 19.8. Сценарий calculator_plusplus: расширение, встраивание и настройка!

 


Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011
Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий