Шаблон «Модель —Вид —Контроллер» на примере модуля tkinter
Особенностью шаблона MVC является то, что в случае изменения контроллером данных (как это было в предыдущем примере с изменением переменной var) «посылается сигнал» виду с просьбой обновить отображаемое содержимое (перерисовать окно), отсюда возникает обновление текста в режиме реального времени. Следующий пример демонстрирует возможности обработки событий при нажатии на кнопку (виджет Button… Читать ещё >
Шаблон «Модель —Вид —Контроллер» на примере модуля tkinter (реферат, курсовая, диплом, контрольная)
Следующий пример показывает, каким образом использовать виджет (Entry) для ввода данных:
# mytk6. py import tkinter window = tkinter. Tk ().
frame = tkinter. Frame (window) frame. pack ().
var = tkinter. StringVar ().
# Обновление содержимого переменной в момент ввода текста label = tkinter. Label (frame, textvariable=var).
label.pack ().
# Пробуем набрать текст в появившемся поле для ввода entry = tkinter. Entry (frame, textvariable=var) entry. pack ().
window.mainloop ().
Запустим программу и внутри текстового окна попробуем набрать произвольный текст (рис. 4.51).
Рис. 4.51. Виджет для ввода данных
Видим, что текст, который мы набираем, сразу отображается в окне. Дело в том, что виджеты Label и Entry используют для вывода и ввода текста одну и ту же переменную data класса StringVar. Подобная схема работы оконного приложения укладывается в универсальный шаблон (паттерн) MVC. В общем виде под моделью (Model) понимают способ хранения данных (например, в переменной какого класса). Вид (View) служит для отображения данных. Контроллер (Controller) отвечает за обработку данных (рис. 4.52).
Рис. 4.52. Схема шаблона МУС
Особенностью шаблона MVC является то, что в случае изменения контроллером данных (как это было в предыдущем примере с изменением переменной var) «посылается сигнал» виду с просьбой обновить отображаемое содержимое (перерисовать окно), отсюда возникает обновление текста в режиме реального времени. Следующий пример демонстрирует возможности обработки событий при нажатии на кнопку (виджет Button):
# mytk7. py import tkinter.
# Контроллер: функция вызывается в момент нажатия.
# на кнопку def click ():
# метод get возвращает текущее значение counter.
# метод set устанавливает новое значение counter counter. set (counter.get () + 1).
window = tkinter. Tk ().
# Модель: создаем объект класса IntVar counter = tkinter. IntVar{).
# Обнуляем созданный объект с помощью метода set counter. set (0) frame = tkinter. Frame (window) frame. pack ().
# Создаем кнопку и указываем обработчик (функция click).
# при нажатии на нее.
button = tkinter. Button{frame, text='Click', command=click) button. pack ().
# Вид: в реальном времени обновляется содержимое.
# виджета Label.
label = tkinter. Label (frame, textvariable=counter) label. pack () window. mainloop ().
Результат выполнения программы показан на рис. 4.53.
Рис. 4.53. Обработка события при нажатии на кнопку
Далее представлен более сложный пример с двумя кнопками и двумя обработчиками событий (clickup, click_down):
# mytk8. py import tkinter window = tkinter. Tk{).
# Модель:
counter = tkinter. IntVar () counter. set (0).
# Два контроллера: def click_up{):
counter.set (counter.get () + 1) def click_down ():
counter.set (counter.get () — 1).
# Вид:
frame = tkinter. Frame (window) frame. pack ().
button = tkinter. Button (frame, text='Up', command=c1ick_up) button. pack ().
button = tkinter. Button{frame, text='Down', c ommand=с1i ck_down) button. pack ().
label = tkinter. Label (frame, textvariable=counter) label. pack () window. mainloop ().
Результат работы программы показан на рис. 4.54.
Рис. 4.54. Пример с двумя кнопками и двумя обработчиками событий.