Загрузка
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
для фрейма, потому что это значительно повышает читабельность кода, и код становится легко расширяемым, поскольку классы можно легко распределить по нескольким файлам.ОСТОРОЖНОСТЬ
За исключением небольших программ или тестов, всегда создавайте отдельные классы для CTk
, CTkToplevel
или 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
. Мы должны дать кнопке значение columnspan
2 и добавить 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 внутри фрейма теперь имеет значение weight
1, так что метка охватывает весь фрейм со своим sticky
значением «ew». Для аргумента CTkLabel
мы передали fg_color
и corner_radius
, потому что метка по умолчанию «прозрачна» и имеет значение corner_radius
0. Также обратите внимание, что 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:
Для цветов можно задать одно имя цвета ( "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.
Вы можете отключить это автоматическое масштабирование следующим образом:
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-data
pyinstaller. Потому что по какой-то причине 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 вы бы сделали это так:
Для полной команды вы получите что-то вроде этого:
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) или один цвет |
text | string |
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) или один цвет |
text | string |
textvariable | Tkinter StringVar для управления текстом |
font | шрифт текста кнопки, кортеж: (font_name, size) |
hover | включить/отключить эффект наведения: True, False |
state | tkinter.NORMAL (стандартный) или tkinter.DISABLED (некликабельный, более темный цвет) |
command | функция будет вызываться при нажатии флажка |
variable | Переменная Tkinter для управления или чтения состояния флажка |
onvalue | string или int для переменной в проверенном состоянии |
offvalue | string или 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 | функция будет вызываться при нажатии раскрывающегося списка вручную |
variable | StringVar для управления или получения текущего текста |
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 |
text | string |
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 | функция будет вызываться при нажатии раскрывающегося списка вручную |
variable | StringVar для управления или получения текущего текста |
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) или один цвет |
text | string |
textvariable | Tkinter 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 | список строковых значений для кнопок, не может быть пустым |
variable | StringVar для управления текущим выбранным значением |
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 | «нормальный» или «отключенный» (не кликабельно) |
hover | bool, включить/отключить эффект наведения, по умолчанию 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 | нить |
textvariable | Tkinter StringVar для управления текстом |
font | шрифт текста кнопки, кортеж: (font_name, size) |
command | функция будет вызываться при нажатии флажка или вызове .toggle() |
variable | Переменная Tkinter для управления или чтения состояния флажка |
onvalue | string или int для переменной в проверенном состоянии |
offvalue | string или 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()
Этот пример приводит к следующему окну и диалоговому окну:
Аргументы
аргумент | ценить |
---|---|
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()
Пример кода приводит к следующим окнам:
Аргументы :
аргумент | ценить |
---|---|
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 | «курсив» для курсива, «римский» для ненаклонного. |
underline | True для подчеркнутого текста, False для обычного. |
overstrike | True для зачеркнутого текста, 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
, существующий будет использоваться как для светлого, так и для темного режима.