Развлечения с кнопками и картинками

razvlecheniya s knopkami i kartinkami Экскурсия по tkinter, часть 1

Я хотел представить для этого раздела демонстрационный пример работы с графикой, который был бы одновременно забавным и полезным. Но ограничился забавностью. Сценарий в примере 8.40 отображает кнопку, которая случайным образом меняет свою картинку при каждом нажатии.

Пример 8.40. PP4E\Gui\Tour\buttonpics-func.py

from tkinter import * # импортировать базовый набор виджетов,

from glob import glob # чтобы получить список файлов по расширению

import demoCheck # прикрепить демонстрационный пример с флажками

import random # выбрать случайную картинку

gifdir = ‘../gifs/’ # каталог по умолчанию с GIF-файлами

def draw():

name, photo = random.choice(images)

lbl.config(text=name)

pix.config(image=photo)

root=Tk()

lbl = Label(root, text=”none”, bg=’blue’, fg=’red’)

pix = Button(root, text=”Press me”, command=draw, bg=’white’) lbl.pack(fill=BOTH) pix.pack(pady=10) demoCheck.Demo(root, relief=SUNKEN, bd=2).pack(fill=BOTH)

files = glob(gifdir + “*.gif”) # имеющиеся GIFфайлы

images = [(x, PhotoImage(file=x)) for x in files] # загрузить и сохранить print(files) root.mainloop()

В этом примере используются несколько встроенных инструментов из библиотеки Python:

     Модуль glob, с которым мы впервые встретились в главе 4, позволяет получить список всех файлов с расширением .gif в каталоге — иными словами, всех GIF-файлов, которые там хранятся.

     Модуль random используется для выбора случайного GIF-файла из числа имеющихся в каталоге: функция random.choice случайным образом выбирает и возвращает элемент из списка.

     Чтобы изменить отображаемое изображение (и имя GIF-файла в метке в верхней части окна), сценарий просто вызывает метод config виджета с новыми значениями параметров — такое изменение динамически изменяет вид графического элемента.

Для разнообразия этот сценарий также прикрепляет экземпляр демонстрационной панели флажков demoCheck, который, в свою очередь, прикрепляет экземпляр кнопки Quitter, написанной нами ранее в примере 8.7. Конечно, это искусственный пример, но он еще раз демонстрирует мощь классов компонентов.

Обратите внимание, что все изображения, создаваемые в этом сценарии, сохраняются в списке images. В данном случае генератор списков применяет вызов конструктора PhotoImage к каждому файлу .gif в каталоге с картинками и возвращает список кортежей (filename, imageobject), ссылка на который сохраняется в глобальной переменной (то же самое можно реализовать с помощью функции map, использующей lambda-функцию с одним аргументом). Напомню, что это убережет объекты изображений от утилизации сборщиком мусора в течение всего времени выполнения программы. На рис. 8.40 изображено окно этого сценария в Windows.

В этой черно-белой книге можно не заметить, что имя GIF-файла выводится красным по голубому фону метки в верхней части окна. Окно этой программы автоматически расширяется или сжимается, когда выводятся большие или меньшие GIF-файлы. На рис. 8.41 показано изображение, случайно выбранное из каталога графических файлов, имеющее большую высоту.

Рис. 8.40. Сценарий buttonpics в действии

 

 

Рис. 8.41. Сценарий buttonpics, отображающий более высокую картинку

И наконец, на рис. 8.42 изображен графический интерфейс этого сценария, отображающий одну из более широких картинок в GIF-файле, выбранную совершенно случайно из каталога с картинками.[XXXVII]

Рис. 8.42. Сценарий buttonpics обретает политический подтекст

 

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

Пример 8.41. PP4E\Gui\Tour\buttonpics.py

from tkinter import * # импортировать базовый набор виджетов, from glob import glob # чтобы получить список файлов по расширению import demoCheck # прикрепить демонстрационный пример с флажками import random # выбрать случайную картинку

gifdir = ‘../gifs/’ # каталог по умолчанию с GIF-файлами

class ButtonPicsDemo(Frame):

def __init__(self, gifdir=gifdir, parent=None):

Frame.__init__(self, parent)

self.pack()

self.lbl = Label(self, text=”none”, bg=’blue’, fg=’red’)

self.pix = Button(self, text=”Press me”, command=self.draw, bg=’white’) self.lbl.pack(fill=BOTH)

self.pix.pack(pady=10)

demoCheck.Demo(self, relief=SUNKEN, bd=2).pack(fill=BOTH) files = glob(gifdir + “*.gif”)

self.images = [(x, PhotoImage(file=x)) for x in files] print(files)

def draw(self):

name, photo = random.choice(self.images)

self.lbl.config(text=name)

self.pix.config(image=photo)

if __name__ == ‘__main__’: ButtonPicsDemo().mainloop()

Эта версия действует точно так же, как и оригинал, но теперь ее можно прикрепить к любому другому графическому интерфейсу, в который вы пожелаете включить такую дурацкую кнопку.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

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