Перейти к содержимому

Root python что это

  • автор:

Что такое функция sqrt в Python?

Функция sqrt() это функция встроенного в Python пакета math, которая возвращает квадратный корень числа (sqrt сокращение от square root — квадратный корень).

Синтаксис выглядит следующим образом:

math.sqrt(x) 

Где x любое положительное число. Стоит учитывать, что тип возвращаемого числа будет float .

Для использования функции sqrt() необходимо сначала импортировать пакет math.

import math print(math.sqrt(4)) # => 2.0 print(math.sqrt(144)) # => 12.0 

Что такое Tkinter

Tkinter – это пакет для Python, предназначенный для работы с библиотекой Tk. Библиотека Tk содержит компоненты графического интерфейса пользователя (graphical user interface – GUI). Эта библиотека написана на языке программирования Tcl.

Под графическим интерфейсом пользователя (GUI) подразумеваются все те окна, кнопки, текстовые поля для ввода, скроллеры, списки, радиокнопки, флажки и другие элементы, которые вы видите на экране, открывая то или иное приложение. Через них вы взаимодействуете с программой и управляете ею. Все эти элементы интерфейса будем называть виджетами (widgets – штуковины).

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

Существует множество библиотек GUI, среди которых Tk не самый популярный инструмент, хотя с его помощью написано немало проектов. Он был выбран для Python по-умолчанию. Установочный файл интерпретатора Питона обычно уже включает пакет tkinter в составе стандартной библиотеки.

Tkinter можно представить как переводчик с языка Python на язык Tcl. Вы пишете программу на Python, а код модуля tkinter переводит ваши инструкции на язык Tcl, который понимает библиотека Tk.

Программы с графическим интерфейсом пользователя событийно-ориентированные. Вы уже должны иметь представление о структурном и желательно объектно-ориентированном программировании. Событийно-ориентированное ориентировано на события. То есть та или иная часть программного кода начинает выполняться лишь тогда, когда случается то или иное событие.

Событийно-ориентированное программирование базируется на объектно-ориентированном. Даже если мы не будем разрабатывать собственные классы, мы обязательно будем пользоваться теми, что есть в tkinter . Все виджеты – это объекты-экземпляры, создаваемые от встроенных классов.

События бывают разными. Сработал временной фактор, завершилась загрузка, пришло сообщение, кто-то кликнул мышкой или нажал Enter , начал вводить текст, переключил радиокнопки, прокрутил страницу вниз и так далее. Когда случается что-либо подобное, то, если был создан обработчик для соответствующего события, происходит выполнение определенной части программы, что приводит к какому-либо результату.

Tkinter импортируется стандартно для модуля Python любым из способов:

  • import tkinter
  • from tkinter import *
  • import tkinter as tk

Можно импортировать отдельные классы, что делается редко. В данном курсе мы будем использовать выражение from tkinter import * .

Если необходимо, узнать установленную версию Tk можно через константу TkVersion:

>>> from tkinter import * >>> TkVersion 8.6

Чтобы написать GUI-программу, надо выполнить приблизительно следующее:

  1. Создать главное окно.
  2. Создать виджеты и выполнить конфигурацию их свойств (опций).
  3. Определить события, то есть то, на что будет реагировать программа.
  4. Описать обработчики событий, то есть то, как будет реагировать программа.
  5. Расположить виджеты в главном окне.
  6. Запустить цикл обработки событий.

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

В современных операционных системах любое пользовательское приложение заключено в окно, которое можно назвать главным, так как в нем располагаются все остальные виджеты. Объект окна верхнего уровня создается от класса Tk модуля tkinter . Переменную, связываемую с объектом, часто называют root (корень):

root = Tk()

Пусть в окне приложения располагаются текстовое поле, метка и кнопка. Данные объекты создаются от классов Entry , Label и Button модуля tkinter . Сразу выполним конфигурацию некоторые их свойства с помощью передачи аргументов конструкторам этих классов:

ent = Entry(root, width=20) but = Button(root, text="Преобразовать") lab = Label(root, width=20, bg='black', fg='white')

Устанавливать свойства объектов не обязательно при их создании. Существуют еще пара способов, с помощью которых это можно сделать после.

Первым аргументом в конструктор виджета передается виджет-хозяин, то есть тот, на котором будет располагаться создаваемый. В случае, когда элементы GUI помещаются непосредственно на главное окно, родителя можно не указывать. То есть в нашем примере мы можем убрать root :

ent = Entry(width=20) but = Button(text="Преобразовать") lab = Label(width=20, bg='black', fg='white')

Однако виджеты не обязательно располагаются на root ‘е. Они могут находиться на других виджетах, и тогда указывать «мастера» необходимо.

Пусть в программе текст, введенный человеком в поле, при нажатии на кнопку разбивается на список слов, слова сортируются по алфавиту и выводятся в метке. Выполняющий все это код надо поместить в функцию:

def str_to_sort_list(event): s = ent.get() s = s.split() s.sort() lab['text'] = ' '.join(s)

У функций, которые вызываются при наступлении события с помощью метода bind , должен быть один параметр. Обычно его называют event , то есть «событие».

В нашей функции с помощью метода get из поля забирается текст, представляющий собой строку. Она преобразуется в список слов с помощью метода split . Потом список сортируется. В конце изменяется свойство text метки. Ему присваивается строка, полученная из списка с помощью строкового метода join .

Теперь необходимо связать вызов функции с событием:

but.bind('', str_to_sort_list)

В данном случае это делается с помощью метода bind . Ему передается событие и функция-обработчик. Событие будет передано в функцию и присвоено параметру event . Здесь событием является щелчок левой кнопкой мыши, что обозначается строкой » .

В любом приложении виджеты не разбросаны по окну как попало, а организованы, интерфейс продуман до мелочей и обычно подчинен определенным стандартам. Пока расположим элементы друг под другом с помощью наиболее простого менеджера геометрии tkinter – метода pack :

ent.pack() but.pack() lab.pack()

Метод mainloop экземпляра Tk запускает главный цикл обработки событий, что в том числе приводит к отображению главного окна со всеми «упакованными» на нем виджетами:

root.mainloop()

Полный код программы:

from tkinter import * def str_to_sort_list(event): s = ent.get() s = s.split() s.sort() lab['text'] = ' '.join(s) root = Tk() ent = Entry(width=20) but = Button(text="Преобразовать") lab = Label(width=20, bg='black', fg='white') but.bind('', str_to_sort_list) ent.pack() but.pack() lab.pack() root.mainloop() 

В результате выполнения данного скрипта появляется окно, в текстовое поле которого можно ввести список слов, нажать кнопку и получить его отсортированный вариант:

Пример программы на Python, написанной с помощью tkinter

Попробуем теперь реализовать в нашей программе объектно-ориентированный подход. Это необязательно, но позволяет связать/объединить вместе (вспомните про инкапсуляцию в ООП) виджет и функции, которые обрабатывают связанные с ним события, что концептуально более верно. В этом случае функции становятся методами.

Пусть группа из метки, кнопки и поля представляет собой один объект, порождаемый от класса Block . Тогда в основной ветке программы будет главное окно, объект типа Block и запуск окна. Поскольку блок должен быть привязан к главному окну, то неплохо бы передать в конструктор класса окно-родитель:

from tkinter import * root = Tk() first_block = Block(root) root.mainloop()

Теперь напишем сам класс Block :

class Block: def __init__(self, master): self.ent = Entry(master, width=20) self.but = Button(master, text="Преобразовать") self.lab = Label(master, width=20, bg='black', fg='white') self.but['command'] = self.str_to_sort self.ent.pack() self.but.pack() self.lab.pack() def str_to_sort(self): s = self.ent.get().split() s.sort() self.lab['text'] = ' '.join(s)

Здесь виджеты являются значениями полей объекта типа Block , функция-обработчик события нажатия на кнопку устанавливается не с помощью метода bind , а с помощью свойства кнопки command . В этом случае в вызываемой функции не требуется параметр event . В метод мы передаем только сам объект.

Больший смысл в определении собственного класса появляется, когда требуется несколько или множество похожих объектов-блоков. Допустим, нам нужно несколько блоков, состоящих из метки, кнопки, поля. Причем у кнопки каждой группы будет своя функция-обработчик клика.

Тогда можно передавать значения для свойства command в конструктор. Значение будет представлять собой привязываемую к кнопке функцию-обработчик события. Полный код программы:

from tkinter import * class Block: def __init__(self, master, func): self.ent = Entry(master, width=20) self.but = Button(master, text="Преобразовать") self.lab = Label(master, width=20, bg='black', fg='white') # self.but['command'] = eval('self.' + func) self.but['command'] = getattr(self, func) self.ent.pack() self.but.pack() self.lab.pack() def str_to_sort(self): s = self.ent.get().split() s.sort() self.lab['text'] = ' '.join(s) def str_reverse(self): s = self.ent.get().split() s.reverse() self.lab['text'] = ' '.join(s) root = Tk() first_block = Block(root, 'str_to_sort') second_block = Block(root, 'str_reverse') root.mainloop() 

Выражение getattr(self, func) , где вместо func подставляется строка ‘str_to_sort’ или ‘str_reverse’, преобразуется в выражение self.str_to_sort или self.str_reverse .

При выполнения этого кода в окне будут выведены два однотипных блока, кнопки которых выполняют разные действия.

Окно с двумя блоками кнопки, метки и текстового поля

Класс можно сделать более гибким, если жестко не задавать свойства виджетов, а передавать значения как аргументы в конструктор, после чего присваивать их соответствующим опциям при создании объектов.

Практическая работа

Напишите простейший калькулятор, состоящий из двух текстовых полей, куда пользователь вводит числа, и четырех кнопок «+», «-«, «*», «/». Результат вычисления должен отображаться в метке. Если арифметическое действие выполнить невозможно (например, если были введены буквы, а не числа), то в метке должно появляться слово «ошибка».

Курс с примерами решений практических работ: pdf-версия

X Скрыть Наверх

Tkinter. Программирование GUI на Python

Модуль tkinter. Урок №1 — Введение

На этом уроке мы познакомимся с штатным средством построения графического интерфейса (GUI) программы, написанного на языке python (мы будем рассматривать третью версию питона).

Существует также и другие графические библиотеки, позволяющих создавать программы с улучшенным графическим интерфейсом и богатым набором компонентов — PySide, wxPython, PyQt, PyGT, но все они требуют отдельную установку и достаточно сложны в освоении новичкам.

Модуль tkinter хотя и обладает скромными возможностями и непритязательным внешним видом компонентов, зато программа с этим модулем будет запускаться на любой платформе (Win, Lin, Mac), где установлен python.

В этом задании мы создадим простейшее графическое приложение с кнопкой, выводящей текст.

  1. Итак, приступим. Наберем следующий код на питоне:
from tkinter import * root=Tk() button1=Button(root,text='Вывод текста') button1.pack() root.mainloop()

После запуска мы увидим окно приложения с единственной кнопкой, занимающей все окно приложения:

Давайте разберемся, что делает данный код:

Строка from tkinter import * подключает модуль;

Строка root=Tk() создает окно приложения;

Строка button1=Button(root,text=’Вывод текста’) создает объект класса Button, то есть обычную кнопку;

Строка button1.pack() размещает эту кнопку в окне приложения. Метод pack представляет самый простой способ размещения, в дальнейшем мы узнаем и другие способы.

Строка root.mainloop() запускает программу в цикле.

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

def printText(event): print('Привет!') 

А теперь свяжем нашу кнопку с этой функций с помощью метода bind (строка ниже инициализации кнопки):

button1.bind('',printText)

Проверьте, при нажатии левой кнопкой мыши по кнопке в терминале печатается ‘Привет!’

3. Осталось поменять размеры и заголовок окна:

root.title("Моя первая программа на tk") root.geometry('300x100')

Ниже представлен весь текст программы:

# подключаем модуль tkinter from tkinter import * # создаем главное окно root=Tk() root.title("Моя первая программа на tk") root.geometry('300x100') # функция, выводящая приветствие def printText(event): print('Привет!') # создаем объект типа кнопка (Button) button1=Button(root,text='Вывод текста',width=12, height=2) # связываем нажатие ЛКМ по кнопке с функцией вывода приветствия button1.bind('',printText) # отображаем кнопку в главном окне (это самый простой способ) button1.pack() # отобразим программу в бесконечном цикле, всегда в конце программы root.mainloop()

Программирование GUI на Python с помощью Tkinter. Tkinter Text

Tkinter — графическая библиотека для Python, которая используется для разработки графического интерфейса на Python (начиная с Python 3.0, Tkinter переименована в tkinter). Tkinter является интерфейсом к tcl/tk и расшифровывается как Tk interface.

Эта библиотека кроссплатформенна и может применяться в многих распространённых ОС: Linux, Mac OS X, Windows. Кроме того, Tkinter включена в стандартный дистрибутив Python.

Так как библиотека Tkinter — это достаточно прозрачный интерфейс к tcl/tk, то основной источник информации для неё — man-страницы tcl/tk. Данные страницы есть в любой Unix-системе и доступны онлайн.

Импорт

Импортируется Tkinter точно так же, как и любая другая библиотека на Python:

 
# для python 2.7 и ниже import Tkinter # для python 3.0 и выше import tkinter
 
# для python 2.7 и ниже from Tkinter import * # для python 3.0 и выше from tkinter import * 

В Tkinter визуальные контроллы называют виджетами (widget — стандартизированный компонент графического интерфейса, с которым пользователь осуществляет взаимодействие).

Text в Tkinter

Text представляет собой виджет, позволяющий пользователю вводить любое количество текста. Text имеет дополнительное свойство wrap, которое отвечает за перенос (чтобы переносить по словам, используют значение WORD).

 
from Tkinter import * root=Tk() text1=Text(root,height=7,width=7,font='Arial 14',wrap=WORD) text1.pack() root.mainloop()

В нашем случае методы insert, get и delete выполняют добавление, извлечение и удаление текcта. Первый аргумент является местом вставки в виде 'x.y', где x является строкой, а y – столбцом.

 
text1.insert(1.0,'Добавим Текст\n\ в начало 1-й строки') text1.delete('1.0', END) # Удалим всё text1.get('1.0', END) # Извлечем всё

Таким образом, с помощью Text в Tkinter мы можем запрограммировать многострочное текстовое поле. К слову, такой виджет нередко используется при заполнении web-форм. По умолчанию его размер составляет 80 знакомест по горизонтали и 24 по вертикали.

text_size_1-20219-c004d5.png

Но данные свойства мы можем поменять, используя опции width и height. Также можно конфигурировать шрифт, цвет и пр.

 
from tkinter import * root = Tk() text = Text(width=25, height=5, bg="darkgreen", fg='white', wrap=WORD) text.pack() root.mainloop()

text_prop_1-20219-744b55.png

Text и Scrollbar

Когда в текстовое поле вводят больше линий текста, чем его высота, поле само будет прокручиваться вниз. Для прокрутки можно использовать колесико мышки, стрелки на клавиатуре или скроллер — полосу прокрутки.

В Tkinter скроллеры производятся с помощью класса Scrollbar. В этом случае объект-скроллер связывается с виджетом, которому он нужен. И речь сейчас идёт не обязательно о многострочном текстовом поле. Нередко полосы прокрутки используются и в списках.

 
from tkinter import * root = Tk() text = Text(width=20, height=7) text.pack(side=LEFT) scroll = Scrollbar(command=text.yview) scroll.pack(side=LEFT, fill=Y) text.config(yscrollcommand=scroll.set) root.mainloop()

scrollbar_1-20219-215870.png

В примере мы создаём скроллер, к которому через опцию command привязываем прокрутку текстового поля по оси y – text.yview . Далее, в свою очередь, текстовому полю устанавливаем ранее созданный скроллер – scroll.set , используя для этого опцию yscrollcommand.

Методы Text

Главные методы у Text мы уже упоминали – get() , insert() , delete() . Но если в случае с однострочным текстовым полем достаточно указать один индекс элемента при его вставке либо удалении, то, когда речь идёт о многострочном поле, нужно указывать два – как номер строки, так и номер символа в данной строке (иными словами, номер столбца). Также стоит отметить, что нумерация строк здесь начинается с единицы, а нумерация столбцов – с нуля.

 
from tkinter import * def insertText(): s = "Hello World" text.insert(1.0, s) def getText(): s = text.get(1.0, END) label['text'] = s def deleteText(): text.delete(1.0, END) root = Tk() text = Text(width=25, height=5) text.pack() frame = Frame() frame.pack() b_insert = Button(frame, text="Вставить", command=insertText) b_insert.pack(side=LEFT) b_get = Button(frame, text="Взять", command=getText) b_get.pack(side=LEFT) b_delete = Button(frame, text="Удалить", command=deleteText) b_delete.pack(side=LEFT) label = Label() label.pack() root.mainloop()

method_text_1-20219-f7e92a.png

Собственно говоря, методы get() и delete() способны принимать не два, а лишь один аргумент. В данном случае обрабатывается лишь один символ в указанной позиции.

Теги

Особенность текстового поля библиотеки Tkinter — возможность форматировать текст непосредственно в нём, придавая разным его частям различное оформление. Реализуется это посредством методов tag_add() и tag_config() . Первый указанный метод добавляет тег, но нужно указывать его произвольное имя и отрезок текста, для которого он будет применяться. Что касается второго метода tag_config() , то он настраивает тегу стили оформления.

 
from tkinter import * root = Tk() text = Text(width=50, height=10) text.pack() text.insert(1.0, "Hello world!\nline two") text.tag_add('title', 1.0, '1.end') text.tag_config('title', font=("Verdana", 24, 'bold'), justify=CENTER) root.mainloop()

text_tag_1-20219-7f02d7.png

Вставка виджетов в текстовое поле

В Text мы можем вставлять и другие виджеты, используя метод window_creat() . Потребности особой в этом нет, но иногда может пригодиться с объектами типа Canvas. В нижеследующем примере мы вставляем метку в текущую (INSERT) позицию курсора:

 
from tkinter import * def smile(): label = Label(text=":)", bg="yellow") text.window_create(INSERT, window=label) root = Tk() text = Text(width=50, height=10) text.pack() button = Button(text=":)", command=smile) button.pack() root.mainloop()

window_create_1-20219-e81037.png

Разместив метку в функции, мы сможем каждый раз при вызове функции создавать новую метку. В обратном случае, если бы метка находилась в основной ветке нашей программы, предыдущая бы исчезала.

Подробнее о Tkinter и программировании GUI на Python читайте в официальной документации или на обучающих сайтах. Также мы рекомендуем пройти углубленный курс Python-разработки от опытных IT-специалистов:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *