Tkinter.Tk: примеры (PYTHON)

Функция tkinter.Tk: создание главного окна приложения
Раздел: GUI, Окна
tkinter.Tk(screenName: str, baseName: str): Tk object

Функция Tk() в модуле tkinter

Функция tkinter.Tk() является конструктором класса Tk. Она создает и возвращает главное окно приложения, которое является корневым объектом для всех виджетов в программе с графическим интерфейсом.

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

Аргументы

Конструктор Tk() не принимает обязательных аргументов, но поддерживает несколько необязательных именованных параметров для базовой настройки:

  • screenName: Устанавливает имя экрана для окна. Может влиять на отображение в оконном менеджере.
  • baseName: Базовое имя, используемое при поиске файлов ресурсов.
  • className: Имя класса для окна. Это имя используется в качестве имени приложения и может влиять на настройки, получаемые из файлов ресурсов.
  • useTk: Если установлено в True (по умолчанию), инициализирует подсистему Tk. Параметр используется внутренне.

Возвращаемое значение

Функция возвращает объект типа tkinter.Tk, который представляет главное окно приложения. Этот объект предоставляет методы для управления окном (изменение заголовка, размеров, обработка событий) и служит родительским контейнером для других виджетов.

Простые примеры использования

Создание простейшего пустого окна.

import tkinter as tk

root = tk.Tk()
root.mainloop()
(Открывается пустое окно с заголовком "tk" и стандартными размерами)

Использование параметра className для изменения имени приложения.

import tkinter as tk

root = tk.Tk(className="МоёПриложение")
root.mainloop()
(Открывается окно, в заголовке которого отображается "МоёПриложение")

Создание окна с заданным заголовком и минимальным размером.

import tkinter as tk

root = tk.Tk()
root.title("Пример 3")
root.minsize(400, 300)
root.mainloop()
(Открывается окно с заголовком "Пример 3", минимальная ширина 400px, высота 300px)

Альтернативы и похожие функции в Python

В рамках tkinter для создания окон можно использовать класс Toplevel.

  • tkinter.Toplevel(): Создает дополнительное окно верхнего уровня, а не главное. Главное окно создается через Tk(). Toplevel зависит от главного окна - если закрыть главное окно, все дочерние окна Toplevel также закроются. Используется для создания диалоговых окон, справки или многодокументного интерфейса.

Для более сложных или современных интерфейсов существуют альтернативные библиотеки:

  • PyQt/PySide: Мощные библиотеки, связывающие Python с Qt. Предлагают более широкий набор виджетов, лучшую стилизацию и поддержку современных функций ОС. Используются для создания профессиональных приложений.
  • wxPython: Использует нативные виджеты операционной системы, что обеспечивает более привычный внешний вид приложениям. Подходит для проектов, где важна интеграция с платформой.
  • Kivy: Фреймворк, ориентированный на создание мультитач-приложений. Хорошо подходит для мобильных интерфейсов и приложений с нестандартным дизайном.

Выбор между Tk() и этими альтернативами зависит от сложности проекта, требований к внешнему виду и производительности. tkinter входит в стандартную библиотеку и идеален для простых и быстрых решений.

Создание окон в других языках программирования

В других экосистемах существуют свои подходы к созданию главного окна.

JavaScript (Electron/Node.js)

// Использование Electron
const { app, BrowserWindow } = require('electron')

function createWindow () {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
  })
  win.loadFile('index.html')
}

app.whenReady().then(createWindow)
(Создается нативное окно ОС, содержащее встроенный браузер Chromium для отображения HTML/CSS/JS)

Отличие: Вместо описания интерфейса кодом на Python, интерфейс в Electron описывается веб-технологиями. Окно является гибридным.

Java (Swing)

import javax.swing.*;

public class MainWindow {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Мое приложение");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setVisible(true);
    }
}
(Создается окно с использованием фреймворка Swing. Окно является нативным для платформы)

Отличие: В Java объект JFrame аналогичен Tk(), но требует явной настройки операции закрытия и размера перед отображением.

C# (Windows Forms)

using System.Windows.Forms;

namespace MyApp {
    static class Program {
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); // Form1 - класс, описывающий окно
        }
    }
}
// В отдельном файле обычно описывается класс Form1
(Запускается цикл сообщений Windows для отображения формы. Интерфейс часто проектируется визуально)

Отличие: В C# окно (форма) обычно описывается в отдельном классе, наследуемом от Form, и часто создается с помощью дизайнера, а не только кодом.

Golang (fyne.io)

package main

import "fyne.io/fyne/v2/app"

func main() {
    myApp := app.New()
    myWindow := myApp.NewWindow("Hello")
    myWindow.ShowAndRun()
}
(Создается кроссплатформенное окно с использованием графической библиотеки Fyne, отрисовывающей виджеты через OpenGL)

Отличие: Функционал создания окна разделен между объектом приложения (app) и окна (Window). GUI отрисовывается, а не использует нативные виджеты ОС напрямую.

Частые ошибки и проблемы

При работе с tkinter.Tk() можно столкнуться со следующими ошибками.

Создание более одного экземпляра Tk()

import tkinter as tk

root1 = tk.Tk()
label1 = tk.Label(root1, text="Окно 1")
label1.pack()

# ОШИБКА: Создание второго главного окна в том же потоке
root2 = tk.Tk()
label2 = tk.Label(root2, text="Окно 2")
label2.pack()

root1.mainloop()
(Программа может работать некорректно, виджеты могут появляться не в тех окнах, возможны ошибки в работе mainloop. Для создания нескольких окон следует использовать Toplevel.)

Обращение к окну после вызова mainloop()

import tkinter as tk

root = tk.Tk()
root.mainloop()  # Цикл блокирует выполнение дальше этой строки

# Этот код выполнится только после закрытия окна
root.title("Новый заголовок")  # Не изменит заголовок, т.к. окно уже уничтожено
(Попытка изменить свойства уничтоженного окна может не иметь эффекта или вызвать ошибку времени выполнения. Вся настройка должна происходить до mainloop().)

Использование tkinter без импорта

# Пропущен импорт
root = Tk()  # NameError: name 'Tk' is not defined
NameError: name 'Tk' is not defined

История изменений

Интерфейс функции Tk() в tkinter остается стабильным на протяжении многих версий Python, что обеспечивает обратную совместимость. Ключевые изменения касаются в основном внутренней реализации и поддержки новых возможностей Tcl/Tk, на которых базируется tkinter.

  • Python 3.7: Улучшения в обработке высоких DPI-экранов на Windows.
  • Python 3.8: Продолжение работ по улучшению масштабирования для HiDPI-дисплеев.
  • Python 3.11: В составе CPython обновлена базовая версия Tcl/Tk до 8.6. Это принесло исправления ошибок и небольшие улучшения в производительности и внешнем виде на некоторых платформах.

Аргументы функции и ее базовое поведение не претерпели изменений.

Расширенные примеры использования

Создание окна с центрированием на экране при запуске.

Пример python
import tkinter as tk

def center_window(window, width, height):
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width // 2) - (width // 2)
    y = (screen_height // 2) - (height // 2)
    window.geometry(f'{width}x{height}+{x}+{y}')

root = tk.Tk()
root.title("Центрированное окно")
center_window(root, 600, 400)
root.mainloop()
(Окно размером 600x400 пикселей появляется точно в центре экрана пользователя)

Использование screenName и className для сложной идентификации.

Пример python
import tkinter as tk

# Эти параметры могут влиять на получение ресурсов из .Xdefaults или реестра.
root = tk.Tk(screenName='mainDisplay', className='MyTkApp')
root.title("Окно с параметрами идентификации")
# Свойство Tk можно посмотреть
print(root._name)  # Имя окна внутри Tk
root.mainloop()
mainDisplay
(Окно откроется с заданными внутренними идентификаторами, что может быть полезно для сценариев с несколькими дисплеями или специфичными настройками темы)

Создание нестандартного окна (без рамки) с последующим добавлением своих элементов управления.

Пример python
import tkinter as tk

root = tk.Tk()
root.overrideredirect(True)  # Убирает рамку окна и заголовок
root.geometry("300x200+500+300")

# Создаем свою кнопку для закрытия окна
close_btn = tk.Button(root, text="Закрыть", command=root.destroy)
close_btn.place(x=120, y=85)

# Добавляем возможность перетаскивания окна за клик мыши
def start_move(event):
    root.x = event.x
    root.y = event.y

def stop_move(event):
    root.x = None
    root.y = None

def do_move(event):
    deltax = event.x - root.x
    deltay = event.y - root.y
    x = root.winfo_x() + deltax
    y = root.winfo_y() + deltay
    root.geometry(f"+{x}+{y}")

root.bind("", start_move)
root.bind("", stop_move)
root.bind("", do_move)

root.mainloop()
(Появляется окно без рамки и стандартных кнопок. Его можно перетаскивать мышью за любое место. Для закрытия используется кастомная кнопка)

Работа с протоколом закрытия окна.

Пример python
import tkinter as tk
from tkinter import messagebox

def on_closing():
    if messagebox.askyesno("Выход", "Вы уверены, что хотите выйти?"):
        root.destroy()

root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", on_closing)

label = tk.Label(root, text="Попробуйте закрыть окно через крестик")
label.pack(pady=20)

root.mainloop()
(При попытке закрыть окно появится диалоговое окно с подтверждением. Окно закроется только после согласия пользователя)

питон tkinter.Tk function comments

En
Tkinter.Tk Create main window