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

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

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

надо поставить отметку – «точку», это и есть выбор варианта. Радиок-

нопки создаются конструктором вида:

X=Radiobutton(window,. . ., text=”название”, variable=…, value=…, command=…)

Свойству variable (или var) присваивают имя общей переменной

состояния группы (типа BooleanVar, IntVar и т.д. ), а свойству value

присваиваются разные значения этой переменной для каждой кнопки: x=Radiobutton(variable= vvv, value=1) y=Radiobutton(variable= vvv, value=2)

Чтобы узнать, какая кнопка отмечена, можно воспользоваться методом get(), в данном случае vvv.get()вернет 1,если отмечена кнопка x и 2 – если y. Ниже приводится пример использования рассмотренных выше виджетов для программы вычисления сопротивления

пары с выбором типа соединения. Результат выводится во всплываю-

щем окне (рис. 2.6 ) Если тип соединения не выбран (ни одна радио-

кнопка не отмечена) – печатается текст "нет данных".

Пример 4. Расчет сопротивления с выбором типа соединения: from tkinter import *

def fff(): x1=float(R1.get()) x2=float(R2.get())

if v.get() == 1: R=x1*x2/(x1+x2) elif v.get() == 2: R=x1+x2

else : R="нет данных" messagebox.showinfo('',R)

win = Tk() win.geometry("250x120+350+250") v = IntVar(win,value = 0) ttt="Расчет сопротивления"

txt= Label(win, text=ttt, bg='white') txt.pack() Label(win,text="R1=").place(x=2,y=30) R1=Entry(win,width=10) R1.place(x=30, y=30) Label(win,text="R2=").place(x=2,y=55)

R2=Entry(win,width=10)

R2.place(x=30, y=55)

R1.insert(1,'10')

R2.insert(1,'20') x=Radiobutton(text="||", var=v, value=1)

41

x.place(x=150,y=30) y=Radiobutton(text="посл", var=v, value=2) y.place(x=150,y=55)

btn = Button(win, command=fff) btn['text']="Вычислить" btn.pack(side = 'bottom') win.mainloop()

Рис. 2.6. Окно приложения и результат вычислений во всплывающем окне

Text – это виджет, позволяющий ввести или вывести любое коли-

чество текста в несколько строк. Для управления переносом текста

имеет свойство wrap, если wrap=WORD, то слова переносятся цели-

ком. Типовой конструктор соответствует коду вида t1=Text(win, width=25, height=5,

font='Arial 12', wrap=WORD)

В данном случае размер текстового поля будет 25 на 10 знаков.

Методы insert, delete и get добавляют, удаляют или из-

влекают текcт. Первый аргумент - место вставки в виде 'x.y', где x –

это строка, а y – столбец. Например:

t1.insert('1.0', ”Первая строка \n вторая строка”)

t1.get('1.0', END)

# Извлечь все

t1.delete('1.0', END)

# Удалить все

Следующие строки выведут в t1 таблицу логарифмов по основанию 2. for i in range(1,11):

ttt=str(i)+' '+str(log2(i))+'\n' t1.insert(str(i)+'.1', ttt)

Checkbutton – множественный выбор. Это аналог радиокнопок, позволяющий выбрать несколько пунктов сразу из представленного набора вариантов. Выбранные пункты будут отмечены символом

«птичка». Конструктор с минимальным набором опций имеет вид: ch1=Checkbutton(win, text='Пункт_1', var=V1,

command=fff)

42

Здесь win – родительский виджет; text - отображаемый текст; var (variable) – переменная состояния, например: V1 = BooleanVar(); V1.set(True), command – действие при установке или снятии «птички».

onvalue/offvalue – значение задаваемое переменной в включеном/выключеном состоянии; отменяет начальные значения var

С помощью методов select() и deselect() флажков «птичка» можно

их программно включать и выключать. То же самое относится к радио-

кнопкам.

Элементы графики: холст и базовые фигуры

Для того, чтобы использовать графику в окне tkinter, необходимо

создать поле для рисования – холст (Canvas). Внутри холста можно со-

здавать рисунки из графических элементов: линий, окружностей, дуг и

т.д., используя внутреннюю систему координат. Холст создается конструктором Canvas, а его расположение в окне задается упаковщиками. Создадим холст с идентификатором Fig_1 внутри окна win, а на холсте «нарисуем» круг и ломаную линию:

Fig_1=Canvas(win, width=500, height=500)

окна;

Fig_1.pack()

#расположить холст

внутри

d=100;

X,Y=110,102

fill='red')

Fig_1.create_oval(X, Y, X+d, Y+d,

Fig_1.create_line([(175, 45), (85, 135),

(25,

425)], width=5, fill='blue', arrow=LAST)

Из данного примера видно, что фигуры создаются командами типа

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

Аналогично, текст выводится методом create_text:

Fig_1.create_text(10, 50, text="текст1,\n

текст2",justify=CENTER, font="Verdana 12")

Принцип построения графиков – стандартный, с помощью цикла,

рисующего точки (кружочки) в системе координат холста. from math import *

from tkinter import *

win_1 = Tk(); win_1.geometry("300x100")

X_Y = Canvas(win_1, width = 200, height = 100) X_Y['bg']= "white"

X_Y.pack(side=RIGHT)

X_Y.create_line(50,100,50,0,width=1,arrow=LAST)

X_Y.create_line(0,50,200,50,width=1,arrow=LAST)

43

t=0

for i in range(1350): t = t + 0.1

y = 25*sin(0.1* t)

Y=50 - y X=50 + t

X_Y.create_oval(X-1, Y-1, X+1, Y+2) win_1.mainloop()

Рис. 8. Окно с графиком функции y=25*sin(0.1* t).

Точка (0,0) находится в левом верхнем углу холста

Метод bind() позволяет связать один и тот же виджет с несколь-

кими событиями, каждое из которых имеет свой обработчик. widget_name.bind('<событие>', обработчик) #

В примере ниже нажатие (клик) правой или левой кнопкой мыши на

текст Herzen University вызовут различное изменение шрифта def FFF(event):

if event.num==1: l['font'] = "Verdana" if event.num==3: l['font'] = "Times"

l = Label(text="Herzen University")

l.bind('<Button-1>', FFF)

#

для левой кнопки

l.bind('<Button-3>', FFF)

#

для правой кнопки

l.pack()

 

 

У функций-обработчиков должен быть обязательный параметр, через который передается событие (имя по соглашению – event).

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

1.Создать кнопку, которая исчезает при нажатии на нее (использо-

вать метод destroy).

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

3.Программа синхронно выводит количество символов, вводимых в поле виджета Text.

44

4.На форме показать результат импликации или эквиваленции (по кнопке выбора) для пары вводимых данных типа (0, 1) и т. д.

5.Создать окно, в котором вводятся параметры заданной функции,

и строится её график по этим параметрам.

45

9. Модуль NymPy. Прикладные задачи

Библиотека NumPy является основой для превращения Python в инструмент научных вычислений. Центральным объектом в NumPy является многомерный массив. Для работы с массивами в библиотеке NumPy создано большое количество вычислительных алгоритмов (в виде функций, методов или операторов): решение задач линейной алгебры; решение основных задач математической статистики; генерирование случайных чисел; быстрое преобразования Фурье и многие другие. Вычислительные алгоритмы в NumPy реализованы на языке программирования С и предварительно скомпилированы, что в итоге обеспечивает высокую производительность вычислений.

Массивы как структура данных. Массивы NumPy

Массив — это упорядоченная структура однотипных данных (элементов), объединенных общим именем. В памяти компьютеры

элементы массива хранятся последовательно друг за другом и доступ к любому элементу возможен путем указания его порядкового номера или индекса.

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

Массивы NumPy являются динамическими структурами, их размер задается во время работы программы. При этом важно знать, что массивы NumPy не поддерживают явное изменение размера: у них, в отличие от списков, нет методов append и extend, которые позволяют добавлять элементы, и методов pop и remove, позволяющих их

удалять. Если требуется изменить размер массива, это можно сделать путём присваивания имени переменной, обозначающей массив, нового значения, соответствующего новой области памяти, большего или меньшего размера.

Создание массивов NumPy

Функция array. Основная функция создания массива – array. С

ее помощью можно создать новый массив или превратить в массив

уже существующий список. Например:

46

import numpy as np

A = np.array([0.5 , 0.7 , -3, -7.2 , 2]) print(A)

print(type(A))

В первой строке импортируется модуль NumPy с определением короткого псевдонима np. Во второй строчке на основе списка создается массив. Вывод программы следующий:

[0.5 0.7 -3. -7.2 2.] <type ’numpy.ndarray’>

Функция array трансформирует вложенные последовательности в многомерные массивы. Тип элементов массива зависит от типа эле-

ментов исходной последовательности:

B = np.array([[1, 2, 3], [4, 5, 6]]) print(B)

Вывод:

[[1 2 3] [4 5 6]]

Тип элементов массива можно определить в момент создания с помощью именованного аргумента dtype. Модуль NumPy предоставляет выбор из следующих встроенных типов: bool (логическое значение); character (символ); int8, int16, int32, int64 – целые числа со знаком; uint8, uint16, uint32, uint64 – целые числа без знака; float32

и float64 – действительные числа одинарной и двойной точности; complex64 и complex128 – комплексные числа одинарной и двойной точности.

Пример:

C = np.array([[1, 2, 3], [4, 5, 6]], dtype=float) print(C)

Вывод:

[[ 1. 2. 3.] [ 4. 5. 6.]]

Массив можно также создать (и заполнить) из диапазона: import numpy as np

A = np.array(range(5)) print(A)

Результат: [0 1 2 3 4]

47

В первом случае массив состоит из действительных чисел. Второй

массив состоит из целых чисел, потому что создан на основе диапазона range, в который входят только целые числа.

Функция arange позволяет создать массив, содержащий значения

в заданном диапазоне с произвольным шагом. Ниже приведена про-

грамма, которая рассчитывает значения синуса на одном периоде с ша-

гом π/6:

import numpy as np

x = np.arange(0, 2*np.pi , np.pi/6) y = np.sin(x)

for k in range(len(x)): print(x[k], y[k])

Результат работы этой программы имеет вид:

0.0 0.0

0.523598775598 0.5

1.0471975512 0.866025403784

1.57079632679 1.0

…………………….. и т. д.

Функция linspace также позволяет создать массив, содержащий значения в заданном диапазоне. Её первые два аргумента такие же, как и у arange (начало и конец диапазона), а третий аргумент – количество элементов. По заданному количеству элементов эта функция сама вычисляет шаг.

Важно: по умолчанию эти функции по разному обрабатывают

второй аргумент: arange берёт его не включительно, а linspace – включительно. Это можно изменить с помощью опционного, четвёрто-

го аргумента linspace, если присвоить ему значение False. Сравните три варианта создания массивов с помощью arange и linspace:

>>>a = numpy.arange (0, 2, 0.25)

>>>print(a)

[ 0.

0.25

0.5

0.75

1.

1.25

1.5

1.75]

>>>b = numpy.linspace (0, 2, 8, False)

>>>print(b)

[ 0. 0.25 0.5 0.75 1. 1.25 1.5 1.75]

>>>b = np.linspace (0, 2, 9)

>>>print(b)

[ 0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2.]

48

Массивы, также как и списки, являются итерируемыми объектами. Поэтому массивы можно обходить циклом, а функция len возвращает длину массива.

В модуле NumPy продублированы практически все функции мо-

дуля math. В нем содержатся все основные тригонометрические, лога-

рифмические и прочие функции, а также константы, поэтому при ра-

боте с NumPy надобности в модуле math обычно не возникает.

Функции заполнения zeros, ones и empty

Достаточно часто значения элементов массива в начале работы

программы неизвестны, а массив (заданного размера), в котором они

будут храниться, нужно создать. В NumPy имеется несколько функ-

ций, позволяющих создать массив, заполненный некоторым исходным содержимым. Например, функция ones создаёт массив из единиц, zeros – массив из нулей, empty – массив, значения элементов которого соответствуют текущему содержимому ячеек памяти (в них мо-

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

from numpy import *

a1 = ones(5) ; print(a1)

a2 = zeros(4) ; print(a2)

a3 = empty(3) ; print(a3)

В результате работы этой программы получим:

[

1.

1.

1.

1.

1.]

[

0.

0.

0.

0]

2.15497657e-163 0.00000000e+000]

[3.30623221e+000

Тип данных для создаваемых массивов можно также указать и явно: a3 = empty(5, dtype = int)

print(a3)

Результат: [500 0 0 0 0]

Важное замечание: действительные числа из NumPy типа float64

обладают практически всеми теми же свойствами, что и встроенные

числа Python, но могут принимать три дополнительных специальных

значения: inf, –inf или nan, что можно перевести как «бесконечность», «минус бесконечность» и «неопределённость». Если поделить

действительное число типа numpy.float64 на 0, получится inf или −inf, в зависимости от его знака, а вместо ошибки будет только предупреждение, которое позволит продолжить вычисления [6].

49

Срезы

Одна из важнейших особенностей работы с массивами – возмож-

ность делать срезы. Срез представляет собою новый массив из части

элементов исходного массива, взятых по некоторому правилу, напри-

мер, каждый второй элемент, первые пять элементов или последние

три элемента.

Данная программа иллюстрирует принцип создания срезов мас-

сивов:

import numpy as np

a1 = np.arange(0, 4, 0.5) print(a1)

a2 = a1[0:4] print(a2)

a3 = a1[0: len(a1):2] print(a3)

Массив a2 состоит из первых четырёх элементов массива a1 (от

нулевого включительно до четвёртого не включительно), массив a3

из всех чётных элементов a1 (от нулевого до последнего, с шагом 2). Для индексации используются двоеточия, сначала ставится номер начального индекса, потом конечного, потом шаг, все они – целые числа (точно в том же порядке, как и в функциях range и arange). Если шаг и стоящее перед ним двоеточием опустить, шаг будет авто-

матически единичным. Вот вывод программы:

[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5] [ 0. 0.5 1. 1.5]

[ 0. 1. 2. 3.]

Важно помнить, что массив-срез делит с исходным массивом память. Это значит, что копирование элементов в новый массив не происходит, вместо этого просто делается сложная ссылка. Поэтому из-

менение элементов исходного массива приводит к изменению эле-

ментов массива-среза и наоборот. Чтобы скопировать элементы, нужно воспользоваться функцией copy [6].

import numpy as np

a1 = np.arange(0, 0.6 , 0.1)

a2 = a1 [:len(a1)/2] print(a1, a2)

a1 [0] = 10

a1 [-1] = a1 [-1] + 3 print(a1, a2)

50

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