Файл: Методические указания по подготовке к практическим занятиям, в том числе в интерактивной форме, и самостоятельному изучению дисциплины для школьников 911 классов общеобразовательных средних учебных заведений.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.12.2023

Просмотров: 304

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

84
радиокнопки (переключатели)
Объект-радиокнопка никогда не используется по одному. Их используют группами, при этом в одной группе может быть «включена» лишь одна кнопка.
1. var=IntVar()
2. var.
set
(
1
)
3. rad0 = Radiobutton(root,text=
"Первая"
,
4. variable=var,value=
0
)
5. rad1 = Radiobutton(root,text=
"Вторая"
,
6. variable=var,value=
1
)
7. rad2 = Radiobutton(root,text=
"Третья"
,
8. variable=var,value=
2
)
Одна группа определяет значение одной переменной, т. е. если в примере будет выбрана радиокнопка rad2, то значение переменной будет var будет 2. Изначально также требуется установить значение переменной (выражение var.set(1) задает значение переменной var равное 1).
Флажки
Объект checkbutton предназначен для выбора не взаимоисключающих пунктов в окне (в группе можно активировать один, два или более флажков или не один). В отличие от радиокнопок, значение каждого флажка привязывается к своей переменной, значение которой определяется опциями onvalue (включено) и offvalue (выключено) в описании флажка.
1. c1 = IntVar()
2. c2 = IntVar()
3. che1 = Checkbutton(root,text=
"Первый флажок"
,
4. variable=c1,onvalue=
1
,offvalue=
0
)
5. che2 = Checkbutton(root,text=
"Второй флажок"
,
6. variable=c2,onvalue=
2
,offvalue=
0
)
Списки
Вызов класса Listbox создает объект, в котором пользователь может выбрать один или несколько пунктов в зависимости от значения опции selectmode. В примере ниже значение SINGLE позволяет выбирать лишь один пункт из списка.
1. r = [
'Linux'
,
'Python'
,
'Tk'
,
'Tkinter'
]
2. lis = Listbox(root,selectmode=SINGLE,height=4)
3.
for
i
in
r:
4. lis.insert(END,i)
Изначально список (Listbox) пуст. С помощью цикла for в него добавляются пункты из списка (тип данных) r. Добавление происходит с помощью специального метода класса Listbox — insert. Данный метод принимает два параметра: куда добавить и что добавить.
Большинство методов различных виджет мы рассмотрим по ходу изучения данного курса.
Практическая работа
Создайте два скрипта на языке программирования Python и с использованием модуля
Tkinter генерирующие шаблоны представленные ниже.__
Это будут рамка (frame), шкала (scale), полоса прокрутки (scrollbar), окно верхнего уровня (toplevel).
Frame (рамка)
Как выяснится позже, рамки (фреймы) хороший инструмент для организации остальных виджет в группы внутри окна, а также оформления.
1.
from
tkinter
import
*

85 2.
3. root = Tk()
4.
5. fra1 = Frame(root,width=
500
,height=
100
,bg=
"darkred"
)
6. fra2 = Frame(root,width=
300
,height=
200
,bg=
"green"
,bd=
20
)
7. fra3 = Frame(root,width=
500
,height=
150
,bg=
"darkblue"
)
8.
9. fra1.pack()
10. fra2.pack()
11. fra3.pack()
12.
13. root.mainloop()
Данный скрипт создает три фрейма разного размера. Свойство bd (сокращение от boderwidth) определяет расстояния от края рамки до заключенных в нее виджетов (если они есть).
На фреймах также можно размещать виджеты как на основном окне (root). Здесь текстовое поле находится на рамке fra2.
1. ent1 = Entry(fra2,width=
20
)
2. ent1.pack()
Scale (шкала)
Назначение шкалы — это предоставление пользователю выбора какого-то значения из определенного диапазона. Внешне шкала представляет собой горизонтальную или вертикальную полосу с разметкой, по которой пользователь может передвигать движок, осуществляя тем самым выбор значения.
1. sca1 = Scale(fra3,orient=HORIZONTAL,length=
300
,
2. from_=
0
,to=
100
,tickinterval=
10
,resolution=
5
)
3. sca2 = Scale(root,orient=VERTICAL,length=
400
,
4. from_=
1
,to=
2
,tickinterval=
0.1
,resolution=
0.1
)
Свойства:
orient определяет направление шкалы;
length – длина шкалы в пикселях;
from_ и to – с какого значения шкала начинается и каким заканчивается (т. е. диапазон значений);
tickinterval – интервал, через который отображаются метки для шкалы;
resolution - минимальная длина отрезка, на которую пользователь может передвинуть движок.
Scrollbar (полоса прокрутки)
Данный виджет позволяет прокручивать содержимое другого виджета (например, текстового поля или списка). Прокрутка может быть как по горизонтали, так и по вертикали.
1.
1   2   3   4   5   6   7   8   9   10

from
tkinter
import
*
2.
3. root = Tk()
4.
5. tx = Text(root,width=
40
,height=
3
,font=
'14'
)
6. scr = Scrollbar(root,command=tx.yview)
7. tx.configure(yscrollcommand=scr.
set
)
8.
9. tx.grid(row=
0
,column=
0
)
10. scr.grid(row=
0
,column=
1
)
11. root.mainloop()

86
В примере сначала создается текстовое поле (tx), затем полоса прокрутки (scr), которая привязывается с помощью опции command к полю tx по вертикальной оси (yview). Далее поле tx изменяется (конфигурируется) с помощью метода configure: устанавливается значение опции yscrollcommand.
Здесь используется незнакомый нам пока еще метод grid, представляющий собой другой способ расположения виджет на окне
Toplevel (окно верхнего уровня)
С помощью класс Toplevel создаются дочерние окна, на которых также могут располагаться виджеты. Следует отметить, что при закрытии главного окна (или родительского), окно Toplevel также закрывается. С другой стороны, закрытие дочернего окна не приводит к закрытию главного.
1. win = Toplevel(root,relief=SUNKEN,bd=
10
,bg=
"lightblue"
)
2. win.title(
"Дочернее окно"
)
3. win.minsize(width=
400
,height=
200
)
Метод title определяет заголовок окна. Метод minsize конфигурирует минимальный размер окна (есть метод maxsize, определяющий максимальный размер окна). Если значение аргументов minsize будет таким же как у maxsize, то пользователь не сможет менять размеры окна.
практическая работа
1. Создайте два скрипта на языке программирования Python и с использованием модуля
Tkinter генерирующие шаблоны представленные ниже.
2. Рассмотрим различные примеры добавления функциональности GUI.
Пример 1.
1.
def
output(event):
2. s = ent.get()
3.
if
s ==
"1"
:
4. tex.delete(
1.0
,END)
5. tex.insert(END,
"Обслуживание клиентов на втором этаже"
)
6.
elif
s ==
"2"
:
7. tex.delete(
1.0
,END)
8. tex.insert(END,
"Пластиковые карты выдают в соседнем здании"
)
9.
else
:
10. tex.delete(
1.0
,END)
11. tex.insert(END,
"Введите 1 или 2 в поле слева"
)
12.
13.
from
tkinter
import
*
14. root = Tk()
15.
16. ent = Entry(root,width=
1
)
17. but = Button(root,text=
"Вывести"
)
18. tex = Text(root,width=
20
,height=
3
,font=
"12"
,wrap=WORD)
19.
20. ent.grid(row=
0
,column=
0
,padx=
20
)
21. but.grid(row=
0
,column=
1
)
22. tex.grid(row=
0
,column=
2
,padx=
20
,pady=
10
)
23.
24. but.bind(
""
,output)
25.

87 26. root.mainloop()
Рассмотрим код, начиная с 16-й строки.
В строках 16-18 создаются три виджета: однострочное текстовое поле, кнопка и многострочное текстовое поле. В первое поле пользователь должен что-то ввести, затем нажать кнопку и получить ответ во втором поле.
В строках 20-22 используется менеджер grid для размещения виджетов. Свойства padx и pady определяют количество пикселей от виджета до края рамки (или ячейки) по осям x и y соответственно.
В стоке 24 как раз и происходит связывание кнопки с событием нажатия левой кнопки мыши и функцией output. Все эти три компонента
(виджет, событие и функция) связываются с помощью метода bind. В данном случае, при нажатии левой кнопкой мыши по кнопке but будет вызвана функция output.
Итак, если вдруг пользователь щелкнет левой кнопкой мыши по кнопке, то выполнится функция output (ни в каком другом случае она выполняться не будет). Данная функция (строки 1-11) выводит информацию во второе текстовое поле. Какую именно информацию, зависит от того, что пользователь ввел в первое текстовое поле. В качестве аргумента функции передается событие (в данном случае ).
Внутри веток if-elif-else используются методы delete и insert. Первый из них удаляет символы из текстового поля, второй — вставляет. 1.0 — обозначает первую строку, первый символ (нумерация символов начинается с нуля).
Пример 2.
1. li = [
"red"
,
"green"
]
2.
def
color(event):
3. fra.configure(bg=li[0])
4. li[0],li[1] = li[1],li[0]
5.
6.
def
outgo(event):
7. root.destroy()
8.
9.
from
tkinter
import
*
10. root = Tk()
11.
12. fra = Frame(root,width=
100
,height=
100
)
13. but = Button(root,text=
"Выход"
)
14.
15. fra.pack()
16. but.pack()
17.
18. root.bind(
""
,color
19. but.bind(
""
,outgo)
20.
21. root.mainloop()
Здесь создаются два виджета (строки 12, 13): фрейм и кнопка.
Приложение реагирует на два события: нажатие клавиши Enter в пределах главного окна
(строка 18) и нажатие левой кнопкой мыши по кнопке but (строка 19). В первом случае вызывается функция color, во втором — outgo.
Функция color изменяет цвет фона (bg) фрейма (fra) с помощью метода configure, который предназначен для изменения значения свойств виджетов в процессе выполнения скрипта. В качестве значения опции bg подставляется первый элемент списка. Затем в списке два элемента


88 меняются местами, чтобы при следующем нажатии Enter цвет фрейма снова изменился.
В функции outgo вызывается метод destroy по отношению к главному окну. Данный метод предназначен для «разрушения» виджета (окно закроется).
практическая работа
1. Создайте приложение, в котором меняется размер фрейма в зависимости от того, какая из трех объектов-кнопок была нажата.
2. Напишите скрипт, генерирующий окно с меткой и текстовым полем. После ввода пользователем текста в поле и нажатия Enter, введенный текст должен отображаться в метке. tkinter
– графический модуль, который входит в стандартный комплект Питона и позволяет программировать не только в объектном, но и в процедурном стиле
>>> import tkinter
>>> tk = tkinter.Tk()
>>> import tkinter
>>> from tkinter import *
>>> tk = Tk() http://younglinux.info/tkinter.php
- для начала http://ru.wikiversity.org/wiki/Курс_по_библиотеке_Tkinter_языка_Python
Программирование событий в Tkinter. Урок 8
МЕНЮ ТКИНТЕР
from tkinter import * # Подключаем модуль импорт
root = Tk()
# Активируем меню
mainmenu = Menu(root)
root.config(menu=mainmenu)
# Описываем вкладки первого раздела
one_menu = Menu(mainmenu, tearoff=0)
one_menu.add_command(label="Открыть...")
one_menu.add_command(label="Новый")
one_menu.add_command(label="Сохранить...")
one_menu.add_command(label="Выход")
# Описываем вкладки второго раздела
helpmenu = Menu(mainmenu, tearoff=0)
helpmenu.add_command(label="Помощь")
helpmenu.add_command(label="О программе")
# Описываем вкладки третьего раздела
treemenu = Menu(mainmenu, tearoff=0)
treemenu.add_command(label="Привет")
treemenu.add_command(label="Ответ")

89
treemenu.add_command(label="Медвед")
treemenu.add_command(label="Чао")
# Выводим меню на экран
mainmenu.add_cascade(label="Файл",
menu=one_menu)
mainmenu.add_cascade(label="Справка",
menu=helpmenu)
mainmenu.add_cascade(label="333333",
menu=treemenu)
root.mainloop()
Модуль tkinter. Создание графического интерфейса
пользователя с помощью языка программирования Python
Обычно, чтобы графическое приложение что-то сделало, должно случиться какое-нибудь событие, т. е. воздействие на GUI из вне.
Типы событий__ Способ записи
При вызове метода bind событие передается в качестве первого аргумента.
Название события заключается в кавычки, а также в знаки < и >. Событие описывается с помощью зарезервированных последовательностей ключевых слов.
События, производимые мышью
 - щелчок левой кнопкой мыши
 - щелчок средней кнопкой мыши
 - щелчок правой кнопкой мыши
 - двойной клик левой кнопкой мыши
 - движение мыши
и т. д.
Пример:
1.
from
tkinter
import
*
2.
def
b1(event):
3. root.title(
"Левая кнопка мыши"
)
4.
def
b3(event):
5. root.title(
"Правая кнопка мыши"
)
6.
def
move(event):
7. root.title(
"Движение мышью"
)
8.
9. root = Tk()
10. root.minsize(width =
500
, height=
400
)
11.
12. root.bind(
''
,b1)
13. root.bind(
''
,b3)
14. root.bind(
''
,move)
15.
16. root.mainloop()
В этой программе меняется надпись
В этой программе меняется надпись в заголовке главного окна в зависимости от того двигается мышь, щелкают левой или правой кнопкой мыши.
События, производимые с помощью клавиатуры
Буквенные клавиши можно записывать без угловых скобок (например, 'L').


90
Для неалфавитных клавиш существуют специальные зарезервированные слова
* - нажатие клавиши Enter;
* - пробел;
* и т. д.
Сочетания клавиш пишутся через тире. Например:
* - одновременное нажатие клавиш Ctrl и Shift.
1.
from
tkinter
import
*
2.
3.
def
exit_(event):
4. root.destroy()
5.
def
caption(event):
6. t = ent.get()
7. lbl.configure(text = t)
8.
9. root = Tk()
10.
11. ent = Entry(root, width =
40
)
12. lbl = Label(root, width =
80
)
13.
14. ent.pack()
15. lbl.pack()
16.
17. ent.bind(
''
,caption)
18. root.bind(
''
,exit_)
19.
20. root.mainloop()
При нажатии клавиши Enter в пределах текстовой строки (ent) вызывается функция caption, которая помещает символы из текстовой строки
(ent) в метку (lbl). Нажатие комбинации клавиш Ctrl + z приводит к закрытию главного окна.
Radiobutton и Checkbutton. Переменные Tkinter
В Tkinter от класса Radiobutton создаются радиокнопки, от класса Checkbutton – флажки.
Радиокнопки не создают по одной, а делают связанную группу, работающую по принципу переключателей. Когда включена одна, другие выключены.
Экземпляры Checkbutton также могут быть визуально оформлены в группу, но каждый флажок независим от остальных. Каждый может быть в состоянии "установлен" или "снят", независимо от состояний других флажков. Другими словами, в группе Checkbutton можно сделать множественный выбор, в группе Radiobutton – нет.
Radiobutton – радиокнопка
Если мы создадим две радиокнопки без соответствующих настроек, то обе они будут включены и выключить их будет невозможно:

91
Эти переключатели никак не связаны друг с другом. Кроме того для них не указано исходное значение, должны ли они быть в состоянии "вкл" или "выкл". По-умолчанию они включены.
Связь устанавливается через общую переменную, разные значения которой соответствуют включению разных радиокнопок группы. У всех кнопок одной группы свойство variable устанавливается в одно и то же значение – связанную с группой переменную. А свойству value присваиваются разные значения этой переменной.
В Tkinter нельзя использовать любую переменную для хранения состояний виджетов. Для этих целей предусмотрены специальные классы-переменные пакета tkinter – BooleanVar,
IntVar, DoubleVar, StringVar. Первый класс позволяет принимать своим экземплярам только булевы значения (0 или 1 и True или False), второй – целые, т

92 ретий – дробные, четвертый – строковые. r_var
=
BooleanVar() r_var.
set
(
0
) r1
=
Radiobutton(text
=
'First'
,
variable
=
r_var
,
value
=
0
) r2
=
Radiobutton(text
=
'Second'
,
variable
=
r_var
,
value
=
1
)
Здесь переменной r_var присваивается объект типа BooleanVar. С помощью метода set он устанавливается в значение 0.
При запуске программы включенной окажется первая радиокнопка, так как значение ее опции value совпадает с текущим значением переменной r_var. Если кликнуть по второй радиокнопке, то она включится, а первая выключится. При этом значение r_var станет равным 1.
В программном коде обычно требуется "снять" данные о том, какая из двух кнопок включена. Делается это с помощью метода get экземпляров переменных Tkinter.
from
tkinter
import
*
def
change():
if
var.get()
==
0
: label[
'bg'
]
=
'red'
elif
var.get()
==
1
: label[
'bg'
]
=
'green'
elif
var.get()
==
2
: label[
'bg'
]
=
'blue'
root
=
Tk() var
=
IntVar() var.
set
(
0
) red
=
Radiobutton(text
=
"Red"
,
variable
=
var
,
value
=
0
) green
=
Radiobutton(text
=
"Green"
,
variable
=
var
,
value
=
1
) blue
=
Radiobutton(text
=
"Blue"
,
variable
=
var
,
value
=
2
) button
=
Button(text
=
"Изменить"
,
command
=
change) label
=
Label(width
=
20
,
height
=
10
) red.pack() green.pack() blue.pack() button.pack() label.pack() root.mainloop()


93
В функции change в зависимости от считанного значения переменной var ход выполнения программы идет по одной из трех веток.
Мы можем избавиться от кнопки "Изменить", связав функцию change или любую другую со свойством command радиокнопок. При этом не обязательно, чтобы радиокнопки, объединенные в одну группу, вызывали одну и ту же функцию.
from
tkinter
import
*
def
red_label(): label[
'bg'
]
=
'red'
def
green_label(): label[
'bg'
]
=
'green'
def
blue_label(): label[
'bg'
]
=
'blue'
root
=
Tk() var
=
IntVar() var.
set
(
0
)
Radiobutton(text
=
"Red"
,
command
=
red_label
,
variable
=
var
,
value
=
0
).pack()
Radiobutton(text
=
"Green"
,
command
=
green_label
,
variable
=
var
,
value
=
1
).pack()
Radiobutton(text
=
"Blue"
,
command
=
blue_label
,
variable
=
var
,
value
=
2
).pack() label
=
Label(width
=
20
,
height
=
10
,
bg
=
'red'
) label.pack() root.mainloop()

94
Здесь метка будет менять цвет при клике по радиокнопкам.
Если посмотреть на пример выше, можно заметить, что код радиокнопок почти идентичный, как и код связанных с ними функций. В таких случаях более грамотно поместить однотипный код в класс.
from
tkinter
import
*
def
paint(color): label[
'bg'
]
=
color
class
RBColor:
def
__init__
(
self
,
color
,
val):
Radiobutton( text
=
color.capitalize()
,
command
=
lambda
i
=
color: paint(i)
,
variable
=
var
,
value
=
val).pack() root
=
Tk() var
=
IntVar() var.
set
(
0
)
RBColor(
'red'
,
0
)
RBColor(
'green'
,
1
)
RBColor(
'blue'
,
2
) label
=
Label(width
=
20
,
height
=
10
,
bg
=
'red'
) label.pack() root.mainloop()
В двух последних вариациях кода мы не используем метод get, чтобы получить значение переменной var. В данном случае нам это не требуется, потому что цвет метки меняется в момент клика по соответствующей радиокнопке и не находится в зависимости от значения переменной. Несмотря на это использовать переменную в настройках радиокнопок необходимо, так как она обеспечивает связывание их в единую группу и выключение одной при включении другой.
Checkbutton – флажок
Флажки не требуют установки между собой связи, поэтому может возникнуть вопрос, а нужны ли тут переменные Tkinter? Они нужны, чтобы снимать сведения о состоянии флажков. По значению связанной с Checkbutton переменной можно определить, установлен ли флажок или снят, что в свою очередь повлияет на ход выполнения программы.
У каждого флажка должна быть своя переменная Tkinter. Иначе при включении одного флажка, другой будет выключаться, так как значение общей tkinter-переменной изменится и не будет равно значению опции onvalue первого флажка.
from
tkinter
import
* root
=
Tk()
def
show(): s
=
f
'{var1.get()}, '
\ f
'{var2.get()}'