Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы работы в Python. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
791 Кб
Скачать

Заливка фигур заданным цветом выполняется инструкцией:

fillcolor(Z) #Z - цвет заливки фигуры begin_fill()

Инструкции построения объекта;

Инструкции построения объекта;

. . .

end_fill()

Можно одновременно задать цвет линий и заполнения инструкцией color(Z1,Z2). Например, построить шестиугольник с заполнением цветом silver (оттенок серого) и зеленым контуром можно с помощью

следующей программы:

color('green', 'silver') width(5)

begin_fill() while True:

forward(100)

left(60)

if abs(pos()) < 5: break end_fill()

Спираль золотого сечения. Прямоугольник с отношением сторон равным числу Φ =1.6180339887… соответствует так называемой «золотой пропорции» (Φ(Φ−1)=1). Если выделить в этом прямоугольнике квадрат, то оставшийся прямоугольник тоже будет иметь отношение сторон равное Φ, и так до бесконечности. Если вписать в каждый квадрат «четвертинки окружности», то получится «спираль золотого сечения» (по Дюреру) – (см. рис 6.3(а))

а)

б)

 

Рис. 6.3. а) принцип построения «спирали золотого сечения» б) результат работы программы

Используя принцип рисования окружности в turtle, эту построение (см. рис 6.3(б)) можно реализовать очень простым алгоритмом:

31

seth(-90); r=100

while r>3: circle(r,90); r=r/1.6180339887

Здесь r – радиус «четвертинок» окружности.

В рамках модуля turtle легко строить графики и траектории.

Например, фигуру Лиссажу (1:2), изображенную на рис. 6.4, можно

построить с помощью следующего кода:

from turtle import *

 

from math import *

 

pensize(2)

 

t=pi/2

 

while t<2.5*pi:

 

t=t+0.1

 

x=100*cos(t)

 

y=100*sin(2*t)

 

goto(x,y);

Рис. 6.4 Результат построения

dot(10,'green')

 

С помощью нижеследующего рекурсивного алгоритма можно прстроить «фрактальное дерево» (см. рис 6.5).

def Tree_draw(L):

if L < 15: return forward(L) right(F)

Tree_draw(L*0.65) left(2*F)

Tree_draw(L*0.65) right(F) backward(L)

F=36; left(90);

Tree_draw(100)

Рис. 6.5 Результат работы программы

– фрактальное дерево

В turtle также присутствуют методы для обработки событий окна, то есть связывают действия пользователя с определенными функциями (обработчиками событий). К ним относятся методы типа listen(), onclick(), exitonclick() и т.д. Метод ontimer(fun, t) вызывает функцию fun через t миллисекунд. Про-

верьте, что команда onscreenclick(goto) смещает перо в точку «клика».

32

7. Задания для компьютерного практикума

Работа № 1. Основные алгоритмические конструкции

1.Реализовать все рассмотренные в разделах 1 – 3 примеры в виде

работающих программ.

2.Вывести на экран целую часть и остаток от деления одного числа

на другое для разных типов чисел.

3.По вводимому числу x вычислять функцию «знак числа» sign(x), то

есть +1 при x>0; 0 при x=0; −1 при x<0.

4.Создать программу решения квадратного уравнения. Параметры

вводить с экрана. Учесть, что корни могут быть комплексными.

5.Создать программу вычисления факториала вводимого числа с по-

мощью цикла. Если при вводе числа это число не целое неотрица-

тельное – печатать «Ошибка».

6.Проверить формулу 12+22+…+n2 = (n /6)(n+1)(2n+1). Вводить число n, выводить n, сумму квадратов и значение правой части формулы.

7.Проверить, что сумма N первых нечетных чисел равна N2.

8.Табулировать функцию xx на интервале [0, 2] с шагом0.1.

9.Проверить, что отношение чисел Фибоначчи F(N+1)/F(N) стремится к «золотому числу» Ф =1.618… при N → ∞ (стр. 13, 14).

10.Используя цикл for, вставить между буквами в слове University

символ «-», то есть получить слово U-n-i-v-e-r-s-i-t-y.

Работа № 2. Типы данных. Подпрограммы.

1.Реализовать все рассмотренные в разделах 4 и 5 примеры в виде работающих программ.

2.Создать функцию len_1( ), выполняющую те же действия, что и

встроенная функция len(…) В функции len_1( ) использовать кон-

струкцию for X in <object>.

3.Используя программу для функции len_1( )создать функцию,

возвращающую длину последовательности элементов, а также тип элемента с заданным номером.

4.Создать программу для вычисления определителя матрицы 3 на 3. Элементы матрицы вводить с экрана по три в каждой строке.

5.Создать двумерную матрицу M, индексы элементов которой – комбинации XX, XY, XZ и т. д. (например M['X', 'Y']). Значения элемен-

тов матрицы – произведения Ord(N1)*Ord(N2), где N1, N2 – индексы по строке и столбцу соответственно.

6.Для одномерного массива чисел найти сумму всех элементов, максимум, минимум, среднее значение и медиану.

33

7. Создать программу, демонстрирующую работу всех функций

ипроцедур обработки строк.

8.Подсчитать количество появлений некоторого символа в строке

иуказать, под какими номерами он появляется.

9.Для строки из набора слов, разделенных пробелами, окружить каж-

дое слово кавычками.

10.Дана строка, содержащая слова и цифры. Заменить все цифры их

названиями («один», «два», и т.д.)

Работа № 3. Подпрограммы. Модули math, random и Turtle

1.Реализовать все рассмотренные в разделе 5, 6 примеры в виде рабо-

тающих программ.

2.Создать функцию для рисования фигур Лиссажу с заданным отно-

шением частот n /m. Параметрами функции являются n и m.

3.Создать подпрограмму получения двоичного кода целого числа

и вывести таблицу перевода для N первых чисел.

4.Построить набор траекторий тела, брошенного под углом к горизонту при нескольких углах бросания (с шагом 10 градусов).

5.Используя подпрограмму рисования простой фигуры «нарисовать» решетку из таких фигур (треугольную, соты и т.д.).

6.Создать программу, рисующую фрактальное дерево с тремя ветками из каждой развилки (использовать программу на стр. 32).

7.Построить кардиоиду r =A(1–cos φ) в полярных координатах.

8.Построить аналог броуновского движения: каждый новый шаг совершается под случайным углом к текущему направлению. Напри-

мер: f=randint(–180,180); left(f); forward(100).

9.Построить траекторию случайных блужданий по алгоритму: x(N+1)=x(N)+∆x, y(N+1)=y(N)+∆y, где ∆x, ∆y – независимые слу-

чайные числа, N – номер шага.

10.Построить набор траекторий случайных блужданий, стартующих

из одной и той же точки. При этом построение одной траектории оформить как подпрограмму.

34

8. Модуль Tkinter. Графический интерфейс пользователя

Tkinter (т.е. tk interface) – это графическая библиотека на основе

Tk, которая установлена в Python в качестве стандартного модуля

(входит в стандартную библиотеку). Tk (от англ. Toolkit) означает

«набор инструментов». Tkinter позволяет создавать оконный интер-

фейс для событийно-управляемого программирования, а также обла-

дает и другими возможностями. В Tkinter присутствует стандартный

набор графических элементов – виджетов (widgets), например: кнопки,

поля ввода и вывода и т.д.

В данном разделе кратко перечислены основные элементы этой

библиотеки, необходимые для выполнения заданий. Сначала следует

импортировать Tkinter и создать окно, в котором, в дальнейшем, будут

отображаться результаты работы программы. Например, создадим окно window_1, в котором также зададим его название:

from tkinter import *

window_1 = Tk() # создаем окно window_1 window_1.title("Python: простое окно") # название window_1.mainloop() #Обработка команд начинается именно

с этой точки

Результат программы будет выглядеть как на рис.2.1 слева:

Рис 2.1. Простое окно (слева) и дополнительное окно типа messagebox (справа). Явный вид окон зависит от платформы, на которой установлен Python. Цвет фона можно задать инструкцией window_1.configure(background='цвет')

Обратите внимание: последняя строка вызывает функцию mainloop(). Эта функция создает бесконечный цикл вывода окна,

поэтому окно будет ждать любого взаимодействия с пользователем,

35

пока не будет закрыто. Если вы забудете вызвать функцию mainloop() – ничего не отобразится!

Для отладки программы удобно использовать всплывающие окна messagebox (окно сообщения), внутри которых располагаются различные краткие сообщения и текущие параметры вычислений. Это

можно сделать с помощью метода showinfo(): from tkinter import *

win = Tk()

win.title("Python: пример всплывающего окна") win.geometry("250x150+350+250") # параметры окна

#"Ширина x Высота + координата_X + координата_Y" messagebox.showinfo('Заголовок', 'Текст') win.mainloop()

Здесь добавлена инструкция, определяющая размеры и положение ок-

на. На рис.2.1 справа – результат запуска программы.

Виджеты. Элементы управления. События

Виджет (widget = «window gadget») – это вспомогательный графи-

ческий элемент, имеющий стандартный внешний вид и выполняющий

стандартные действия. Виджеты позволяют вводить данные и управ-

лять работой программ средствами событийно-управляемого програм-

мирования. Формат инструкций при написании кодов для вызова ви-

джетов основан на правилах объектно-ориентированного программи-

рования. Виджет – это объект, который создается конструктором. Стандартный конструктор для создания виджета в окне win имеет вид:

name = WID_TYPE(win, параметры виджета).

Здесь WID_TYPE – указатель на тип (класс) виджета: надпись, кнопка и т.д. Переменная name (любой идентификатор) вводится для обозначения созданного виджета. Она используется для ссылки на созданный объект. При активации виджета (например, нажатии кнопки) может выполняться какая-то команда, для этого существует опция command:

name= WID_TYPE(win, параметры, command=<действие>)

Применение метода к объекту-виджету name имеет стандартный вид: name.Метод(параметры),

Например, команда name.destroy() уничтожит виджет name.

36

Кнопка (Button) – базовый управляющий элемент многих приложений. Логику написания кода для этого элемента проще всего понять в рамках набора стандартных примеров.

Пример 1. Кнопка, закрывающая окно:

win_1= Tk() # создаем окно win_1 quit_Bt = Button(win_1, text="закрыть",

command= win_1.destroy) quit_Bt.place(x=20,y=30) # размещаем кнопку в окне win_1.mainloop()

В этом примере командой Button создается объект: кнопка с именем quit_Bt. Здесь набор параметров команды Button минимальный:

имя окна (win_1), где появится кнопка, текст на кнопке и действие, выполняемое при нажатии (command=). В данном случае это дей-

ствие – закрытие (уничтожение) окна win_1. Команда place(…,

)в данном случае является обязательной, иначе кнопка не появится. Количество параметров, управляющих форматом кнопки доста-

точно велико, например, инструкция

Button(win_1, text="Quit", fg="red", bg="green", padx=5,pady=5, height=2, font='arial 14', command=win_1.destroy)

создаст кнопку заданного размера, с текстом arial красного цвета 14 размера на зеленом фоне, и заданными отступами текста.

Опция command используется для запуска некоторого исполняемого кода как отклика на действие пользователя (например, нажатие кнопки). Она доступна для следующих виджетов: Button, Checkbutton, Radiobutton, Spinbox, Scrollbar, Scale. Программирование, ориентиро-

ванное на действия пользователя в рамках заданного интерфейса, называется событийно-управляемым. Заданный код, который при этом выполняется, называется обработчиком события.

Пример 2. Подсчет числа нажатий на кнопке: from tkinter import *

N = 0

def bt_1():

#обработчик события

global N

# N - глобальная переменная (!!!)

N+= 1

# к числу нажатий прибавляем 1

print("Число нажатий на кнопку =",N) root = Tk() root.geometry("200x50+500+200")

btn = Button(root, text="нажать", command=bt_1)

37

btn.pack(side=LEFT)

#размещает кнопку в окне

root.mainloop()

 

Данная программа для каждого нажатия кнопки запускает обработчик этого события, которым является функция bt_1(), и к глобаль-

ной переменной N прибавляется 1. Результат будет напечатан в окне вывода интерактивного режима. Чтобы кнопка появилась в окне root, здесь использован метод pack(), как альтернатива методу place(). Подробнее о pack() и place()– в следующем пункте.

Элемент Label. Расположение виджетов в окне. Label – это ви-

джет, предназначенный для создания простой надписи. Имеет те же

свойства, что и перечисленные свойства кнопки. Формат команды, создающей надпись для размещения в окне window_1, имеет вид:

my_text = Label(window_1, height=2,bg='silver', fg='red', font='arial 14', text="Пример

с переносом текста \n на следующую строку")

Расположение элемента (виджета) внутри окна определяется

«упаковщиками» или командами расположения. Для каждого элемента обязательно вызывается свой метод упаковщика, иначе он не будет отображён. Всего упаковщиков три: pack(), place() и grid().

Метод pack() автоматически размещает виджеты в родитель-

ском окне. Имеет параметры side, fill, expand. Параметр side (сторона)

принимает одно из четырех значений-констант tkinter – TOP,

BOTTOM, LEFT, RIGHT (по умолчанию TOP). По умолчанию expand

(расширение) равен 0 (другое значение – 1), а fill (заполнение) – NONE

(другие значения BOTH, X, Y).

Метод place() позволяет размещать виджеты в указанных ко-

ординатах с указанными размерами. Основные параметры: x, y, width, height,relx, rely, anchor. Отсчет идет от левого верхнего угла окна.

Метод grid() размещает виджеты на матричной сетке, которая

спроецирована на окно. Количество рядов и столбцов матрицы определяется размером окна и размером размещаемого элемента (см. при-

мер ниже). Основные параметры: row/column – строка/столбец в сетке, rowspan/columnspan – сколько ячеек в строке/столбце надо слить, sticky ("n", "s", "e", "w") – к какой границе "приклеивать" виджет. padx / pady и ipadx / ipady – размеры внешних и внутренних границ.

Пример 3. Рассмотрим фрагмент кода для окна с именем win: win.geometry('200x150')

for i in range(1,6):

Z = Label(win, text=str(i), bg='white', font='arial 12')

38

Z.grid(column=i-1, row=i-1)

# упаковщик

Результат выполнения кода соответствует рисунку 2.2 (а)

а)

б)

в)

Рис. 2.2. Расположение элементов: а) результат для кода выше, б) если в примере 3 заменить text=str(i)на text=str(100*i), в) если в примере 3 заме-

нить строку упаковщика на Z.place(x=10+25*i, y=100-10*(i-3)**2)

Метод configure (config). При необходимости, используя этот ме-

тод, можно изменять конфигурацию (параметры) уже существующего

виджета во время исполнения программы, записав инструкцию: widget.configure(параметр=значение,… … …)

Другой способ – квадратные скобки, в которых стоит название изме-

няемого параметра: widget[ 'option' ] = new_value.

Рассмотрим снова Пример 2. Добавим после инструкции создания кнопки btn строчки, создающие объект LLL типа «надпись» (Label):

LLL =Label(root, text=' Число нажатий= ') LLL.pack(side=LEFT )

Также в функции bt_1() заменим строчку print(…) на строчку

LLL.config(text="Число нажатий="+str(N), bg='white').

Тогда число нажатий будет печататься прямо на окне (см. рис. 2.3).

Рис. 2.3. Слева – окно до нажатия кнопки, справа – после. Можно также изменять запись, вставив в bt_1 строку LLL['text']="Число нажатий="+str(N)

Entry – поле ввода-вывода. Это виджет, позволяющий пользователю ввести или вывести одну строку текста в это поле . Команда X=Entry(win, <параметры>) создает объект – поле вода с именем X. Большинство параметров имеют стандартный вид и смысл, а расположение виджета определяется упаковщиками.

Основные методы для текстового поля Entry:

1.get(): возвращает введенный в текстовое поле текст

2.insert(index, ttt): вставляет строку ttt, по индексу

39

3. delete(first, last=…): удаляет символ по индексу first. до

индекса last. (Запись last=END означает – удалить до конца) Например, записанные ниже строки кода создадут окно на рис. 2.4

win = Tk() txt=Entry(win,width=6,font='12')

txt.pack(expand=1)

#

по центру

txt.insert(1,"Привет")

 

Рис. 2.4. Виджет Entry

Конструкция txt.get() возвращает текст из этого текстового поля.

Добавив строку x=txt.get(); print(x+'-'+x), получим:

Привет-Привет.

Специальный параметр textvariable данного виджета уста-

навливает привязку к так называемой переменной состояния. Для этих

целей предусмотрены специальные классы-переменные пакета tkinter –

BooleanVar, IntVar, DoubleVar, StringVar. Первый класс соответствует

значениям 0 или 1 и True или False, второй – целым числам, третий –

вещественным, последний – строкам. Метод set(…) устанавливает зна-

чение переменной состояния, а get() – возвращает. Использование параметр textvariable позволяет другим способом ввести начальное значение. Рассмотрим фрагмент кода

ttt = IntVar()

 

 

ttt.set(123)

 

Z = Entry(win,textvariable=ttt

 

Z['font']='12'

 

Z.place(anchor="nw", width=100,

 

height=25)

Рис. 2.5. Виджет Entry с па-

print(Z.get())

раметром textvariable

print(ttt.get())

 

В результате будет два раза напечатано число 123.

Значения переменных состояния, кроме метода set(), можно уста-

навливать непосредственно в их конструкторе, например: ttt = IntVar(win,value = 123)

Виджет Entry используется, прежде всего, для передачи данных в программу. Вариант применения этого виджета иллюстрируется далее в примере 4.

Radiobutton – «радиокнопка». Радиокнопки – это группа зависимых переключателей, позволяющих делать только один выбор из набора вариантов или значений. Они имеют вид «кружочков», куда

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]