CustomTkinter документация

Загрузка

pip install customtkinter

Обновление

pip install customtkinter --upgrade

CustomTkinter — это библиотека пользовательского интерфейса Python, основанная на Tkinter, которая предоставляет новые, современные и полностью настраиваемые виджеты. Они создаются и используются как обычные виджеты Tkinter, а также могут использоваться в сочетании с обычными элементами Tkinter. Цвета виджетов и окон либо адаптируются к внешнему виду системы, либо к заданному вручную режиму («светлый», «темный»), а все виджеты и окна CustomTkinter поддерживают масштабирование HighDPI (Windows, macOS). С CustomTkinter вы получите единообразный и современный вид на всех настольных платформах (Windows, macOS, Linux).

Документация

На Гитхабе

Базовое приложение

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

import customtkinter

app = customtkinter.CTk()
app.mainloop()

Если это работает, вы можете начать устанавливать свойства окна, такие как titleи geometry, и начать добавлять кнопку в окно. Первым параметром любого виджета всегда является главный параметр, как appв данном случае. Его также можно задать с аргументом ключевого слова ( master=app).

import customtkinter

def button_callback():
print("button pressed")

app = customtkinter.CTk()
app.title("my app")
app.geometry("400x150")

button = customtkinter.CTkButton(app, text="my button", command=button_callback)
button.grid(row=0, column=0, padx=20, pady=20)

app.mainloop()
кнопка по центру

Менеджер геометрии сетки

В этом примере gridменеджер геометрии используется для установки положения и заполнения виджета. Настоятельно рекомендуется всегда использовать gridдиспетчер геометрии вместо placeи pack, потому что очень легко создавать отзывчивые и расширяемые пользовательские интерфейсы.

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

app.grid_columnconfigure(0, weight=1)
кнопка

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

button.grid(row=0, column=0, padx=20, pady=20, sticky="ew")
кнопка растянута

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

Добавьте флажки

Чтобы немного усложнить макет, мы добавляем два флажка во второй строке.

checkbox_1 = customtkinter.CTkCheckBox(app, text="checkbox 1")
checkbox_1.grid(row=1, column=0, padx=20, pady=(0, 20), sticky="w")
checkbox_2 = customtkinter.CTkCheckBox(app, text="checkbox 2")
checkbox_2.grid(row=1, column=1, padx=20, pady=(0, 20), sticky="w")
кнопка и галочки

Обратите внимание, что padyаргумент получает кортеж, что означает отступ 0 сверху и отступ 20 снизу. Также обратите внимание, что флажки прикреплены только к западной стороне их ячейки сетки. Чтобы кнопка снова занимала все окно, нам нужно установить columnspanдля нее значение 2 (используйте rowspanдля строк).

button.grid(row=0, column=0, padx=20, pady=20, sticky="ew", columnspan=2)

И чтобы одинаково разместить флажки, нам также нужно придать обоим столбцам одинаковый вес.

app.grid_columnconfigure((0, 1), weight=1)

Полная программа теперь выглядит так:

def button_callback():
print("button pressed")

app = customtkinter.CTk()
app.title("my app")
app.geometry("400x150")
app.grid_columnconfigure((0), weight=1)

button = customtkinter.CTkButton(app, text="my button", command=button_callback)
button.grid(row=0, column=0, padx=20, pady=20, sticky="ew", columnspan=2)
checkbox_1 = customtkinter.CTkCheckBox(app, text="checkbox 1")
checkbox_1.grid(row=1, column=0, padx=20, pady=(0, 20), sticky="w")
checkbox_2 = customtkinter.CTkCheckBox(app, text="checkbox 2")
checkbox_2.grid(row=1, column=1, padx=20, pady=(0, 20), sticky="w")

app.mainloop()
растянутая кнопка и чекбоксы

Использование классов

Чтобы завершить это введение, мы хотим структурировать эту программу в класс. Настоятельно рекомендуется использовать классы, которые наследуют от, CTkдля главного окна или CTkFrameдля фрейма, потому что это значительно повышает читабельность кода, и код становится легко расширяемым, поскольку классы можно легко распределить по нескольким файлам.ОСТОРОЖНОСТЬ

За исключением небольших программ или тестов, всегда создавайте отдельные классы для CTkCTkToplevelили CTkFrame. Написание большого количества кода пользовательского интерфейса в одном файле без использования классов — это боль для чтения и очень плохой стиль кодирования.

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x150")
self.grid_columnconfigure((0, 1), weight=1)

self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=0, column=0, padx=20, pady=20, sticky="ew", columnspan=2)
self.checkbox_1 = customtkinter.CTkCheckBox(self, text="checkbox 1")
self.checkbox_1.grid(row=1, column=0, padx=20, pady=(0, 20), sticky="w")
self.checkbox_2 = customtkinter.CTkCheckBox(self, text="checkbox 2")
self.checkbox_2.grid(row=1, column=1, padx=20, pady=(0, 20), sticky="w")

def button_callback(self):
print("button pressed")

app = App()
app.mainloop()

Использование фреймов

Создание кадра

Начнем с аналогичного примера, чем в заставке, окно с кнопкой и некоторыми флажками:

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x180")
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure((0, 1), weight=1)

self.checkbox_1 = customtkinter.CTkCheckBox(self, text="checkbox 1")
self.checkbox_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_2 = customtkinter.CTkCheckBox(self, text="checkbox 2")
self.checkbox_2.grid(row=1, column=0, padx=10, pady=(10, 0), sticky="w")
self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew")

def button_callback(self):
print("button pressed")

app = App()
app.mainloop()
кнопка и галочки

Если теперь мы хотим добавить еще один флажок в строке 2, нам также придется изменить номер строки кнопки. Таким образом, подобное изменение требует изменений в макете под флажком. Чтобы предотвратить такие побочные эффекты, сохранить изменения и визуально структурировать макет, мы используем фреймы.

Мы помещаем рамку в строку 0, кнопку в строку 1 и настраиваем строку 0 и столбец 0 для расширения. Кадр получает фиксированный параметр «nsw», поэтому он расширяется вместе со своей ячейкой на север, юг и запад. Флажки теперь получают кадр в качестве главного аргумента вместо self.

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x180")
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)

self.checkbox_frame = customtkinter.CTkFrame(self)
self.checkbox_frame.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsw")
self.checkbox_1 = customtkinter.CTkCheckBox(self.checkbox_frame, text="checkbox 1")
self.checkbox_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_2 = customtkinter.CTkCheckBox(self.checkbox_frame, text="checkbox 2")
self.checkbox_2.grid(row=1, column=0, padx=10, pady=(10, 0), sticky="w")

self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew")

def button_callback(self):
print("button pressed")
кнопка и флажки в рамке

Использование классов

А чтобы отразить макет в коде и следовать принципу всегда использовать классы из интро, мы вынесем код фрейма и флажка в отдельный класс. Этот класс наследуется CTkFrame, и экземпляр этого класса создается в основном Appклассе. Только основной аргумент должен быть передан в __init__метод нового MyCheckboxFrame, чтобы затем его можно было передать в __init__суперкласс, который является CTkFrame.

class MyCheckboxFrame(customtkinter.CTkFrame):
def __init__(self, master):
super().__init__(master)

self.checkbox_1 = customtkinter.CTkCheckBox(self, text="checkbox 1")
self.checkbox_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_2 = customtkinter.CTkCheckBox(self, text="checkbox 2")
self.checkbox_2.grid(row=1, column=0, padx=10, pady=(10, 0), sticky="w")

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x180")
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)

self.checkbox_frame = MyCheckboxFrame(self)
self.checkbox_frame.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsw")

self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew")

def button_callback(self):
print("button pressed")

app = App()
app.mainloop()

Теперь мы можем просто добавить еще один флажок в MyCheckboxFrameкласс, не затрагивая макет кнопки:

class MyCheckboxFrame(customtkinter.CTkFrame):
def __init__(self, master):
super().__init__(master)

self.checkbox_1 = customtkinter.CTkCheckBox(self, text="checkbox 1")
self.checkbox_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_2 = customtkinter.CTkCheckBox(self, text="checkbox 2")
self.checkbox_2.grid(row=1, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_3 = customtkinter.CTkCheckBox(self, text="checkbox 3")
self.checkbox_3.grid(row=2, column=0, padx=10, pady=(10, 0), sticky="w")
кнопка и флажки с классами

Расширить класс

Конечно, нам нужен способ считывать значения флажков из основного Appкласса. Поэтому мы реализуем getметод для MyCheckboxFrameкласса, который будет возвращать список строк с текстовыми атрибутами отмеченных флажков:

class MyCheckboxFrame(customtkinter.CTkFrame):
def __init__(self, master):
super().__init__(master)

self.checkbox_1 = customtkinter.CTkCheckBox(self, text="checkbox 1")
self.checkbox_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_2 = customtkinter.CTkCheckBox(self, text="checkbox 2")
self.checkbox_2.grid(row=1, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkbox_3 = customtkinter.CTkCheckBox(self, text="checkbox 3")
self.checkbox_3.grid(row=2, column=0, padx=10, pady=(10, 0), sticky="w")

def get(self):
checked_checkboxes = []
if self.checkbox_1.get() == 1:
checked_checkboxes.append(self.checkbox_1.cget("text"))
if self.checkbox_2.get() == 1:
checked_checkboxes.append(self.checkbox_2.cget("text"))
if self.checkbox_3.get() == 1:
checked_checkboxes.append(self.checkbox_3.cget("text"))
return checked_checkboxes

Мы можем использовать этот метод в button_callbackметоде класса App:

    def button_callback(self):
print("checked checkboxes:", self.checkbox_frame.get())

Теперь, если вы нажмете кнопку, будут напечатаны отмеченные в данный момент флажки:

checked checkboxes: ['checkbox 1', 'checkbox 3']

Класс динамического кадра

Но значения флажков MyCheckboxFrameпрямо сейчас жестко запрограммированы в коде. Чтобы сделать MyCheckboxFrameкласс более удобным для динамического использования, мы передаем список строковых значений в MyCheckboxFrame, которые будут текстовыми значениями флажков во фрейме. Теперь количество флажков тоже произвольное.

class MyCheckboxFrame(customtkinter.CTkFrame):
def __init__(self, master, values):
super().__init__(master)
self.values = values
self.checkboxes = []

for i, value in enumerate(self.values):
checkbox = customtkinter.CTkCheckBox(self, text=value)
checkbox.grid(row=i, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkboxes.append(checkbox)

def get(self):
checked_checkboxes = []
for checkbox in self.checkboxes:
if checkbox.get() == 1:
checked_checkboxes.append(checkbox.cget("text"))
return checked_checkboxes

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

self.checkbox_frame = MyCheckboxFrame(self, values=["value 1", "value 2", "value 3"])
self.checkbox_frame.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsw")
кнопка и флажки класс динамического фрейма

Несколько экземпляров

Но теперь, когда мы можем динамически управлять значениями флажков, мы можем очень легко создать два или более экземпляра класса MyCheckboxFrame. Мы должны дать кнопке значение columnspan2 и добавить weightзначение 1 в столбец 1.

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x180")
self.grid_columnconfigure((0, 1), weight=1)
self.grid_rowconfigure(0, weight=1)

self.checkbox_frame_1 = MyCheckboxFrame(self, values=["value 1", "value 2", "value 3"])
self.checkbox_frame_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsew")
self.checkbox_frame_2 = MyCheckboxFrame(self, values=["option 1", "option 2"])
self.checkbox_frame_2.grid(row=0, column=1, padx=(0, 10), pady=(10, 0), sticky="nsew")

self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew", columnspan=2)

def button_callback(self):
print("checkbox_frame_1:", self.checkbox_frame_1.get())
print("checkbox_frame_2:", self.checkbox_frame_2.get())
несколько рамок для флажков

Вывод при нажатии кнопки:

checkbox_frame_1: ['value 1', 'value 3']
checkbox_frame_2: ['option 2']

Добавить заголовок в рамку

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

class MyCheckboxFrame(customtkinter.CTkFrame):
def __init__(self, master, title, values):
super().__init__(master)
self.grid_columnconfigure(0, weight=1)
self.values = values
self.title = title
self.checkboxes = []

self.title = customtkinter.CTkLabel(self, text=self.title, fg_color="gray30", corner_radius=6)
self.title.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="ew")

for i, value in enumerate(self.values):
checkbox = customtkinter.CTkCheckBox(self, text=value)
checkbox.grid(row=i+1, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkboxes.append(checkbox)

def get(self):
checked_checkboxes = []
for checkbox in self.checkboxes:
if checkbox.get() == 1:
checked_checkboxes.append(checkbox.cget("text"))
return checked_checkboxes

Обратите внимание, что столбец 0 внутри фрейма теперь имеет значение weight1, так что метка охватывает весь фрейм со своим stickyзначением «ew». Для аргумента CTkLabelмы передали fg_colorи corner_radius, потому что метка по умолчанию «прозрачна» и имеет значение corner_radius0. Также обратите внимание, что grid rowпозиция теперь i+1 из-за метки заголовка в первой строке.

Теперь нам нужно передать значения для titleпараметра, MyCheckboxFrameкогда мы создаем его экземпляры в Appклассе:

self.checkbox_frame_1 = MyCheckboxFrame(self, "Values", values=["value 1", "value 2", "value 3"])
self.checkbox_frame_2 = MyCheckboxFrame(self, "Options", values=["option 1", "option 2"])

Если мы также увеличим высоту окна до 220 пикселей, мы получим:

несколько рамок флажков с заголовком

Теперь у нас есть заголовки для рамок флажков. И поскольку MyCheckboxFrameон наследуется от CTkFrame, его можно настроить как CTkFrame, например, с прозрачным fg_color:

self.checkbox_frame_2.configure(fg_color="transparent")
несколько прозрачных рамок для флажков

Рамка радиокнопки

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

class MyRadiobuttonFrame(customtkinter.CTkFrame):
def __init__(self, master, title, values):
super().__init__(master)
self.grid_columnconfigure(0, weight=1)
self.values = values
self.title = title
self.radiobuttons = []
self.variable = customtkinter.StringVar(value="")

self.title = customtkinter.CTkLabel(self, text=self.title, fg_color="gray30", corner_radius=6)
self.title.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="ew")

for i, value in enumerate(self.values):
radiobutton = customtkinter.CTkRadioButton(self, text=value, value=value, variable=self.variable)
radiobutton.grid(row=i + 1, column=0, padx=10, pady=(10, 0), sticky="w")
self.radiobuttons.append(radiobutton)

def get(self):
return self.variable.get()

def set(self, value):
self.variable.set(value)

И в Appмы создаем экземпляр, MyRadiobuttonFrameпохожий на MyCheckboxFrame:

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x220")
self.grid_columnconfigure((0, 1), weight=1)
self.grid_rowconfigure(0, weight=1)

self.checkbox_frame = MyCheckboxFrame(self, "Values", values=["value 1", "value 2", "value 3"])
self.checkbox_frame.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsew")
self.radiobutton_frame = MyRadiobuttonFrame(self, "Options", values=["option 1", "option 2"])
self.radiobutton_frame.grid(row=0, column=1, padx=(0, 10), pady=(10, 0), sticky="nsew")

self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew", columnspan=2)

def button_callback(self):
print("checkbox_frame:", self.checkbox_frame.get())
print("radiobutton_frame:", self.radiobutton_frame.get())
несколько рамок радиокнопок с заголовком

Теперь у нас есть два разных динамически созданных фрейма, которые можно использовать для получения ввода от пользователя.

Прокручиваемые фреймы

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

class MyCheckboxFrame(customtkinter.CTkFrame):
def __init__(self, master, values):
super().__init__(master)
self.values = values
self.checkboxes = []

for i, value in enumerate(self.values):
checkbox = customtkinter.CTkCheckBox(self, text=value)
checkbox.grid(row=i, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkboxes.append(checkbox)

def get(self):
checked_checkboxes = []
for checkbox in self.checkboxes:
if checkbox.get() == 1:
checked_checkboxes.append(checkbox.cget("text"))
return checked_checkboxes

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

class MyScrollableCheckboxFrame(customtkinter.CTkScrollableFrame):
def __init__(self, master, title, values):
super().__init__(master, label_text=title)
self.grid_columnconfigure(0, weight=1)
self.values = values
self.checkboxes = []

for i, value in enumerate(self.values):
checkbox = customtkinter.CTkCheckBox(self, text=value)
checkbox.grid(row=i, column=0, padx=10, pady=(10, 0), sticky="w")
self.checkboxes.append(checkbox)

def get(self):
checked_checkboxes = []
for checkbox in self.checkboxes:
if checkbox.get() == 1:
checked_checkboxes.append(checkbox.cget("text"))
return checked_checkboxes

Теперь мы можем создать экземпляр MyScrollableCheckboxFrameв Appклассе и добавить дополнительные значения для проверки функциональности полосы прокрутки:

class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.title("my app")
self.geometry("400x220")
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)

values = ["value 1", "value 2", "value 3", "value 4", "value 5", "value 6"]
self.scrollable_checkbox_frame = MyCheckboxFrame(self, title="Values", values=values)
self.scrollable_checkbox_frame.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsew")

self.button = customtkinter.CTkButton(self, text="my button", command=self.button_callback)
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew", columnspan=2)

def button_callback(self):
print("checkbox_frame:", self.checkbox_frame.get())
print("radiobutton_frame:", self.radiobutton_frame.get())

app = App()
app.mainloop()

Дополнительные примеры прокручиваемых фреймов можно найти в этом примере программы на Github: https://github.com/TomSchimansky/CustomTkinter/blob/master/examples/scrollable_frame_example.py .

Создать Спинбокс

Если вы хотите создавать новые виджеты самостоятельно, потому что вам нужно что-то, что не реализовано с помощью Customtkinter, вы можете легко это сделать. Далее я создал Spinbox на основе значений с плавающей запятой.

Сначала вы создаете новый класс, который наследуется от customtkinter.CTkFrame:

import customtkinter

class WidgetName(customtkinter.CTkFrame):
def __init__(self, *args,
width: int = 100,
height: int = 32,
**kwargs):
super().__init__(*args, width=width, height=height, **kwargs)

Делая это, вы уже имеете виджет, размер которого по умолчанию определяется значениями ширины и высоты атрибутов по умолчанию. И он также поддерживает все атрибуты CTkFrame, такие как fg_color и angle_radius.

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

class FloatSpinbox(customtkinter.CTkFrame):
def __init__(self, *args,
width: int = 100,
height: int = 32,
step_size: Union[int, float] = 1,
command: Callable = None,
**kwargs):
super().__init__(*args, width=width, height=height, **kwargs)

self.step_size = step_size
self.command = command

self.configure(fg_color=("gray78", "gray28")) # set frame color

self.grid_columnconfigure((0, 2), weight=0) # buttons don't expand
self.grid_columnconfigure(1, weight=1) # entry expands

self.subtract_button = customtkinter.CTkButton(self, text="-", width=height-6, height=height-6,
command=self.subtract_button_callback)
self.subtract_button.grid(row=0, column=0, padx=(3, 0), pady=3)

self.entry = customtkinter.CTkEntry(self, width=width-(2*height), height=height-6, border_width=0)
self.entry.grid(row=0, column=1, columnspan=1, padx=3, pady=3, sticky="ew")

self.add_button = customtkinter.CTkButton(self, text="+", width=height-6, height=height-6,
command=self.add_button_callback)
self.add_button.grid(row=0, column=2, padx=(0, 3), pady=3)

# default value
self.entry.insert(0, "0.0")

def add_button_callback(self):
if self.command is not None:
self.command()
try:
value = float(self.entry.get()) + self.step_size
self.entry.delete(0, "end")
self.entry.insert(0, value)
except ValueError:
return

def subtract_button_callback(self):
if self.command is not None:
self.command()
try:
value = float(self.entry.get()) - self.step_size
self.entry.delete(0, "end")
self.entry.insert(0, value)
except ValueError:
return

def get(self) -> Union[float, None]:
try:
return float(self.entry.get())
except ValueError:
return None

def set(self, value: float):
self.entry.delete(0, "end")
self.entry.insert(0, str(float(value)))

Конечно, вы можете добавить метод configure или другие атрибуты для настройки цветов в методе init.

Но с приведенной выше реализацией вы можете использовать счетчик, как показано ниже:

app = customtkinter.CTk()

spinbox_1 = FloatSpinbox(app, width=150, step_size=3)
spinbox_1.pack(padx=20, pady=20)

spinbox_1.set(35)
print(spinbox_1.get())

app.mainloop()
спинбокс по индивидуальному заказу

Цвет и темы

Цвет

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

Объяснение атрибутов цвета CTkButton

Для цветов можно задать одно имя цвета ( "red"), одну шестнадцатеричную строку цвета ( "#FF0000") или цвет кортежа для светлого и темного цветов ( ("red", "darkred")). Текущий цвет будет выбран виджетом автоматически в соответствии с текущим режимом внешнего вида . Таким образом, используя цвет кортежа, виджеты могут иметь разные цвета в светлом и темном режимах внешнего вида. Если вы используете один цвет, то этот цвет будет использоваться как для светлого, так и для темного режима внешнего вида.

Пример:

button = customtkinter.CTkButton(root_tk, fg_color="red")  # single color name
button = customtkinter.CTkButton(root_tk, fg_color="#FF0000") # single hex string
button = customtkinter.CTkButton(root_tk, fg_color=("#DB3E39", "#821D1A")) # tuple color

Темы

По умолчанию все цвета задаются цветовой темой. В настоящее время доступны три темы: "blue""dark-blue"и "green", где «синяя» — стандартная тема. Во всех темах предусмотрены кортежи цветов для светлого и темного режимов внешнего вида .

Вы можете установить тему в начале вашего программирования следующим образом:

customtkinter.set_default_color_theme("dark-blue")  # Themes: "blue" (standard), "green", "dark-blue"

Пользовательские темы

Тема описывается файлом .json следующим образом: dark-blue.json . Вы также можете создать свою собственную тему, чтобы вам не приходилось устанавливать стиль для каждого виджета вручную. Просто скопируйте файл .json выше и измените значения. Затем вы можете загрузить новую тему, передав путь к вашему файлу .json методу .set_default_color_theme:

customtkinter.set_default_color_theme("path/to/your/custom_theme.json")

Внешний вид Режим

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

customtkinter.set_appearance_mode("system")  # default
customtkinter.set_appearance_mode("dark")
customtkinter.set_appearance_mode("light")

Если вы установите режим внешнего вида на "system", текущий режим считывается из операционной системы. Он также будет адаптироваться, если режим внешнего вида операционной системы изменится во время выполнения программы. Обратите внимание, что в Linux он всегда будет в "light"режиме, если установлено значение "system", потому что режим не может быть прочитан из операционной системы в данный момент, это, вероятно, будет реализовано в будущем.

Масштабирование

Поддержка высокого разрешения

CustomTkinter по умолчанию поддерживает масштабирование HighDPI в macOS и Windows. В macOS масштабирование работает автоматически для окон Tk. В Windows приложение получает информацию о DPI ( windll.shcore.SetProcessDpiAwareness(2)) и определяет текущий коэффициент масштабирования дисплея. Затем каждый элемент и размеры окна масштабируются по этому коэффициенту с помощью CustomTkinter.

Пример настроек масштабирования Windows 10

Вы можете отключить это автоматическое масштабирование следующим образом:

customtkinter.deactivate_automatic_dpi_awareness()

Тогда окно будет размытым в Windows со значением масштабирования более 100%.

Пользовательское масштабирование

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

customtkinter.set_widget_scaling(float_value)  # widget dimensions and text size
customtkinter.set_window_scaling(float_value) # window geometry dimensions

Упаковка

Windows PyInstaller (автоматический Py в Exe )

Когда вы создаете .exe в Windows с помощью pyinstaller, вы должны учитывать две вещи. Во-первых, вы не можете использовать --onefileопцию pyinstaller, потому что библиотека customtkinter включает в себя не только файлы .py, но и файлы данных, такие как .json и .otf. PyInstaller не умеет упаковывать их в один .exe-файл, поэтому приходится использовать --onedirопцию.

А во-вторых, вы должны вручную включить каталог customtkinter с опцией --add-datapyinstaller. Потому что по какой-то причине pyinstaller не включает автоматически файлы данных, такие как .json, из библиотеки. Вы можете найти место установки библиотеки customtkinter с помощью следующей команды:

pip show customtkinter

Местоположение будет показано, например:c:\users\<user_name>\appdata\local\programs\python\python310\lib\site-packages

Затем добавьте папку библиотеки следующим образом:--add-data "C:/Users/<user_name>/AppData/Local/Programs/Python/Python310/Lib/site-packages/customtkinter;customtkinter/"

С Auto Py to Exe вы бы сделали это так:

пример autopytoexe --add-data

Для полной команды вы получите что-то вроде этого:

pyinstaller --noconfirm --onedir --windowed --add-data "<CustomTkinter Location>/customtkinter;customtkinter/"  "<Path to Python Script>"

CTk виджеты

Документация аргументов и методов всех виджетов.

CTkButton

Пример кода

def button_event():
print("button pressed")

button = customtkinter.CTkButton(app, text="CTkButton", command=button_event)

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
widthширина кнопки в px
heightвысота кнопки в px
corner_radiusугловой радиус в px
border_widthширина границы кнопки в px
border_spacingрасстояние между текстом и изображением и границей кнопки в пикселях, по умолчанию 2
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет или “прозрачный”
hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста при отключении, кортеж: (light_color, dark_color) или один цвет
textstring
fontшрифт текста кнопки, кортеж: (font_name, size), (установите отрицательное значение размера для размера в пикселях)
textvariableОбъект tkinter.StringVar для изменения текста кнопки
imageпоместить изображение на кнопку, удалить текст, должен быть класс PhotoImage
state«нормальный» (стандартный) или «отключенный» (не кликабельный, более темный цвет)
hoverвключить/отключить эффект наведения: True, False
commandфункция обратного вызова
compoundустановить ориентацию изображения, если изображение и текст заданы (“сверху”, “слева”, “снизу”, “справа”)
anchorвыравнивание текста и изображения в кнопке (“n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, “center”)

Методы

  • .configure(атрибут=значение, … )Все атрибуты можно настроить, например:button.configure(text="new text")
  • .cget(имя_атрибута )Например, передать имя атрибута в виде строки и получить текущее значение атрибута.text = button.cget("text")
  • .вызов( )Вызывает команду, если состояние кнопки «отключено».

CTkCheckBox

Пример кода

def checkbox_event():
print("checkbox toggled, current value:", check_var.get())

check_var = customtkinter.StringVar(value="on")
checkbox = customtkinter.CTkCheckBox(app, text="CTkCheckBox", command=checkbox_event,
variable=check_var, onvalue="on", offvalue="off")

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
widthширина всего виджета в px
heightвысота всего виджета в px
checkbox_widthширина флажка в px
checkbox_heightвысота флажка в px
corner_radiusугловой радиус в px
border_widthширина границы поля в пикселях
fg_colorцвет переднего плана (внутри), кортеж: (light_color, dark_color) или один цвет
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет
hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста при отключении, кортеж: (light_color, dark_color) или один цвет
textstring
textvariableTkinter StringVar для управления текстом
fontшрифт текста кнопки, кортеж: (font_name, size)
hoverвключить/отключить эффект наведения: True, False
statetkinter.NORMAL (стандартный) или tkinter.DISABLED (некликабельный, более темный цвет)
commandфункция будет вызываться при нажатии флажка
variableПеременная Tkinter для управления или чтения состояния флажка
onvaluestring или int для переменной в проверенном состоянии
offvaluestring или int для переменной в непроверенном состоянии

Методы

  • .configure (атрибут=значение, … )Все атрибуты могут быть настроены, например checkbox.configure(state="disabled")
  • .cget (имя_атрибута ) Например, передать имя атрибута в виде строки и получить текущее значение атрибута.text = checkbox.cget("text")
  • .get()Получить текущее значение, 1 или 0 (проверено или не проверено).
  • .select() Установите флажок (установите значение 1), команда не будет запущена.
  • ..deselect (Снимите флажок (установите значение 0), команда не будет запущена.
  • .toggle() Перевернуть текущее значение, команда будет активирована.

CTkComboBox

Пример кода

Без переменной:

def combobox_callback(choice):
print("combobox dropdown clicked:", choice)

combobox = customtkinter.CTkComboBox(app, values=["option 1", "option 2"],
command=combobox_callback)
combobox.set("option 2")

С переменной:

def combobox_callback(choice):
print("combobox dropdown clicked:", choice)

combobox_var = customtkinter.StringVar(value="option 2")
combobox = customtkinter.CTkComboBox(app, values=["option 1", "option 2"],
command=combobox_callback, variable=combobox_var)
combobox_var.set("option 2")

Аргументы

аргументценить
masterкорень, фрейм, верхний уровень
widthширина окна в px
heightвысота окна в px
corner_radiusугловой радиус в px
border_widthширина границы в px
fg_colorцвет переднего плана (внутри), кортеж: (light_color, dark_color) или один цвет
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет
button_colorцвет правой кнопки, кортеж: (light_color, dark_color) или один цвет
button_hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
dropdown_fg_colorвыпадающий цвет fg, кортеж: (light_color, dark_color) или один цвет
dropdown_hover_colorЦвет при наведении кнопки раскрывающегося списка, кортеж: (light_color, dark_color) или один цвет
dropdown_text_colorцвет выпадающего текста, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста при отключении, кортеж: (light_color, dark_color) или один цвет
fontшрифт текста кнопки, кортеж: (font_name, size)
dropdown_fontшрифт текста кнопки, кортеж: (font_name, size)
valuesсписок строк со значениями, которые отображаются в раскрывающемся меню
hoverвключить/отключить эффект наведения: True, False
state«нормальный» (стандартный), «отключенный» (не кликабельный, более темный цвет), «только для чтения»
commandфункция будет вызываться при нажатии раскрывающегося списка вручную
variableStringVar для управления или получения текущего текста
justify“справа”, “слева”, “по центру”, ориентация текста внутри записи, по умолчанию “слева”

Методы

  • .configure(атрибут=значение, … ) Все атрибуты можно настроить, например:combobox.configure(values=["new value 1", "new value 2"])
  • .cget (имя_атрибута ) Например, передать имя атрибута в виде строки и получить текущее значение атрибута.state = combobox.cget("state")
  • .set (значение ) Задайте для поля со списком определенное строковое значение. Значение не обязательно должно быть частью списка значений.
  • .get() Получить текущее строковое значение записи в поле со списком.

CTkEntry

Пример кода

entry = customtkinter.CTkEntry(app, placeholder_text="CTkEntry")

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
textvariableобъект tkinter.StringVar
widthширина записи в px
heightвысота входа в px
corner_radiusугловой радиус в px
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет или «прозрачный»
text_colorцвет текста ввода, кортеж: (light_color, dark_color) или один цвет
placeholder_text_colorкортеж: (light_color, dark_color) или один цвет
placeholder_textподсказка при вводе записи (исчезает при выборе), по умолчанию None, не работает в сочетании с текстовой переменной
fontшрифт ввода текста, кортеж: (font_name, size)
state«нормальный» (стандартный) или «отключенный» (не кликабельный)

и следующие аргументы класса tkinter.Entry:

"exportselection", "insertborderwidth", "insertofftime", "insertontime", "insertwidth", "justify", "selectborderwidth", "show", "takefocus", "validate", "validatecommand", "xscrollcommand"

Методы

  • .configure(attribute=value, …) Все атрибуты можно настроить, например:entry.configure(state="disabled")
  • .cget(attribute_name) Передайте имя атрибута в виде строки и получите текущее значение атрибута, например:state = entry.cget("state")
  • .bind(sequence=None, command=None, add=None) Привязать командную функцию к событию, заданному последовательностью.
  • .delete(first_index, last_index=None) Удаляет символы из виджета, начиная с символа в позиции first_index, до символа в позиции last_index, но не включая его. Если второй аргумент опущен, удаляется только один символ в первой позиции.
  • .insert(index, string) Вставляет строку перед символом по заданному индексу .
  • .
  • get() Возвращает текущую строку в записи.
  • Returns
  • .focus()
  • .focus_force( )
  • .индекс(индекс )
  • .icursor(индекс )
  • .select_adjust(индекс )
  • .select_from(индекс )
  • .select_clear( )
  • .select_present( )
  • .select_range(start_index, end_index )
  • .select_to(индекс )
  • .xview(индекс )
  • .xview_moveto(f )
  • .xview_scroll(число, что 

CTkFrame

Пример кода

frame = customtkinter.CTkFrame(master=root_tk, width=200, height=200)

Фрейм структурирован в класс:

class MyFrame(customtkinter.CTkFrame):
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)

# add widgets onto the frame, for example:
self.label = customtkinter.CTkLabel(self)
self.label.grid(row=0, column=0, padx=20)


class App(customtkinter.CTk):
def __init__(self):
super().__init__()
self.geometry("400x200")
self.grid_rowconfigure(0, weight=1) # configure grid system
self.grid_columnconfigure(0, weight=1)

self.my_frame = MyFrame(master=self)
self.my_frame.grid(row=0, column=0, padx=20, pady=20, sticky="nsew")


app = App()
app.mainloop()

Аргументы

аргументценить
masterкорень, фрейм или верхний уровень
widthширина в пикселях
heightвысота в пикселях
border_widthширина границы в px
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет или «прозрачный»
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет

Методы

  • .configure(attribute=value, …) Все атрибуты могут быть настроены.
  • .cget(attribute_name) Передайте имя атрибута в виде строки и получите текущее значение атрибута.
  • .bind(sequence=None, command=None, add=None)

CTkLabel

Пример кода

label = customtkinter.CTkLabel(app, text="CTkLabel", fg_color="transparent")

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
textvariableобъект tkinter.StringVar
textstring
widthширина этикетки в px
heightвысота метки в px
corner_radiusугловой радиус в px
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет или «прозрачный»
text_colorцвет текста метки, кортеж: (light_color, dark_color) или один цвет
fontшрифт текста метки, кортеж: (имя_шрифта, размер)
anchorуправляет расположением текста, если в виджете больше места, чем нужно тексту, по умолчанию «по центру».
compoundуправлять положением изображения относительно текста, по умолчанию “по центру”, остальные: “сверху”, “снизу”, “слева”, “справа”
justifyуказывает, как несколько строк текста будут выровнены относительно друг друга: «слева» для выравнивания по левому краю, «по центру» для выравнивания по центру (по умолчанию) или «справа» для выравнивания по правому краю.
padxдополнительный пробел добавлен слева и справа от текста, по умолчанию 1
padyдополнительный пробел добавлен выше и ниже текста, по умолчанию 1

и другие аргументы tkinter.Label

Методы

  • .configure(attribute=value, …) Все атрибуты можно настроить, например:label.configure(text="new text")
  • .cget(attribute_name) Передайте имя атрибута в виде строки и получите текущее значение атрибута, например:text = label.cget("text")
  • .bind(sequence=None, command=None, add=None) Привязать события к метке.

CTkOptionMenu

Пример кода

Без переменной:

def optionmenu_callback(choice):
print("optionmenu dropdown clicked:", choice)

optionmenu = customtkinter.CTkOptionMenu(app, values=["option 1", "option 2"],
command=optionmenu_callback)
optionmenu.set("option 2")

С переменной:

def optionmenu_callback(choice):
print("optionmenu dropdown clicked:", choice)

optionmenu_var = customtkinter.StringVar(value="option 2")
optionmenu = customtkinter.CTkOptionMenu(app,values=["option 1", "option 2"],
command=optionmenu_callback,
variable=optionmenu_var)

Аргументы

аргументценить
masterкорень, фрейм, верхний уровень
widthширина окна в px
heightвысота окна в px
corner_radiusугловой радиус в px
fg_colorцвет переднего плана (внутри), кортеж: (light_color, dark_color) или один цвет
button_colorцвет правой кнопки, кортеж: (light_color, dark_color) или один цвет
button_hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
dropdown_fg_colorвыпадающий цвет fg, кортеж: (light_color, dark_color) или один цвет
dropdown_hover_colorЦвет при наведении кнопки раскрывающегося списка, кортеж: (light_color, dark_color) или один цвет
dropdown_text_colorцвет выпадающего текста, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста при отключении, кортеж: (light_color, dark_color) или один цвет
fontшрифт текста кнопки, кортеж: (font_name, size)
dropdown_fontшрифт текста кнопки, кортеж: (font_name, size)
hoverвключить/отключить эффект наведения: True, False
state«нормальный» (стандартный) или «отключенный» (не кликабельный, более темный цвет)
commandфункция будет вызываться при нажатии раскрывающегося списка вручную
variableStringVar для управления или получения текущего текста
valuesсписок строк со значениями, которые отображаются в раскрывающемся меню параметров
dynamic_resizingвключить/отключить автоматическое изменение размера опционального меню, когда текст слишком велик для размещения: True (стандартно), False
anchor“n”, “s”, “e”, “w”, “center”, ориентация текста внутри меню параметров, по умолчанию “w”

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены и обновлены.optionmenu.configure(values=["new value 1", "new value 2"])
  • .cget(имя_атрибута ) Например, передать имя атрибута в виде строки и получить текущее значение атрибута.state = optionmenu.cget("state")
  • .set(значение ) Задайте для optionemnu конкретное строковое значение. Значение не обязательно должно быть частью списка значений.
  • .get() Получить текущее строковое значение optionmenu.

CTkProgressBar

Пример кода

progressbar = customtkinter.CTkProgressBar(app, orientation="horizontal")

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
widthширина слайдера в px
heightвысота слайдера в px
border_widthширина границы в px
corner_radiusугловой_радиус в px
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет
border_colorцвет границы ползунка, кортеж: (light_color, dark_color) или один цвет
progress_colorцвет прогресса, кортеж: (light_color, dark_color) или один цвет
orientation“горизонтальный” (по умолчанию) или “вертикальный”
mode«определенный» для линейного прогресса (по умолчанию), «неопределенный» для неизвестного прогресса
determinate_speedскорость для автоматического прогресса в детерминированном режиме, запускаемом .start(), по умолчанию 1
indeterminate_speedскорость для автоматического прогресса в неопределенном режиме, запускаемом .start(), по умолчанию 1

Методы

  • .configure(атрибут=значение, … ) Все атрибуты можно настраивать и обновлять, например:progressbar.configure(mode="indeterminate")
  • .cget(имя_атрибута ) Например, передать имя атрибута в виде строки и получить текущее значение атрибута.mode = progressbar.cget("mode")
  • .set(значение ) Установите индикатор выполнения на определенное значение (диапазон от 0 до 1).
  • .get() Получить текущее значение индикатора выполнения.value = ctk_progressbar.get()
  • .start() Запустить автоматический прогресс. Скорость задается атрибутами indeterminate_speedи determinate_speed, по умолчанию 1. Если режим установлен на «неопределенный», индикатор выполнения будет колебаться, в противном случае он заполнится, а затем повторится.
  • .stop() Остановить автоматический прогресс.
  • .step() Выполните один шаг вручную, в противном случае выполните автоматический цикл .start() и .stop(). Размер шага задается атрибутами determinate_speed и indeterminate_speed.

CTkRadioButton

Пример кода

def radiobutton_event():
print("radiobutton toggled, current value:", radio_var.get())

radio_var = tkinter.IntVar(value=0)
radiobutton_1 = customtkinter.CTkRadioButton(app, text="CTkRadioButton 1",
command=radiobutton_event, variable= radio_var, value=1)
radiobutton_2 = customtkinter.CTkRadioButton(app, text="CTkRadioButton 2",
command=radiobutton_event, variable= radio_var, value=2)

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
widthширина всего виджета в px
heightвысота всего виджета в px
radiobutton_widthширина радиокнопки в px
radiobutton_heightвысота радиокнопки в px
corner_radiusугловой радиус в px
border_width_uncheckedширина границы в непроверенном состоянии в px
border_width_checkedширина границы в отмеченном состоянии в px
fg_colorцвет переднего плана (внутри), кортеж: (light_color, dark_color) или один цвет
цвет границыцвет границы, кортеж: (light_color, dark_color) или один цвет
hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
border_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста при отключении, кортеж: (light_color, dark_color) или один цвет
textstring
textvariableTkinter StringVar для управления текстом
fontшрифт текста кнопки, кортеж: (font_name, size)
hoverвключить/отключить эффект наведения: True, False
state«нормальный» (стандартный) или «отключенный» (не кликабельный, более темный цвет)
commandфункция будет вызываться при нажатии флажка
variableПеременная Tkinter для управления или чтения состояния флажка
valueстроковое или целочисленное значение для переменной при нажатии RadioButton

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены и обновлены.radiobutton.configure(state="disabled")
  • .cget(имя_атрибута ) Например, передать имя атрибута в виде строки и получить текущее значение атрибута.state = radiobutton.cget("state")
  • ..select() Выберите радиокнопку (установите значение 1), команда не будет запущена.
  • ..deselect() Отмените выбор радиокнопки (установите значение на 0), команда не будет запущена.
  • .invoke() То же действие, как если бы пользователь щелкнул переключатель, команда будет запущена.

CTkScrollableFrame

Пример кода

scrollable_frame = customtkinter.CTkScrollableFrame(app, width=200, height=200)

Структурировано в класс:

class MyFrame(customtkinter.CTkScrollableFrame):
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)

# add widgets onto the frame...
self.label = customtkinter.CTkLabel(self)
self.label.grid(row=0, column=0, padx=20)


class App(customtkinter.CTk):
def __init__(self):
super().__init__()

self.my_frame = MyFrame(master=self, width=300, height=200)
self.my_frame.grid(row=0, column=0, padx=20, pady=20)


app = App()
app.mainloop()

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

class MyFrame(customtkinter.CTkScrollableFrame):
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)

# add widgets onto the frame...
self.label = customtkinter.CTkLabel(self)
self.label.grid(row=0, column=0, padx=20)


class App(customtkinter.CTk):
def __init__(self):
super().__init__()
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)

self.my_frame = MyFrame(master=self, width=300, height=200, corner_radius=0, fg_color="transparent")
self.my_frame.grid(row=0, column=0, sticky="nsew")


app = App()
app.mainloop()

Дополнительные примеры можно найти здесь: https://github.com/TomSchimansky/CustomTkinter/blob/master/examples/scrollable_frame_example.py

Аргументы

аргументценить
masterкорень, фрейм или верхний уровень
widthширина в пикселях (внутренние размеры рамки)
heightвысота в пикселях (внутренние размеры кадра)
corner_radiusугловой радиус в px
border_widthширина границы в px
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет или «прозрачный»
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет
scrollbar_fg_colorцвет переднего плана полосы прокрутки, кортеж: (light_color, dark_color) или один цвет
scrollbar_button_colorцвет кнопки полосы прокрутки, кортеж: (light_color, dark_color) или один цвет
scrollbar_button_hover_colorЦвет при наведении кнопки полосы прокрутки, кортеж: (light_color, dark_color) или один цвет
label_fg_colorцвет цвета переднего плана метки, кортеж: (light_color, dark_color) или один цвет
label_text_colorцвет текста метки, кортеж: (light_color, dark_color) или один цвет
label_textтекст метки для метки (заголовок для фрейма)
label_fontшрифт для этикетки, шрифт tupel или CTkFont
label_anchorпривязка для метки, ориентация текста (“n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, “center”)
orientationнаправление прокрутки, «вертикальное» (по умолчанию), «горизонтальное» scrolling direction, “vertical” (default), “horizontal”

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены.
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута.

CTkScrollbar

Пример кода

Создайте CTkTextbox с внешней полосой прокрутки:

app = customtkinter.CTk()
app.grid_rowconfigure(0, weight=1)
app.grid_columnconfigure(0, weight=1)

# create scrollable textbox
tk_textbox = customtkinter.CTkTextbox(app, activate_scrollbars=False)
tk_textbox.grid(row=0, column=0, sticky="nsew")

# create CTk scrollbar
ctk_textbox_scrollbar = customtkinter.CTkScrollbar(app, command=tk_textbox.yview)
ctk_textbox_scrollbar.grid(row=0, column=1, sticky="ns")

# connect textbox scroll event to CTk scrollbar
tk_textbox.configure(yscrollcommand=ctk_textbox_scrollbar.set)

app.mainloop()

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
commandфункция прокручиваемого виджета для вызова при перемещении полосы прокрутки
widthширина кнопки в px
heightвысота кнопки в px
corner_radiusугловой радиус в px
border_spacingпространство переднего плана вокруг полосы прокрутки в пикселях (граница)
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет или “прозрачный”
button_colorцвет полосы прокрутки, кортеж: (light_color, dark_color) или один цвет
button_hover_colorцвет полосы прокрутки, кортеж: (light_color, dark_color) или один цвет
minimum_pixel_lengthминимальная длина полосы прокрутки в px
orientation“вертикальный” (стандартный), “горизонтальный” “vertical” (standard), “horizontal”
hoverэффект наведения (True/False)

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены.
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута.
  • .get() Получить текущее начальное и конечное значение.
  • .set (начальное_значение, конечное_значение )Установите начальное и конечное значение.

CTkSegmentedButton

Пример кода

Без переменной:

def segmented_button_callback(value):
print("segmented button clicked:", value)

segemented_button = customtkinter.CTkSegmentedButton(app, values=["Value 1", "Value 2", "Value 3"],
command=segmented_button_callback)
segemented_button.set("Value 1")

С переменной:

def segmented_button_callback(value):
print("segmented button clicked:", value)

segemented_button_var = customtkinter.StringVar(value="Value 1")
segemented_button = customtkinter.CTkSegmentedButton(app, values=["Value 1", "Value 2", "Value 3"],
command=segmented_button_callback,
variable=segemented_button_var)

Аргументы

аргументценить
masterкорень, фрейм, верхний уровень
widthширина окна в px
heightвысота окна в px
corner_radiusугловой радиус в px
border_widthрасстояние в px между кнопками и краями виджета
fg_colorцвет вокруг кнопок, кортеж: (light_color, dark_color) или один цвет
selected_colorцвет выбранной кнопки, кортеж: (light_color, dark_color) или один цвет
selected_hover_colorцвет выбранной кнопки, кортеж: (light_color, dark_color) или один цвет
unselected_colorцвет невыбранных кнопок, кортеж: (light_color, dark_color) или один цвет или “прозрачный”
unselected_hover_colorцвет невыбранных кнопок, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста при отключении, кортеж: (light_color, dark_color) или один цвет
fontшрифт текста кнопки, кортеж: (font_name, size)
valuesсписок строковых значений для кнопок, не может быть пустым
variableStringVar для управления текущим выбранным значением
state«нормальный» (стандартный) или «отключенный» (не кликабельный, более темный цвет)
commandфункция будет вызываться при нажатии раскрывающегося списка вручную
dynamic_resizingвключить/отключить автоматическое изменение размера, когда текст слишком велик для размещения: True (стандартно), False

Методы

  • .configure(атрибут=значение, … ) Все атрибуты можно настраивать и обновлять, например: segemented_button.configure(state="disabled")
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута.
  • .set(значение ) Установите определенное значение. Если значение отсутствует в списке значений, никакая кнопка не будет выбрана.
  • .get() Получить текущее строковое значение.
  • .insert(индекс, значение )Вставьте новое значение по данному индексу в сегментированную кнопку. Значение также будет вставлено в список значений.
  • .move(новый_индекс, значение ) Переместить существующее значение в новую позицию индекса.
  • .delete(значение ) Удалить значение из сегментированной кнопки и списка значений. Если в данный момент выбрано значение, после этого ни одна кнопка не будет выбрана.

CTkSlider

Пример кода

def slider_event(value):
print(value)

slider = customtkinter.CTkSlider(app, from_=0, to=100, command=slider_event)

Аргументы

аргументценить
masterкорень, tkinter.Frame или CTkFrame
commandфункция обратного вызова, получает значение ползунка в качестве аргумента
variableобъект tkinter.IntVar или tkinter.DoubleVar
widthширина слайдера в px
heightвысота слайдера в px
border_widthпространство вокруг ползунка в px
from_нижнее значение ползунка
toверхнее значение ползунка
number_of_stepsколичество шагов, на которые можно позиционировать ползунок
fg_colorцвет переднего плана, кортеж: (light_color, dark_color) или один цвет
progress_colorкортеж: (light_color, dark_color) или одноцветный или “прозрачный”, цвет линии ползунка перед кнопкой
border_colorцвет границы ползунка, кортеж: (light_color, dark_color) или один цвет или «прозрачный», по умолчанию «прозрачный»
button_colorцвет кнопки ползунка, кортеж: (light_color, dark_color) или один цвет
button_hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
orientation«горизонтальный» (стандартный) или «вертикальный» “horizontal” (standard) or “vertical”
state«нормальный» или «отключенный» (не кликабельно)
hoverbool, включить/отключить эффект наведения, по умолчанию True

Методы

  • .configure(атрибут=значение, … ) Все атрибуты можно настраивать и обновлять, например:slider.configure(number_of_steps=25)
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута.
  • .set(значение ) Установите ползунок на определенное значение.
  • .get() Получить текущее значение ползунка.value = slider.get()

CTkSwitch

Пример кода

def switch_event():
print("switch toggled, current value:", switch_var.get())

switch_var = customtkinter.StringVar(value="on")
switch = customtkinter.CTkSwitch(app, text="CTkSwitch", command=switch_event,
variable=switch_var, onvalue="on", offvalue="off")

Аргументы

аргументценить
masterглавный виджет
widthширина всего виджета в px
heightвысота всего виджета в px
switch_widthширина переключателя в px
switch_heightвысота переключателя в px
corner_radiusугловой радиус в px
border_widthширина границы поля в пикселях
fg_colorцвет переднего плана (внутри), кортеж: (light_color, dark_color) или один цвет
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет или “прозрачный” по умолчанию “прозрачный”
progress_colorцвет переключателя при включении, кортеж: (light_color, dark_color) или один цвет или «прозрачный»
button_colorцвет кнопки, кортеж: (light_color, dark_color) или один цвет
button_hover_colorцвет кнопки при наведении, кортеж: (light_color, dark_color) или один цвет
hover_colorцвет при наведении, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
textнить
textvariableTkinter StringVar для управления текстом
fontшрифт текста кнопки, кортеж: (font_name, size)
commandфункция будет вызываться при нажатии флажка или вызове .toggle()
variableПеременная Tkinter для управления или чтения состояния флажка
onvaluestring или int для переменной в проверенном состоянии
offvaluestring или int для переменной в непроверенном состоянии
state«нормальный» (стандартный) или «отключенный» (не кликабельный)

Методы

  • .configure(атрибут=значение, … ) Все атрибуты можно настраивать и обновлять, например:switch.configure(state="disabled")
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута.
  • .get() Получить текущее значение переключателя, 1 или 0 (проверено или не проверено).
  • .select() Включите переключатель (установите значение на 1), команда не будет запущена.
  • .deselect() Выключите переключатель (установите значение на 0), команда не будет запущена.
  • .toggle() Переверните текущее значение переключателя, команда будет активирована.

CTkTabview

CTkTabview создает вкладку, похожую на записную книжку в tkinter. Вкладки, созданные с помощью .add("<tab-name>")CTkFrames, могут использоваться как CTkFrames. На них можно размещать любые виджеты.

Пример кода

Пример без использования классов:

tabview = customtkinter.CTkTabview(master=app)
tabview.pack(padx=20, pady=20)

tabview.add("tab 1")  # добавить вкладку в конце
tabview.add("tab 2")  # добавить вкладку в конце
tabview.set("tab 2")  # установить текущую видимую вкладку

button = customtkinter.CTkButton(master=tabview.tab("tab 1"))
button.pack(padx=20, pady=20)

Также возможно сохранить вкладки в дополнительных переменных:

tab_1 = tabview.add("tab 1")
tab_2 = tabview.add("tab 2")

button = customtkinter.CTkButton(tab_1)

Пример с классами:

class MyTabView(customtkinter.CTkTabview):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)

        # создание вкладок
        self.add("tab 1")
        self.add("tab 2")

        # добавление виджетов на вкладки
        self.label = customtkinter.CTkLabel(master=self.tab("tab 1"))
        self.label.grid(row=0, column=0, padx=20, pady=10)


class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()

        self.tab_view = MyTabView(master=self)
        self.tab_view.grid(row=0, column=0, padx=20, pady=20)


app = App()
app.mainloop()

Аргументы

аргументценить
masterкорень, фрейм, верхний уровень
widthширина в пикселях, вкладки будут немного меньше
heightвысота в пикселях, вкладки будут немного меньше
corner_radiusугловой радиус в px
border_widthширина границы в px
fg_colorцвет переднего плана самой вкладки и вкладок, кортеж: (light_color, dark_color) или один цвет
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет
segmented_button_fg_colorцвет переднего плана сегментированной кнопки, кортеж: (light_color, dark_color) или один цвет
segmented_button_selected_colorвыбранный цвет сегментированной кнопки, кортеж: (light_color, dark_color) или один цвет
segmented_button_selected_hover_colorвыбранный цвет наведения сегментированной кнопки, кортеж: (light_color, dark_color) или один цвет
segmented_button_unselected_colorневыбранный цвет сегментированной кнопки, кортеж: (light_color, dark_color) или один цвет
segmented_button_unselected_hover_colorневыбранный цвет наведения сегментированной кнопки, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста сегментированной кнопки, кортеж: (light_color, dark_color) или один цвет
text_color_disabledцвет текста сегментированных кнопок, когда виджет отключен, кортеж: (light_color, dark_color) или один цвет
commandфункция будет вызываться при нажатии сегментированной кнопки
state“нормальный” или “отключенный”

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены и обновлены.
  • .cget(имя_атрибута ) Получить значения всех атрибутов, указанных в виде строки.
  • .tab(имя ) Возвращает ссылку на вкладку с заданным именем.button = customtkinter.CTkButton(master=tabview.tab("tab name"))
  • .insert(индекс, имя ) Вставить вкладку с именем в положение индекса, имя должно быть уникальным.
  • .add(имя ) Добавьте вкладку с именем в конце, имя должно быть уникальным.
  • .delete(имя ) Удалить вкладку с названием.
  • .set(имя ) Сделать вкладку с именем видимой.
  • ..get() Получить имя вкладки, которая в данный момент видна.

CTkTextbox

Класс CTkTextbox создает текстовое поле, которое можно прокручивать в вертикальном и горизонтальном направлениях (с помощью wrap='none'). Методы insertи основаны на индексах tkinter, которые объясняются здесь: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/text-index.html get .delete

Пример кода

Пример без использования классов:

textbox = customtkinter.CTkTextbox(app)

textbox.insert("0.0", "new text to insert")  # вставить в строку 0 символ 0
text = textbox.get("0.0", "end")  # получить текст от строки 0 символ 0 до конца
textbox.delete("0.0", "end")  # удалить весь текст
textbox.configure(state="disabled")  # настройте текстовое поле так, чтобы оно было доступно только для чтения

Пример с классами, где текстовое поле полностью заполняет окно:

class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()
        self.grid_rowconfigure(0, weight=1)  # настройка грид-системы
        self.grid_columnconfigure(0, weight=1)

        self.textbox = customtkinter.CTkTextbox(master=self, width=400, corner_radius=0)
        self.textbox.grid(row=0, column=0, sticky="nsew")
        self.textbox.insert("0.0", "Some example text!\n" * 50)


app = App()
app.mainloop()

Аргументы

аргументценить
masterкорень, фрейм, верхний уровень
widthширина окна в px
heightвысота окна в px
corner_radiusугловой радиус в px
border_widthширина границы в px
border_spacingминимальное расстояние между текстом и границей виджета, по умолчанию 3. Установите значение 0, чтобы текст касался границы виджета (если angle_radius=0)
fg_colorосновной цвет виджета, кортеж: (light_color, dark_color) или один цвет или “прозрачный”
border_colorцвет границы, кортеж: (light_color, dark_color) или один цвет
text_colorцвет текста, кортеж: (light_color, dark_color) или один цвет
scrollbar_button_colorосновной цвет полосы прокрутки, кортеж: (light_color, dark_color) или один цвет
scrollbar_button_hover_colorцвет полосы прокрутки при наведении, кортеж: (light_color, dark_color) или один цвет
fontтекстовый шрифт, кортеж: (font_name, размер)
activ_scrollbarsпо умолчанию установлено значение True, установите значение False, чтобы предотвратить появление полос прокрутки.
state«нормальный» (стандартный) или «отключенный» (не кликабельный, только для чтения) “normal” (standard) or “disabled” (not clickable, read-only)
wrapкак переносить текст в конце строки, по умолчанию «char», другие варианты — «word» или «none» для полного отсутствия переноса и горизонтальной прокрутки

и следующие аргументы класса tkinter.Text:

"autoseparators", "cursor", "exportselection", "insertborderwidth", "insertofftime", "insertontime", "insertwidth", "maxundo", "padx", "pady", "selectborderwidth", "spacing1", "spacing2", "spacing3", "state", "tabs", "takefocus", "undo", "xscrollcommand", "yscrollcommand"

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены и обновлены.textbox.configure(state=..., text_color=..., ...)
  • .cget(имя_атрибута ) Получить значения всех атрибутов, указанных в виде строки.
  • .bind(последовательность=Нет, команда=Нет, добавить=Нет ) Привязать команды к событиям, указанным в строке последовательности.
  • .unbind(последовательность, funcid=None ) Отвязать команду от последовательности, указанной funcid, которая возвращается .bind().
  • .insert(index, text, tags=None ) Вставить текст по заданному индексу. Индекс для класса tkinter.Text указывается с помощью «line.character», «end», «insert» или других ключевых слов, описанных здесь: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/text -index.html
  • .delete(я, index1, index2=Нет ) Удалите символы между index1 и index2 (не включены).
  • .get(index1, index2=нет ) Вернуть текст из ИНДЕКС1 в ИНДЕКС2 (не включено).
  • .focus_set( ) Установить фокус на текстовый виджет.

и почти все другие методы tkinter.Text, описанные здесь: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/text-methods.html

CTk Windows

Документация аргументов и методов всех окон.

CTk

Класс CTk составляет основу любой программы CustomTkinter, он создает главное окно приложения. Во время выполнения программы должен быть только один экземпляр этого класса с единственным вызовом метода .mainloop(), который запускает приложение. Дополнительные окна создаются с помощью класса CTkToplevel.

Пример кода

Пример без использования классов:

app = customtkinter.CTk()
app.geometry("600x500")
app.title("CTk example")

app.mainloop()

Пример с классами:

class App(customtkinter.CTk):
def __init__(self):
super().__init__()
self.geometry("600x500")
self.title("CTk example")

# add widgets to app
self.button = customtkinter.CTkButton(self, command=self.button_click)
self.button.grid(row=0, column=0, padx=20, pady=10)

# add methods to app
def button_click(self):
print("button click")


app = App()
app.mainloop()

Аргументы

аргументценить
fg_colorцвет фона окна, кортеж: (light_color, dark_color) или один цвет

Методы

  • .configure(атрибут=значение, … ) Все атрибуты можно настраивать и обновлять, например:app.configure(fg_color=new_fg_color)
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута, например:fg_color = app.cget("fg_color")
  • .title(string) Установить заголовок окна.
  • .geomtry(геометрическая_строка ) Установите геометрию и положение окна следующим образом: "<width>x<height>"или"<width>x<height>+<x_pos>+<y_pos>"
  • .minsize(ширина, высота ) Установите минимальный размер окна.
  • .maxsize(ширина, высота ) Установите максимальный размер окна.
  • .resizable((ширина, высота ) Определите, должны ли ширина и/или высота изменяться с помощью логических значений.
  • .after(миллисекунды, команда ) Выполнить команду через миллисекунды, не блокируя основной цикл.
  • .withdraw() ( ) Скрыть окно и значок. Восстановите его с помощью .deiconify().
  • .iconify( ) Обозначает окно. Восстановите его с помощью .deiconify().
  • .deiconify( )Деиконизируйте окно.
  • .state(новое_состояние ) Установить состояние окна («обычное», «значочное», «отведенное», «увеличенное»), (‘normal’, ‘iconic’, ‘withdrawn’, ‘zoomed’) возвращает текущее состояние, если аргумент не передан.

CTkInputDialog

Это простой диалог для ввода строки или числа.

Пример кода

dialog = customtkinter.CTkInputDialog(text="Type in a number:", title="Test")
text = dialog.get_input() # waits for input

Пример внутри программы:

app = customtkinter.CTk()
app.geometry("400x300")


def button_click_event():
dialog = customtkinter.CTkInputDialog(text="Type in a number:", title="Test")
print("Number:", dialog.get_input())


button = customtkinter.CTkButton(app, text="Open Dialog", command=button_click_event)
button.pack(padx=20, pady=20)

app.mainloop()

Этот пример приводит к следующему окну и диалоговому окну:

CTkInputDialog на примере Windows 11

Аргументы

аргументценить
titleстрока для заголовка диалога
textтекст для самого диалога
fg_colorцвет окна, кортеж: (light_color, dark_color) или один цвет
button_fg_colorцвет кнопок, кортеж: (light_color, dark_color) или один цвет
button_hover_colorцвет кнопок при наведении, кортеж: (light_color, dark_color) или один цвет
button_text_colorцвет текста кнопок, кортеж: (light_color, dark_color) или один цвет
entry_fg_colorцвет записи, кортеж: (light_color, dark_color) или один цвет
entry_border_colorцвет границы записи, кортеж: (light_color, dark_color) или один цвет
entry_text_colorцвет текста записи, кортеж: (light_color, dark_color) или один цвет

Методы

  • .get_input( ) Возвращает ввод, ожидает нажатия кнопки «ОК» или «Отмена».

CTkToplevel

Класс Tktoplevel используется для создания дополнительных окон. Для окна верхнего уровня Tk вызов .mainloop() не требуется, оно открывается сразу после его создания.

Пример кода

toplevel = CTkToplevel(app)  # главный аргумент необязателен  

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

class ToplevelWindow(customtkinter.CTkToplevel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.geometry("400x300")

self.label = customtkinter.CTkLabel(self, text="ToplevelWindow")
self.label.pack(padx=20, pady=20)


class App(customtkinter.CTk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.geometry("500x400")

self.button_1 = customtkinter.CTkButton(self, text="open toplevel", command=self.open_toplevel)
self.button_1.pack(side="top", padx=20, pady=20)

self.toplevel_window = None

def open_toplevel(self):
if self.toplevel_window is None or not self.toplevel_window.winfo_exists():
self.toplevel_window = ToplevelWindow(self) # create window if its None or destroyed
else:
self.toplevel_window.focus() # if window exists focus it


app = App()
app.mainloop()

Пример кода приводит к следующим окнам:

CTkToplevel на примере Windows 11

Аргументы :

аргументценить
fg_colorцвет фона окна, кортеж: (light_color, dark_color) или один цвет

Методы :

  • .configure(атрибут=значение, … ) Все атрибуты можно настраивать и обновлять, например:toplevel.configure(fg_color="red")
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута, например:fg_color = toplevel.cget("fg_color")
  • .название(строка ) Установить заголовок окна.
  • .geomtry(геометрическая_строка )Установите геометрию и положение окна следующим образом: "<width>x<height>"или"<width>x<height>+<x_pos>+<y_pos>"
  • .minsize(ширина, высота ) Установите минимальный размер окна.
  • .maxsize(ширина, высота ) Установите максимальный размер окна.
  • .resizable(ширина, высота ) Определите, должны ли ширина и/или высота изменяться с помощью логических значений.
  • .after(миллисекунды, команда ) Выполнить команду через миллисекунды, не блокируя основной цикл.
  • .withdraw ( ) Скрыть окно и значок. Восстановите его с помощью .deiconify().
  • .iconify( )Обозначает окно. Восстановите его с помощью .deiconify().
  • .deiconify( )Деиконизируйте окно.
  • .state(новое_состояние ) Установить состояние окна «обычное», «значочное», «отведенное», «увеличенное», (‘normal’, ‘iconic’, ‘withdrawn’, ‘zoomed’), возвращает текущее состояние, если аргумент не передан.

CTk Utility Classes

Документация по служебным классам CustomTkinter, таким как CTkFont и CTkImage.

CTkFont

В CustomTkinter есть два метода установки шрифта. Первый – путем создания кортежа формы:

button = customtkinter.CTkButton(app, font=("<family name>", <size in px>, "<optional keywords>"))

Этот шрифт не может быть настроен впоследствии. Необязательные ключевые слова могут быть обычными/жирными, прямыми/курсивными, подчеркнутыми и зачеркнутыми.

Лучший способ — создать объект CTkFont, который впоследствии можно изменить и использовать для нескольких виджетов:

button = customtkinter.CTkButton(app, font=customtkinter.CTkFont(family="<family name>", size=<size in px>, <optional keyword arguments>))

button.cget("font").configure(size=new_size)  # после этого настройте шрифт

Все виджеты по умолчанию получают объект CTkFont, поэтому настройка шрифта виджета возможна по умолчанию.

Объект шрифта также можно применить к нескольким виджетам, и если он настроен, изменения будут переданы всем виджетам, использующим этот шрифт:

my_font = customtkinter.CTkFont(family="<family name>", size=<size in px>, <optional keyword arguments>)

button_1 = customtkinter.CTkButton(app, font=my_font)
button_2 = customtkinter.CTkButton(app, font=my_font)

my_font.configure(family="new name") # changes apply to button_1 and button_2

Аргументы

аргументценить
familyНазвание семейства шрифтов в виде строки.
sizeВысота шрифта в виде целого числа в пикселях.
weight«жирный» для полужирного шрифта, «нормальный» для обычного веса.
slant«курсив» для курсива, «римский» для ненаклонного.
underlineTrue для подчеркнутого текста, False для обычного.
overstrikeTrue для зачеркнутого текста, False для обычного.

Методы

  • .configure(атрибут=значение, … ) Все атрибуты могут быть настроены и обновлены.
  • .cget(имя_атрибута ) Передайте имя атрибута в виде строки и получите текущее значение атрибута.
  • .measure(текст ) Передайте этому методу строку, и он вернет количество пикселей ширины, которое строка займет в шрифте.
  • .metrics(опция ) Если вы вызываете этот метод без аргументов, он возвращает словарь всех метрик шрифта. Вы можете получить значение только одной метрики, передав ее имя в качестве аргумента. Метрики включают:восхождение: количество пикселей высоты между базовой линией и вершиной самого высокого зажима.спуск: количество пикселей высоты между базовой линией и нижней частью самого нижнего зажима.фиксированный: это значение равно 0 для шрифта переменной ширины и 1 для моноширинного шрифта.linespace: Общее количество пикселей высоты. Это интерлиньяж набора сплошной в данном шрифте.

CTkImage

CTkImage — это не виджет, а контейнер для двух объектов PIL Image для светлого и темного режима. Существует также кортеж размера, который описывает ширину и высоту изображения независимо от масштабирования. Поэтому важно, чтобы изображения PIL имели более высокое разрешение, чем кортеж заданного размера, чтобы изображение не было размытым при отображении на мониторе 4K с 2-кратным масштабированием. Чтобы изображение отображалось в четком разрешении на мониторе с 2-кратным масштабированием, данное изображение OIL должно иметь разрешение как минимум в два раза больше требуемого размера.

Создайте объект CTkImage:

from PIL import Image

my_image = customtkinter.CTkImage(light_image=Image.open("<path to light mode image>"),
dark_image=Image.open("<path to dark mode image>"),
size=(30, 30))

image_label = customtkinter.CTkLabel(app, image=my_image, text="") # display image with a CTkLabel

Аргументы

аргументценить
light_imageОбъект изображения PIL для светового режима
dark_imageОбъект изображения PIL для темного режима
sizeкортеж (ширина в пикселях, высота в пикселях) для отображения размера независимо от масштабирования

Если указано only light_imageили only dark_image, существующий будет использоваться как для светлого, так и для темного режима.

Методы

  • .configure(атрибут=значение, … )Все атрибуты могут быть настроены и обновлены.
  • .cget(имя_атрибута )Передайте имя атрибута в виде строки и получите текущее значение атрибута.