Методическая разработка урока
Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python
Уровень: Программирование для начинающих
Библиотека Tkinter содержит специальные классы, объекты которых выполняют роль переменных для хранения значений о состоянии различных виджет. Изменение значения такой переменной ведет к изменению и свойства виджета, и наоборот: изменение свойства виджета изменяет значение ассоциированной переменной.
Существует несколько таких классов Tkinter, предназначенных для обработки данных разных типов.
- StringVar() - для строк;
- IntVar() - целых чисел;
- DoubleVar() - дробных чисел;
- BooleanVar() - для обработки булевых значений (true и false).
Пример 1.
Во втором уроке мы уже использовали переменную-объект типа IntVar() при создании группы радиокнопок:
var=IntVar()
var.set(1)
rad0 = Radiobutton(root,text="Первая",variable=var,value=0)
rad1 = Radiobutton(root,text="Вторая",variable=var,value=1)
rad2 = Radiobutton(root,text="Третья",variable=var,value=2)
Здесь создается объект класса IntVar и связывается с переменной var. С помощью метода set устанавливается начальное значение, равное 1. Три радиокнопки относятся к одной группе: об этом свидетельствует одинаковое значение опции (свойства) variable. Variable предназначена для связывания переменной Tkinter с радиокнопкой. Опция value определяет значение, которое будет передано переменной, если данная кнопка будет в состоянии "включено". Если в процессе выполнения скрипта значение переменной var будет изменено, то это отразится на группе кнопок. Например, это делается во второй строчке кода: включена кнопка rad1.
Если метод set позволяет устанавливать значения переменных, то метод get, наоборот, позволяет получать (узнавать) значения для последующего их использования.
def display(event):
v = var.get()
if v == 0:
print ("Включена первая кнопка")
elif v == 1:
print ("Включена вторая кнопка")
elif v == 2:
print ("Включена третья кнопка")
but = Button(root,text="Получить значение")
but.bind('<Button-1>',display)
При вызове функции display в переменную v “записывается“ значение, связанное в текущий момент с переменной var. Чтобы получить значение переменной var, используется метод get (вторая строчка кода).
Пример 2.
Несколько сложнее обстоит дело с флажками. Поскольку состояния флажков независимы друг друга, то для каждого должна быть введена собственная ассоциированная переменная-объект.
from tkinter import *
root = Tk()
var0=StringVar() # значение каждого флажка ...
var1=StringVar() # ... хранится в собственной переменной
var2=StringVar()
# если флажок установлен, то в ассоциированную переменную ...
# ...(var0,var1 или var2) заносится значение onvalue, ...
# ...если флажок снят, то - offvalue.
ch0 = Checkbutton(root,text="Окружность",variable=var0,
onvalue="circle",offvalue="-")
ch1 = Checkbutton(root,text="Квадрат",variable=var1,
onvalue="square",offvalue="-")
ch2 = Checkbutton(root,text="Треугольник",variable=var2,
onvalue="triangle",offvalue="-")
lis = Listbox(root,height=3)
def result(event):
v0 = var0.get()
v1 = var1.get()
v2 = var2.get()
l = [v0,v1,v2] # значения переменных заносятся в список
lis.delete(0,2) # предыдущее содержимое удаляется из Listbox
for v in l: # содержимое списка l последовательно ...
lis.insert(END,v) # ...вставляется в Listbox
but = Button(root,text="Получить значения")
but.bind('<Button-1>',result)
ch0.deselect()# "по умолчанию" флажки сняты
ch1.deselect()
ch2.deselect()
ch0.pack()
ch1.pack()
ch2.pack()
but.pack()
lis.pack()
root.mainloop()
Пример 3.
Помимо свойства (опции) variable, связывающей виджет с переменной-объектом Tkinter (IntVar, StringVar и др.), у многих виджет существует опция textvariable, которая определяет текст-содержимое или текст-надпись виджета. Несмотря на то, что «текстовое свойство» может быть установлено для виджета и изменено в процессе выполнения кода без использования ассоциированных переменных, иногда такой способ изменения оказывается более удобным.
from tkinter import *
root = Tk()
v = StringVar()
ent1 = Entry (root, textvariable = v,bg="black",fg="white")
ent2 = Entry(root, textvariable = v)
ent1.pack()
ent2.pack()
root.mainloop()
Здесь содержимое одного текстового поля немедленно, отображается в другом, т.к. оба поля привязаны к одной и той же переменной v.
практическая работа
- Напишите скрипт, как в примере с флажками; в отличии от примера значения ассоциированных переменных должны отображаться в метке (Label) через запятую.
- Напишите программу, в которой пользователь может определить цвет рамки (Frame) c помощью шкалы (Scale).
Напишите пожалуйста решение!
Напишите пожалуйста решение!
примерное решение второго задания
Первое задание
Надо поменять список для вывода на метку или текстовую строку
думаю так будет поинтереснее
думаю так будет поинтереснее и не отходим от основного задания =)