Файл: Методические указания по подготовке к практическим занятиям, в том числе в интерактивной форме, и самостоятельному изучению дисциплины для школьников 911 классов общеобразовательных средних учебных заведений.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.12.2023
Просмотров: 303
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
104 from tkinter import * from decimal import * root = Tk() root.title('Calculator') buttons = (('7', '8', '9', '/', '4'),
('4', '5', '6', '*', '4'),
('1', '2', '3', '-', '4'),
('0', '.', '=', '+', '4')
) activeStr = '' stack = []
Вычисление результата
Функция calculate получает из списка stack операнды и операцию которую над ними
надо произвести. Результат отображается в надписи label. Получать из списка строки будем с помощью метода pop. def calculate(): global stack global label result = 0 operand2 = Decimal(stack.pop()) operation = stack.pop() operand1 = Decimal(stack.pop()) if operation == '+': result = operand1 + operand2 if operation == '-': result = operand1 - operand2 if operation == '/': result = operand1 / operand2 if operation == '*': result = operand1 * operand2 label.configure(text=str(result))
Обработка нажатия
В функции click выполняется обработка нажатой клавиши. В качестве ее аргумента передается текст, отображаемый на кнопке, которую нажали. Хотелось бы хранить вводимое значение прямо в надписи, а не создавать для этого отдельную переменную. Но так не получается из-за алгоритма работы. После того как посчитан результат, он записывается в надписи. При попытке после этого начать вводить новое число, оно бы дописывало прежний результат.
В списке с операторами и командами для калькулятора не обязательно их будет 3. Но при обработке с помощью метода pop, будут рассматриваться 3 последних введенных значения. А после проведения расчета список очистится. Далее в него добавляется полученный результат, на случай если пользователь нажмет на калькуляторе клавишу операции сразу, а не будет вводить новое число. def click(text): global activeStr global stack if text == 'CE': stack.clear()
105 activeStr = '' label.configure(text='0') elif '0' <= text <= '9': activeStr += text label.configure(text=activeStr) elif text == '.': if activeStr.find('.') == -1: activeStr += text label.configure(text=activeStr) else: if len(stack) >= 2: stack.append(label['text']) calculate() stack.clear() stack.append(label['text']) activeStr = '' if text != '=': stack.append(text) else: if text != '=': stack.append(label['text']) stack.append(text) activeStr = '' label.configure(text='0')
Внешний вид
1 2 3 4 5 6 7 8 9 10
Теперь займемся оформлением внешнего вида калькулятора и зададим обработку
нажатия кнопок. Создаем надпись для вывода набираемых значений и результатов. В цикле создаем кнопки. Расположение кнопок и надписи осуществляется в табличном виде с помощью упаковщика grid. И в завершении запускаем цикл обработки событий mainloop. label = Label(root, text='0', width=35) label.grid(row=0, column=0, columnspan=4, sticky="nsew") button = Button(root, text='CE', command=lambda text='CE': click(text)) button.grid(row=1, column=3, sticky="nsew") for row in range(4): for col in range(4): button = Button(root, text=buttons[row][col], command=lambda row=row, col=col: click(buttons[row][col])) button.grid(row=row + 2, column=col, sticky="nsew") root.grid_rowconfigure(6, weight=1) root.grid_columnconfigure(4, weight=1) root.mainloop()
У надписи выставлена ширина 35, для того, чтобы оформление кнопок подстраивалось под надпись. И в результате кнопки при этом значении лучше выглядят.
Для того, чтобы кнопки правильно работали, пришлось для каждой из кнопок создать свою функцию с помощью lambda.
Описание программы
Календарь написан на Python 3 с помощью графической библиотеки Tkinter. Для определения текущего дня недели и количества дней в месяце использовалась стандартная
106 библиотека calendar. Будем отображать календарь на текущий месяц в виде таблицы.
Текущую дату выделим зелѐным цветом. Также добавим кнопки для перелистывания месяцев.
Подключение библиотек и объявление переменных
Подключаем стандартные библиотеки Tkinter, datetime и calendar с помощью import.
Инициализируем класс root, с помощью которого будет отрисовываться графический интерфейс. Задаем заголовок окна «Calendar». Объявляем пустой список days. В дальнейшем в нем будут храниться поля таблицы. Каждое такое поле соответствует определенному дню.
В переменную now будем хранить текущую дату. В переменных year и month будут храниться год и месяц, календарь которых в данный момент отображается. from tkinter import * import calendar import datetime root = Tk() root.title('Calendar') days = [] now = datetime.datetime.now() year = now.year month = now.month
Меняем текущий месяц
Функции prew и next будут вызываться при нажатии на одну из клавиш смены месяца.
Если текущее значение месяца «январь» и пользователь нажмет на кнопку перехода на предыдущий месяц, то тогда уменьшится год и месяц поменяет значение на «декабрь».
Обратите внимание на то, что переменные month и year глобальные
. Поэтому перед изменением их значения в функции необходимо использовать ключевое слово global.
Функция fill перерисовывает календарь.
107 def prew(): global month, year month -= 1 if month == 0: month = 12 year -= 1 fill() def next(): global month, year month += 1 if month == 13: month = 1 year += 1 fill()
Перерисовка календаря
В функции fill будет перерисовываться отображение всех элементов. Она будет вызываться в начале работы программы и каждый раз после изменения месяца, для которого нужно вывести календарь.
Вначале выводим наименование месяца и год. Вычисляем количество дней в предыдущем месяце и записываем в переменную prew_month_days. В переменноу week_day запишем номер дня недели первого числа месяца (от 0 – если первое число выпадет на понедельник, до 6 – на воскресенье).
После этого в трех циклах выводим числа и их корректируем их цвета:
В первом цикле заполняем номера дней выбранного месяца. Отображать будем их черным цветом. Если это текущий день, то его фон делаем зелѐным.
Во втором цикле заполняем числа предыдущего месяца. Они отображаться будут серым цветом.
В третьем цикле добавляем числа следующего месяца. Их также выводим серым цветом. def fill(): info_label['text'] = calendar.month_name[month] + ', ' + str(year) month_days = calendar.monthrange(year, month)[1] if month == 1: prew_month_days = calendar.monthrange(year-1, 12)[1] else: prew_month_days = calendar.monthrange(year, month - 1)[1] week_day = calendar.monthrange(year, month)[0] for n in range(month_days): days[n + week_day]['text'] = n+1 days[n + week_day]['fg'] = 'black' if year == now.year and month == now.month and n == now.day: days[n + week_day]['background'] = 'green' else: days[n + week_day]['background'] = 'lightgray' for n in range(week_day): days[week_day - n - 1]['text'] = prew_month_days - n days[week_day - n - 1]['fg'] = 'gray' days[week_day - n - 1]['background'] = '#f3f3f3' for n in range(6*7 - month_days - week_day): days[week_day + month_days + n]['text'] = n+1 days[week_day + month_days + n]['fg'] = 'gray' days[week_day + month_days + n]['background'] = '#f3f3f3'
108
Отображение элементов
Для отображения календаря в Python 3 мы используем библиотеку Tkinter. Воспользуемся еѐ упаковщиком grid. Он представит все создаваемые нами элементы в виде таблицы.
В первой строке в крайней левой и крайней правой ячейках (с номерами столбцов 0 и 6) отобразим кнопки смены месяцев. По центру выведем текстовое поле, в котором будет отображаться текущий год и месяц. Это поле будет занимать 5 ячеек таблицы, поэтому выставим параметр columnspan в 5. prew_button = Button(root, text='<', command=prew) prew_button.grid(row=0, column=0, sticky='nsew') next_button = Button(root, text='>', command=next) next_button.grid(row=0, column=6, sticky='nsew') info_label = Label(root, text='0', width=1, height=1, font=('Verdana', 16, 'bold'), fg='blue') info_label.grid(row=0, column=1, columnspan=5, sticky='nsew')
Во второй строке выведем сокращенные названия месяцев.
Дальше отображаем 6 строк по 7 столбцов, которые будем заполнять числами, обозначающими номера дней.
В завершении используем функцию fill, которая заполнит наш календарь начальными данными – календарем текущего месяца. После этого запустим цикл обработки событий mainloop. for n in range(7): lbl = Label(root, text=calendar.day_abbr[n], width=1, height=1, font=('Verdana', 10, 'normal'), fg='darkblue') lbl.grid(row=1, column=n, sticky='nsew') for row in range(6): for col in range(7): lbl = Label(root, text='0', width=4, height=2, font=('Verdana', 16, 'bold')) lbl.grid(row=row+2, column=col, sticky='nsew') days.append(lbl) fill() root.mainloop()
Пример программы на Python 3 для вывода календаря с помощью библиотеки Tkinter достаточно прост. Он поможет программистам в изучении языка. Здесь у нас представлены различные условные операторы и циклы, работа с глобальными переменными в функциях. Самое сложное в этом примере – это отображение графических элементов.
Тулкит tkinter содержит набор компонентов или виджетов, одним из которых является кнопка. Добавим кнопку в окно:
1 2
3 4
5 6
7 8
9 10 from tkinter import * root = Tk() root.title("GUI на Python") root.geometry("300x250") btn = Button(text="Hello") btn.pack() root.mainloop()
Для создания кнопки используется конструктор Button(). В этом конструкторе с помощью параметра text можно установить текст кнопки.
109
Чтобы сделать элемент видимым, у него вызывается метод pack(). В итоге вверху окна будет красоваться кнопка:
Каждый виджет, в том числе кнопка, имеет ряд атрибутов, которые влияют на ее визуализацию и которые мы можем настроить через конструктор:
1 2
3 4
5 6
7 8
9 10 11 12 13 14 15 16 from tkinter import * root = Tk() root.title("GUI на Python") root.geometry("300x250") btn = Button(text="Hello", # текст кнопки background="#555", # фоновый цвет кнопки foreground="#ccc", # цвет текста padx="20", # отступ от границ до содержимого по горизонтали pady="8", # отступ от границ до содержимого по вертикали font="16" # высота шрифта
) btn.pack() root.mainloop()
Параметры pady, padx, font принимают числовое значение, а параметры background и foreground получают шестнадцатеричное значение цвета. Параметр font содержит определение шрифта.
Всего же конструктор Button может принимать следующие параметры:
1 Button (master, options)
Параметр master представляет ссылку на родительский контейнер. В случае выше это могло бы быть само графическое окно, и мы могли написать:
1 2
3 4
5 6 root = Tk() root.title("GUI на Python") root.geometry("300x250") btn = Button(root, text="Hello") btn.pack()
Однако если в коде создается одно окно, то кнопка и любой другой элемент уже по умолчанию размещаются в этом окне. Поэтому первый параметр мы можем опустить, как в примерах выше. Если бы у нас в коде создавалось бы несколько окон, тогда мы могли бы передать в конструктор Button ссылку на нужное окно.
Второй параметр options представляет набор на самом деле набор параметров, которые мы можем установить по их имени: activebackground: цвет кнопки, когда она находится в нажатом состоянии activeforeground: цвет текста кнопки, когда она в нажатом состоянии bd: толщина границы (по умолчанию 2) bg/background: фоновый цвет кнопки fg/foreground: цвет текста кнопки font: шрифт текста, например, font="Arial 14" - шрифт Arial высотой 14px, или font=("Verdana", 13, "bold") - шрифт Verdana высотой 13px с выделением жирным height: высота кнопки highlightcolor: цвет кнопки, когда она в фокусе image: изображение на кнопке
110 justify: устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю padx: отступ от границ кнопки до ее текста справа и слева pady: отступ от границ кнопки до ее текста сверху и снизу relief: определяет тип границы, может принимать значения SUNKEN, RAISED, GROOVE,
RIDGE state: устанавливает состояние кнопки, может принимать значения DISABLED, ACTIVE,
NORMAL (по умолчанию) text: устанавливает текст кнопки textvariable: устанавливает привязку к элементу StringVar underline: указывает на номер символа в тексте кнопки, который подчеркивается. По умолчанию значение -1, то есть никакой символ не подчеркивается width: ширина кнопки wraplength: при положительном значении строки текста будут переносится для вмещения в пространство кнопки
Обработка нажатия на кнопку
Для обработки нажатия на кнопку необходимо установить в конструкторе параметр command, присвоив ему ссылку на функцию, которая будет срабатывать при нажатии:
1 2
3 4
5 6
7 8
9 10 11 12 13 14 15 16 17 18 19 from tkinter import * clicks = 0 def click_button(): global clicks clicks += 1 root.title("Clicks {}".format(clicks)) root = Tk() root.title("GUI на Python") root.geometry("300x250") btn = Button(text="Click Me", background="#555", foreground="#ccc", padx="20", pady="8", font="16", command=click_button) btn.pack() root.mainloop()
Здесь в качестве обработчика нажатия устанавливается функция click_button. В этой функции изменяется глобальная переменная clicks, которая хранит число кликов, и ее значение выводится в заголовок окна. Таким образом, при каждом нажатии кнопки будет срабатывать функция click_button, и количество кликов будет увеличиваться
111
ТРИ КНОПКИ
from tkinter import * root = Tk() root.title("GUI на Python") root.geometry("300x250") btn1 = Button(text="КНОПКА 1", background="#555", foreground="#ccc", padx="14", pady="7", font="13") btn1.place(x=10, y=20) btn2 = Button(text="КНОПКА 2", background="#555", foreground="#ccc", padx="14", pady="7", font="13") btn2.place(x=50, y=100) btn3 = Button(text="КНОПКА ТРИ", background="#555", foreground="#ccc", padx="14", pady="7", font="13") btn3.place(x=140, y=160) root.mainloop() https://pythonru.com/uroki/obuchenie-python-gui-uroki-po-tkinter http://codepad.org/
Источник: https://pythononline.ru/
Задание 1 Площадь прямоугольника
from tkinter import* import math root = Tk() root.title('Table') root.geometry('140x140') def dlina(): a = EntryA.get() # берем текст из первого поля a = int(a) # преобразуем в число целого типа b = EntryB.get() b = int(b) result = str(a * b) # результат переведем в строку для дальнейшего вывода
EntryC.delete(0, END) # очищаем текстовое поле полностью
EntryC.insert(0, result) # вставляем результат в началo
Label(root, text='Длина').grid(row=1, column=0, sticky=W)
Label(root, text='Ширина').grid(row=2, column=0, sticky=W)
Label(root, text='Найти').grid(row=3, column=0, sticky=W)
EntryA=Entry(root, width=8, font='Arial 12')
112
EntryA.grid(row=1, column=1, sticky=E)
EntryB=Entry(root, width=8, font='Arial 12')
EntryB.grid(row=2, column=1, sticky=E)
EntryC=Entry(root, width=8, font='Arial 12')
EntryC.grid(row=3, column=1, sticky=E) button1 = Button(root, text='Рассчет', command = dlina ) button1.grid(row=3, column=0, sticky=E) root.mainloop
Задание 2. Считать из ENTRY два числа и сложить их
import tkinter as tk def summ(): try: x = float(entry_1.get()) y = float(entry_2.get()) label.config(text="Сумма числе будет равна {}".format(x + y)) except ValueError: label.config(text="Ошибка введите цифры") root = tk.Tk() entry_1 = tk.Entry(root) entry_2 = tk.Entry(root) entry_1.pack() entry_2.pack() label = tk.Label(root, text="Сумма числе будет равна") label.pack() button = tk.Button(root, text='сложить числа', command=summ) button.pack() root.mainloop()
Элемент Radiobutton представляет переключатель, который может находиться в двух состояниях: отмеченном или неотмеченном. Но в отличие от Checkbutton переключатели могут создавать группу, из которой одномоментно мы можем выбрать только один переключатель.
Используем переключатели:
1 2
3 4
5 6
7 8
9 10 from tkinter import * root = Tk() root.title("GUI на Python") root.geometry("300x250") header = Label(text="Выберите курс", padx=15, pady=10) header.grid(row=0, column=0, sticky=W) lang = IntVar()
113 11 12 13 14 15 16 17 18 19 20 21 python_checkbutton = Radiobutton(text="Python", value=1, variable=lang, padx=15, pady=10) python_checkbutton.grid(row=1, column=0, sticky=W) javascript_checkbutton = Radiobutton(text="JavaScript", value=2, variable=lang, padx=15, pady=10) javascript_checkbutton.grid(row=2, column=0, sticky=W) selection = Label(textvariable=lang, padx=15, pady=10) selection.grid(row=3, column=0, sticky=W) root.mainloop()
Здесь определены два переключателя, но оба они привязаны к одной переменной IntVar.
При этом они имеют разные значения, устанавливаемые через параметр value. Поэтому при включении одного переключателя, другой автоматически перейдет в неотмеченное состояние.
Для настройки переключателя конструктор Radiobutton, как и другие конструкторы виджетов, принимает два параметра:
1 Radiobutton (master, options)
Первый параметр - master представляет ссылку на родительское окно, а второй параметр объединяет набор следующих параметров: activebackground: фоновый цвет переключателя в нажатом состоянии activeforeground: цвет текста переключателя в нажатом состоянии bg: фоновый цвет переключателя bitmap: монохромное изображение для переключателя borderwidth: граница вокруг переключателя command: ссылка на функцию, которая вызывается при нажатии на переключатель cursor: курсор при наведении на элемент font: шрифт fg: цвет текста height: высота элемента в строках текста. По умолчанию равно 1 image: графическое изображение, отображаемое на элементе justify: выравнивание текста, принимает значения CENTER, LEFT, RIGHT padx: отступы справа и слева от текста до границы переключателя pady: отступы сверху и снизу от текста до границы переключателя relief: стиль переключателя, по умолчанию имеет значение FLAT selectcolor: цвет кружка переключателя selectimage: изображение на переключателе, когда он находится в отмеченном состоянии state: состояние элемента, может принимать значения NORMAL (по умолчанию),
DISABLED и ACTIVE text: текст элемента textvariable: устанавливает привязку к переменной StringVar, которая задает текст переключателя underline: индекс подчеркнутого символа в тексте элемента variable: ссылка на переменную, как правило, типа IntVar, которая хранит состояние переключателя value: значение переключателя width: ширина элемента wraplength: устанавливает перенос символов на другую строку в тексте элемента
114 from tkinter import * languages = [("Python", 1), ("JavaScript", 2), ("C#", 3), ("Java", 4)] def select(): l = language.get() if l == 1: sel.config(text="Выбран Python") elif l == 2: sel.config(text="Выбран JavaScript") elif l == 3: sel.config(text="Выбран C#") elif l == 4: sel.config(text="Выбран Java") root = Tk() root.title("GUI на Python") root.geometry("300x280") header = Label(text="Выберите курс", padx=15, pady=10) header.grid(row=0, column=0, sticky=W) language = IntVar() row = 1 for txt, val in languages:
Radiobutton(text=txt, value=val, variable=language, padx=15, pady=10, command=select)\
.grid(row=row, sticky=W) row += 1 sel = Label(padx=15, pady=10) sel.grid(row=row, sticky=W) root.mainloop()
1. Что такое словарь в Python?
Словари в Python – это изменяемые отображения ссылок на объекты, доступные по ключу.
Словари представляют собой структуры данных, в которых уникальные ключи отображают значения. Ключ и значение разделяются двоеточием, пары ключ-значения отделяются запятыми, а словарь целиком ограничивается фигурными скобками {}. Ниже приведены три словаря, содержащие сведения о населении пяти крупнейших городов
Германии, список покупок и оценки студентов.
>>> population = {'Berlin': 3748148, 'Hamburg': 1822445, 'Munich': 1471508, 'Cologne':
1085664, 'Frankfurt': 753056 }
>>> products = {'table': 120, 'chair': 40, 'lamp': 14, 'bed': 250, 'mattress': 100}
>>> grades = {'Alba': 9.5, 'Eduardo': 10, 'Normando': 3.5, 'Helena': 6.5, 'Claudia': 7.5}
Три этих словаря будут использоваться далее в руководстве. Чтобы лучше разобраться в уроку словарей, советуем проходить этот текст вместе с интерпретатором Python.
2. Создание словаря при помощи dict()