Как можно сделать более современный стиль у вкладок с помощью tkinter?

Пытаюсь реализовать вкладки у программы на tkinter (pywinstyles по неясным причинам упорно не ставится на комп с Win10 через pip install, на ноуте c Win11 поставился). В tkinter'e я новичок; ниже - код, который реализует подобие вкладок, но не совсем то, что хотелось получить.

from tkinter import *  
window = Tk()  
window.title("Тест")  
window.geometry('400x250')  
menu = Menu(window)


new_item = Menu(menu)  
new_item.add_command(label='Новый')  
new_item.add_separator()  
new_item.add_command(label='Изменить')  
menu.add_cascade(label='Файл', menu=new_item) 

new_item1 = Menu(menu)  
new_item1.add_command(label='О программе')  
new_item1.add_separator()  
new_item1.add_command(label='Изменить')  
menu.add_cascade(label='О', menu=new_item1)

Фото тестовой программы с видом вкладок:

Фото тестовой программы с видом вкладок

Хотелось бы получить результат, как у вкладок IDLE (см. сравнение на скриншоте). Не уверен, но может быть, это можно сделать и на ttk (с его помощью, например, удалось сделать кнопку в современном стиле, в отличие от tk, реализация кнопок в котором напоминает примитивный стиль WinForms). Грубо говоря, подскажите, пожалуйста, как получить вкладки, выглядящие внешне более современно (в стиле WinUI). Если не сложно, приведите пример кода, буду очень признателен. PS: Python 3.13


Ответы (1 шт):

Автор решения: Ben Puls

Меню

Исходный код IDLE открытый. Можно самому посмотреть реализацию элементов. Также сам IDLE, если посмотреть исходный код, написан с помощью tkinter.

Меню подобное IDLE можно сделать достаточно просто:

import tkinter as tk

def new_file():
    pass

def open_file():
    pass

def save_file():
    pass

def exit_app():
    pass

def about():
    pass

root = tk.Tk()
root.title("Application")
root.geometry("600x400")

menu_bar = tk.Menu(root)

file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Новый", command=new_file)
file_menu.add_command(label="Открыть", command=open_file)
file_menu.add_command(label="Сохранить", command=save_file)
file_menu.add_separator()
file_menu.add_command(label="Выход", command=exit_app)
menu_bar.add_cascade(label="Файл", menu=file_menu)

help_menu = tk.Menu(menu_bar, tearoff=0)
help_menu.add_command(label="О программе", command=about)
menu_bar.add_cascade(label="Справка", menu=help_menu)

root.config(menu=menu_bar)

root.mainloop()

menu like IDLE

Стилизация

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

введите сюда описание изображения

Кроме того, tkinter поддерживает стилизацию. Это позволяет стилизовать каждый элемент. Стилизация доступна как на языке Tcl (документ о стилизации), так и внедрение стилей прямо в python коде, как описано в документации выше.

Несколько реализаций:

  • Forest theme for ttk (GitHub)

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка