Как открыть окно в питоне
Всплывающие окна / tkinter 11
Открытие дополнительного окна
Корневой экземпляр Tk представляет собой основное окно графического интерфейса. Когда он уничтожается, приложение закрывается, а основной цикл завершается.
Начнем с создания простого окна, которое открывается по нажатию кнопки в основном. Дополнительное окно будет включать кнопку, которая закрывает его и возвращает фокус в основное:
Как работают всплывающие окна
Обработка закрытия окна
При определенных условиях может потребоваться выполнить определенное действие до закрытия окно верхнего уровня: например, чтобы пользователь не потерял несохраненную работу. Tkinter позволяет перехватывать этот тип событий, что позволяет уничтожать окно только при определенном условии.
В Tkinter можно определить, когда окно готовится закрыться с помощью функции-обработчика для протокола WM_DELETE_WINDOW . Его можно запустить, нажав на иконку «x» в верхней панели в большинстве настольных программ.
Этот метод-обработчик показывает диалоговое окно для подтверждения удаления окна. В более сложных программах логика обычно включает дополнительную валидацию.
Как работает проверка закрытия окна
Метод bind() используется для регистрации обработчиков событий виджетов, а метод protocol делает то же самое для протоколов менеджеров окна.
Стоит запомнить, что для сохранения фокуса в дополнительном окне при открытом диалоговом нужно передать ссылку экземпляру верхнего уровня в параметре parent диалоговой функции:
В противном случае диалоговое окно будет считать родительским корневое, и оно будет возникать над вторым. Это может запутать пользователей, поэтому хорошей практикой считается правильное указание родителя для каждого экземпляра верхнего уровня или диалогового окна.
Передача переменных между окнами
Два разных окна иногда нуждаются в том, чтобы передавать информацию прямо во время работы программы. Ее можно сохранять на диск и читать в нужном окне, но в определенных случаях удобнее обрабатывать ее в памяти и передавать в качестве переменных.
Основное окно будет включать три кнопки-переключателя для выбора типа пользователя, а второе — форму для заполнения его данных:
Для сохранения пользовательских данных создаем namedtuple с полями, которые представляют собой экземпляр каждого пользователя. Эта функция из модуля collections получает имя типа и последовательность имен полей, а возвращает подкласс кортежа для создания простого объекта с заданными полями:
Обучение Python GUI (уроки по Tkinter)
В этом уроке мы узнаем, как разрабатывать графические пользовательские интерфейсы, с помощью разбора некоторых примеров графического интерфейса Python с использованием библиотеки Tkinter.
Библиотека Tkinter установлена в Python в качестве стандартного модуля, поэтому нам не нужно устанавливать что-либо для его использования. Tkinter — очень мощная библиотека. Если вы уже установили Python, можете использовать IDLE, который является интегрированной IDE, поставляемой в Python, эта IDE написана с использованием Tkinter. Звучит круто!
Мы будем использовать Python 3.7 поэтому, если вы все еще используете Python 2.x, настоятельно рекомендуем перейти на Python 3.x, если вы не в курсе нюансов изменения языка, с целью, чтобы вы могли настроить код для запуска без ошибок.
Давайте предположим, что у вас уже есть базовые знания по Python, которые помогут понять что мы будем делать.
Мы начнем с создания окна, в котором мы узнаем, как добавлять виджеты, такие, как кнопки, комбинированные поля и т. д. После этого поэкспериментируем со своими свойствами, поэтому предлагаю начать.
Создание своего первого графического интерфейса
Для начала, следует импортировать Tkinter и создать окно, в котором мы зададим его название:
Создание виджета Label
Затем мы установим позицию в окне с помощью функции grid и укажем ее следующим образом:
Полный код, будет выглядеть следующим образом:
И вот как будет выглядеть результат: 
Настройка размера и шрифта текста
Вы можете задать шрифт текста и размер. Также можно изменить стиль шрифта. Для этого передайте параметр font таким образом:
Отлично, но стандартное окно слишком мало. Как насчет настройки размера окна?
Настройка размеров окна приложения
Мы можем установить размер окна по умолчанию, используя функцию geometry следующим образом:
В приведенной выше строке устанавливается окно шириной до 400 пикселей и высотой до 250 пикселей.
Попробуем добавить больше виджетов GUI, например, кнопки и посмотреть, как обрабатывается нажатие кнопок.
Добавление виджета Button
Начнем с добавления кнопки в окно. Кнопка создается и добавляется в окно так же, как и метка:
Наш код будет выглядеть вот так:
Результат будет следующим: 
Изменение цвета текста и фона у Button

Кнопка Click
Для начала, мы запишем функцию, которую нужно выполнить при нажатии кнопки:
Затем мы подключим ее с помощью кнопки, указав следующую функцию:
При нажатии на кнопку, результат, как и ожидалось, будет выглядеть следующим образом: 
Получение ввода с использованием класса Entry (текстовое поле Tkinter)
В предыдущих примерах GUI Python мы ознакомились со способами добавления простых виджетов, а теперь попробуем получить пользовательский ввод, используя класс Tkinter Entry (текстовое поле Tkinter).
Вы можете создать текстовое поле с помощью класса Tkinter Entry следующим образом:
Если вы нажмете на кнопку — появится текст «Привет » вместе с введенным текстом в виджете записи. Вот полный код:
Запустите вышеуказанный код и проверьте результат: 
Каждый раз, когда мы запускаем код, нам нужно нажать на виджет ввода, чтобы настроить фокус на ввод текста, но как насчет автоматической настройки фокуса?
Установка фокуса виджета ввода
Здесь все очень просто, ведь все, что нам нужно сделать, — это вызвать функцию focus :
Когда вы запустите свой код, вы заметите, что виджет ввода в фокусе, который дает возможность сразу написать текст.
Отключить виджет ввода
Чтобы отключить виджет ввода, отключите свойство состояния:

Добавление виджета Combobox
Чтобы добавить виджет поля с выпадающем списком, используйте класс Combobox из ttk следующим образом:
Затем добавьте свои значения в поле со списком.
Добавление виджета Checkbutton (чекбокса)
Кроме того, вы можете задать значение по умолчанию, передав его в параметр var в Checkbutton :
Посмотрите на результат:
Установка состояния Checkbutton
Вы можете установить для BooleanVar значение false, что бы чекбокс не был отмечен.
Так же, используйте IntVar вместо BooleanVar и установите значения 0 и 1.
Добавление виджетов Radio Button
Чтобы добавить radio кнопки, используйте класс RadioButton :
Обратите внимание, что вы должны установить value для каждой radio кнопки с уникальным значением, иначе они не будут работать.
Результатом вышеприведенного кода будет следующий: 
Вот пример:
Получение значения Radio Button (Избранная Radio Button)
Чтобы получить текущую выбранную radio кнопку или ее значение, вы можете передать параметр переменной и получить его значение.

Добавление виджета ScrolledText (текстовая область Tkinter)
Результат:
Настройка содержимого Scrolledtext
Удаление/Очистка содержимого Scrolledtext
Чтобы очистить содержимое данного виджета, используйте метод delete :
Создание всплывающего окна с сообщением
Чтобы показать всплывающее окно с помощью Tkinter, используйте messagebox следующим образом:
Довольно легко! Давайте покажем окно сообщений при нажатии на кнопку пользователем.

Показ сообщений о предупреждениях и ошибках
Вы можете показать предупреждающее сообщение или сообщение об ошибке таким же образом. Единственное, что нужно изменить—это функция сообщения.
Показ диалоговых окон с выбором варианта
Чтобы показать пользователю сообщение “да/нет”, вы можете использовать одну из следующих функций messagebox :
Вы можете выбрать соответствующий стиль сообщения согласно вашим потребностям. Просто замените строку функции showinfo на одну из предыдущих и запустите скрипт. Кроме того, можно проверить, какая кнопка нажата, используя переменную результата.
Если вы кликнете OK, yes или retry, значение станет True, а если выберете no или cancel, значение будет False.
Единственной функцией, которая возвращает одно из трех значений, является функция askyesnocancel ; она возвращает True/False/None.
Добавление SpinBox (Виджет спинбокс)
Для создания виджета спинбокса, используйте класс Spinbox :
Проверим пример полностью:
Виджет покажет только эти 3 числа: 3, 8 и 11.
Задать значение по умолчанию для Spinbox
В случае, если вам нужно задать значение по умолчанию для Spinbox, вы можете передать значение параметру textvariable следующим образом:
Теперь, если вы запустите программу, она покажет 36 как значение по умолчанию для Spinbox.
Добавление виджета Progressbar
Чтобы создать данный виджет, используйте класс progressbar :
Установите значение progressbar таким образом:
Вы можете установить это значение на основе любого процесса или при выполнении задачи.
Изменение цвета Progressbar
Изменение цвета Progressbar немного сложно. Сначала нужно создать стиль и задать цвет фона, а затем настроить созданный стиль на Progressbar. Посмотрите следующий пример:
И в результате вы получите следующее:
Добавление поля загрузки файла
Для добавления поля с файлом, используйте класс filedialog :
После того, как вы выберете файл, нажмите “Открыть”; переменная файла будет содержать этот путь к файлу. Кроме того, вы можете запросить несколько файлов:
Указание типа файлов (расширение фильтра файлов)
Вы можете запросить каталог, используя метод askdirectory :
Вы можете указать начальную директорию для диалогового окна файла, указав initialdir следующим образом:
Добавление панели меню
Для добавления панели меню, используйте класс menu :
Сначала мы создаем меню, затем добавляем наш первый пункт подменю. Вы можете добавлять пункты меню в любое меню с помощью функции add_cascade() таким образом:
Наш код будет выглядеть так:


Можно отключить эту функцию, с помощью tearoff подобным образом:
Добавление виджета Notebook (Управление вкладкой)
Для удобного управления вкладками реализуйте следующее:

Добавление виджетов на вкладку
После создания вкладок вы можете поместить виджеты внутри этих вкладок, назначив родительское свойство нужной вкладке.
Добавление интервала для виджетов (Заполнение)
Передайте padx и pady любому виджету и задайте значение.
В этом уроке мы увидели много примеров GUI Python с использованием библиотеки Tkinter. Так же рассмотрели основные аспекты разработки графического интерфейса Python. Не стоит на этом останавливаться. Нет учебника или книги, которая может охватывать все детали. Надеюсь, эти примеры были полезными для вас.
Как открыть окно в питоне
Первый модуль Python window_01.py создает пустое окно 200×150 с названием «myWindow», расположенное в центре экрана.
Данная строка загружает в Python весь модуль Tkinter целиком. В результате у Python появляется библиотека для построения оконного интерфейса.
Наконец, в этой строке происходит вызов метода Tk() под названием mainloop(), который держит окно раскрытым, пока оно не будет закрыто нажатием кнопки [x] на окне или вызовом метода Tk() destroy().
Создание «дочернего» окна
Снова довольно просто. Потребовалось лишь три дополнительные строчки кода. Присвойте Toplevel() новой переменной; свяжите его с корневым окном root с помощью Toplevel(root); затем задайте значения пары свойств Toplevel(root). Наконец, запустите window_02.py. Мы движемся быстро. Мы умеем создавать родительское окно и любое число дочерних окон. Закрытие родительского окна вызывает закрытие и окна дочернего, но не наоборот.
Уже похоже на интерфейс.
Вот обобщенная форма для создания классов. Замечание: отступы обязательны!
При запуске модуля на выполнение происходит вызов Python, загрузка Tkinter и сохранение определений классов main и child. Команды, приведенные выше, сначала задают значение переменной root, чтобы создать экземпляр Tk(), затем открывают окно, активируя main [который, в свою очередь, активирует child]. Обратите внимание, что mainloop() расположен «внутри» класса main. Запустите window_03.py. Он должен сделать то же самое, что и предыдущий пример.
Классы и элементы управления
Запустите следующий модуль, что б ознакомится с элементами управления window_04.py.
Оставим на время разработку дочернего окна, чтобы сосредоточить все внимание на классах. Рассмотрим, как передавать классу информацию, и добавим к классу элемент управления [в данном случае кнопку (Button)], [и объект и окно].
В последнем примере window_03.py вас, возможно, удивило, что класс main содержит ссылку на переменную root, которая в программе еще не создана. Я сделал это специально, чтобы продемонстрировать, что классы ничего не делают, пока на их базе не будут созданы экземпляры объектов. Но есть лучший путь достичь того же самого. Объекту можно передать глобальную переменную root, и именно так сделано в нашем коде. Благодаря вызову main(root) параметр root передается переменной master класса main. В последующих примерах подобным же образом мы будем передавать классам множество различных параметров.
Между прочим, эта кнопка пока ничего не делает. Итак, запускаем window_04.py и нажимаем бесполезную кнопку.
Любая кнопка должна что-нибудь делать. В данном случае мы свяжем событие «нажатие кнопки» с открытием дочернего окна из одного из прошлых примеров. Для этого в класс main вводится метод openDialog, который создает экземпляр объекта child.
Обращение к openDialog содержит вездесущее self. Это означает, что метод openDialog является внутренним по отношению к main.
Toplevel() из класса child узнает о том, что относится к дочернему классу класса main, довольно мучительным путем. Tk(), связанный с root, передается классу main через параметр master [в main], а затем пересылается другому параметру master [в child]. Всякий класс имеет свою переменную master, локальную по отношению к данному классу. Их имена могут быть различными. Ага! Метод. Запускаем window_05.py и испытываем работающую кнопку.
Модальное дочернее окно
В некоторых программах требуется для вывода информации создать дочернее окно, продолжая в тоже время использовать главное. При этом часто бывает нужно, чтобы все процессы, происходящие в дочернем окне, завершились до того, как вы продолжите работу. Такое окно называют модальным. Это значит, что оно будет удерживать фокус пока не будет закрыто. В Python дочернее окно можно превратить в модальное с помощью трех методов Toplevel():
child перехватывает все события, происходящие в приложении.
child захватывает фокус.
child ждет, когда будет уничтожен текущий объект, не возобновляя работы [но и не оказывая влияния на основной цикл].
Итак, рецепт. Если нужно создать модальное окно, воспользуйтесь этими тремя методами. Как говорится, «Просто сделай это!» window_06.py
Отсылка сообщения от родительского элемента к дочернему
Модальные дочерние окна используются, главным образом, в роли диалоговых окон. Нам нужен способ передачи информации от родительского окна к дочернему и наоборот. Сперва пойдем от main к child. В данный пример внесено три добавления по сравнению с предыдущими: Поле для ввода текста в классе main. Текстовое окно в классе child для отображения введенной информации. Механизм передачи информации от текстового окна в main текстовому окну в child.
Стоит создать один элемент управления, как все остальное становится ясно. Единственно стоит отметить, что элемент управления text имеет свойство background (фон) со значением ‘white’ (белый) и что пришло время поговорить о pack. Метод pack() размещает в окне элемент управления. Итак: side (сторона) определяет, какой стороны окна будет «держаться» элемент управления варианты: TOP (сверху) RIGHT (справа) LEFT (слева) BOTTOM (снизу) по умолчанию: NONE (никак) fill (заполнение) показывает, заполнит элемент доступное пространство или нет. варианты: X Y BOTH (X Y оба) по умолчанию: NONE (никак) expand (растяжение) указывает, будет ли элемент управления менять свой размер при изменении размеров окна. варианты: YES (да) по умолчанию: 0
В метод openDialog() мы ввели инструкцию self.text.get(‘0.0’, END), которая является методом элемента управления Text. Она собирает все содержимое текстового окна от строки 0 символа 0 и до конца, чтобы передать его классу/окну child [как myText].
Как работает текстовый элемент управления child интуитивно ясно. Он заполняется текстом из главного окна посредством def __init__(self, master, myText = »). Информация из myText вставляется в элемент управления text с помощью метода self.text.insert(‘0.0’, myText), который помещает ее, начиная со строки 0 символа 0. Испытайте window_07.py, напечатав в нем какой-нибудь текст и отослав его.
Отсылка сообщений в обоих направлениях
Сначала посмотрите на код window_08.py.
При вызове дочернего метода go введенный текст вставляется в дочернее текстовое окно. Если текст редактировался и пользователь нажимает кнопку accept, исправленный текст возвращается как newValue. Если дочернее окно просто закрывается, newValue возвращается с пустым значением.
При возврате метод openDialog класса main осуществляет проверку. Если возвращаемая строка не пустая, возвращаемый текст будет вставлен в текстовое окно main.
Запускаем window_08.py. Убедитесь, что вы «уловили», как работает go. Нам придется еще довольно много иметь дело с этим методом.
Мы приближаемся к концу начала. Рассмотрим еще несколько приемов, которые будут использоваться позднее в «реальном» приложении: кнопки принятия (accept) и отмены (cancel), а также «перехват» закрытия основного окна с соответствующим диалогом.
«Перехват» закрытия пользователем главного окна немного сложнее. Для чего это может потребоваться? Допустим, в случае текстового редактора нам бы хотелось фиксировать ситуации, когда не был сохранен измененный файл, чтобы предохранить пользователя от нечаянного уничтожения плодов всех его усилий из-за преждевременного закрытия окна.
Запустите window_09.py, чтобы увидеть нашу программу в действии.
Мини-руководство по Tkinter
| Класс | Свойства | Методы |
|---|---|---|
| Tk() | ||
| Toplevel() | parent | title(string); geometry(string); mainloop(); destroy() |
| Button() | parent; text = string; command = method | pack(side) |
| Text() | parent | pack(side, fill, expand); insert(index, string); get(index1, index2); delete(index1, index2) |
| Label() | parent | configure(text = string); pack(side, fill, expand) |
| Frame() | parent | pack(side, fill) |
Итак, пришло время переходить к следующей части руководства.
Tkinter в Python: руководство по использованию
Tkinter — графическая библиотека Python, которая предназначена для создания программ с оконным интерфейсом. Она кроссплатформенная, то есть с ее помощью можно писать приложения для Windows, Linux, macOS.
Как я поделился своими чувствами, что познал вселенную Tkinter
Tkinter в Python
Tkinter — это интерфейс Tcl/Tk. На английском его обычно называют «тикль-ток», на русском — «так-тикль».
Tcl — это скриптовый язык. Tk — кроссплатформенная графическая библиотека.
Область применения Tcl/Tk — быстрое прототипирование. С его помощью создают графические интерфейсы, встраивают новые сценарии в программы, тестируют.
Чтобы работать с Tcl/Tk на Python, используется библиотека Tkinter. Чтобы узнать больше о том, как с ней взаимодействовать, изучите документацию.
В результате должно запуститься окно, в котором указана версия Tcl/Tk, а также две кнопки — Click me и Quit.
Создание простого GUI приложения на Tkinter
В этом руководстве мы будем писать первое приложение на Tkinter в среде Windows. В качестве IDE используем Visual Studio Code. Подразумевается, что вы владеете основами Python. Все примеры кода написаны на Python 3.9.
Установка Tk
Прежде чем использовать библиотеку Tkinter, нужно убедиться, что в системе стоит последняя версия Tk. В противном случае могут возникнуть ошибки при компиляции.
Вам нужна версия 8.6 и выше. Если в системе установлена версия 8.4 или 8.5, нужно ее обновить. Самый простой способ сделать это — установить одну из последних версий Python. Начиная с версии 3.7 в ядре Python предустановлен Tcl/Tk версии 8.6.
После завершения установки запустите консоль и проверьте, какая версия Python используется по умолчанию. Должна быть 3.7 и выше. Если версия отличается, переключитесь на установленную ранее.
Hello, World!
Начнем традиционно — поздороваемся с миром. Для этого сделаем простое окно, у которого будет только заголовок.
Откроется окно вашей первой программы с заголовком Hello, World !
Особенность Tkinter в том, что библиотека автоматически подстраивает внешний вид окна под стиль операционной системы. Так окно выглядит на Windows. На Linux и macOS оно будет другим, соответствующим стилю системы.
Источник изображения: python-scripts.com/tkinter
Базовые виджеты
Виджеты — это основа библиотеки Tkinter. Через них пользователи взаимодействуют с программой.
Каждый виджет определен классом. Вот основные семь:
| Класс виджета | Что делает | Пример использования |
| Frame | Помогает организовать пользовательский интерфейс как визуально, так и на уровне кода. Отображается как простой прямоугольник. | Разделение интерфейса на блоки. |
| Label | Виджет для отображения текста или изображения. Пользователи могут его просматривать, но не могут взаимодействовать с ним. | Заголовки, подписи, иконки в интерфейсе. |
| Button | Это элемент интерфейса, с которым пользователи могут взаимодействовать. На кнопку нажимают, чтобы выполнить действие. Button может отображать текст и изображение, как и Label, но также может принимать дополнительные параметры для изменения поведения. | Кнопки в интерфейсе: для перехода, сохранения, выхода из программы. |
| Checkbutton | Разновидность кнопки, которая содержит двоичное значение. При нажатии переключатель переворачивается, затем происходит обратный вызов. | Включение и выключение опций с помощью галочек. |
| Radiobutton | Кнопка, которая позволяет выбрать один из нескольких взаимоисключающих вариантов. | Список с опциями, например, для выбора языка интерфейса. |
| Entry | Виджет для ввода одной строки текста. | Указание имени, пароля, города и других данных пользователей. |
| Combobox | Объединяет Entry со списком опций. Пользователи могут выбирать из предложенных вариантов или указывать свои. | Выпадающий список. |
Это лишь базовые виджеты. Посмотреть их подробное описание можно в официальной документации Tk. Там же есть и другие стандартные виджеты — например, скроллбар, шкала прогресса, список.
Управление геометрией
Например, вот так просто можно разместить три кнопки в ряд:
В grid() также можно гибко управлять размерами виджетов при расширении и уменьшении окна.
По умолчанию pack() размещает виджеты друг над другом и центрирует. Настроить расположение элементов можно с помощью ключевых аргументов. Например, вот так можно расширить виджет по горизонтали на всю ширину экрана:
Примечательно, что pack() реагирует на расширение экрана. То есть виджет будет растягиваться и сворачиваться при изменении ширины окна.
Например, вот так можно развернуть наши виджеты налево:
Менеджер place() используется все реже. У него два недостатка:
Но в некоторых случаях place() подходит — например, если нужно создать интерфейс для географической карты и разместить виджеты на правильном расстоянии друг от друга.
У pack() тоже есть недостаток. Так как расположение виджетов зависит от порядка вызова метода, приложения сложно модифицировать без полного понимания кода. В grid() эти проблемы решены, поэтому он сейчас используется чаще, чем другие менеджеры геометрии. Больше полезной информации о менеджере grid() вы найдете в документации.
Примеры использования виджетов
Чтобы лучше понять концепцию создания и размещения виджетов, давайте разберем несколько примеров.
Здесь мы добавляем текст с помощью виджета Label и кнопку с помощью виджета Button :
Получаем вот такой результат:
Теперь после нажатия на кнопку текст Label будет меняться на тот, который мы указали внутри функции:

Мы получим такой результат:

Пишем простой калькулятор
Используем полученные знания, чтобы написать первое приложение на Tkinter. Пусть это будет очень простой калькулятор, который умеет совершать основные математические операции: складывать, вычитать, умножать, делить. У него также будет кнопка очистки для удаления введенных или выведенных данных.
Определим базовое расположение элементов калькулятора. Начнем со строки, в которую пользователь вводит цифры. В ней же отображается результат расчетов:
Теперь создадим все кнопки, которые нужны нашему калькулятору. Цифры от 1 до 0, знаки сложения, вычитания, деления, умножения, кнопки вывода результата и очистки строки:
Теперь нужно расположить кнопки в интерфейсе, используя менеджер геометрии grid :
Осталось определить логику для каждого действия пользователя : нажатия на цифру, знаки математических операций:

Полный код приложения:
Заключение
Чтобы потренироваться с Tkinter, создайте еще несколько простых приложений. В качестве руководства можно использовать это видео от freeCodeCamp. Это мини-курс по Tkinter, в рамках которого вы создадите программу для просмотра картинок. Это будет минималистическое приложение для погоды.
А с этого видео начинается курс по Trinter на русском языке. В нем 28 уроков, вторая половина которых посвящена созданию игры «Сапер» на Python.










