mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
dark-blue, green theme in .json, new font .otf file for circles
This commit is contained in:
parent
ecd4881ffb
commit
9ed461e04c
@ -1,5 +1,6 @@
|
|||||||
__version__ = "2.4"
|
__version__ = "2.4"
|
||||||
|
|
||||||
|
from .customtkinter_dialog import CTkDialog
|
||||||
from .customtkinter_button import CTkButton
|
from .customtkinter_button import CTkButton
|
||||||
from .customtkinter_slider import CTkSlider
|
from .customtkinter_slider import CTkSlider
|
||||||
from .customtkinter_frame import CTkFrame
|
from .customtkinter_frame import CTkFrame
|
||||||
@ -7,7 +8,6 @@ from .customtkinter_progressbar import CTkProgressBar
|
|||||||
from .customtkinter_label import CTkLabel
|
from .customtkinter_label import CTkLabel
|
||||||
from .customtkinter_entry import CTkEntry
|
from .customtkinter_entry import CTkEntry
|
||||||
from .customtkinter_checkbox import CTkCheckBox
|
from .customtkinter_checkbox import CTkCheckBox
|
||||||
from .customtkinter_dialog import CTkDialog
|
|
||||||
from .customtkinter_tk import CTk
|
from .customtkinter_tk import CTk
|
||||||
from .customtkinter_canvas import CTkCanvas
|
from .customtkinter_canvas import CTkCanvas
|
||||||
from .customtkinter_toplevel import CTkToplevel
|
from .customtkinter_toplevel import CTkToplevel
|
||||||
@ -59,7 +59,7 @@ def get_appearance_mode():
|
|||||||
|
|
||||||
|
|
||||||
def set_default_color_theme(color_string):
|
def set_default_color_theme(color_string):
|
||||||
CTkThemeManager.initialize_color_theme(color_string)
|
CTkThemeManager.load_theme(color_string)
|
||||||
|
|
||||||
|
|
||||||
if not sys.platform == "darwin":
|
if not sys.platform == "darwin":
|
||||||
@ -70,7 +70,7 @@ if not sys.platform == "darwin":
|
|||||||
|
|
||||||
# load text fonts and custom font with circle shapes for round corner rendering
|
# load text fonts and custom font with circle shapes for round corner rendering
|
||||||
script_directory = os.path.dirname(os.path.abspath(__file__))
|
script_directory = os.path.dirname(os.path.abspath(__file__))
|
||||||
pyglet.font.add_file(os.path.join(script_directory, "assets", "CustomTkinter_shapes_font-Regular.otf"))
|
pyglet.font.add_file(os.path.join(script_directory, "assets", "CustomTkinter_shapes_font-fine.otf"))
|
||||||
pyglet.font.add_file(os.path.join(script_directory, "assets", "Roboto", "Roboto-Regular.ttf"))
|
pyglet.font.add_file(os.path.join(script_directory, "assets", "Roboto", "Roboto-Regular.ttf"))
|
||||||
pyglet.font.add_file(os.path.join(script_directory, "assets", "Roboto", "Roboto-Medium.ttf"))
|
pyglet.font.add_file(os.path.join(script_directory, "assets", "Roboto", "Roboto-Medium.ttf"))
|
||||||
CTkSettings.circle_font_is_ready = pyglet.font.have_font("CustomTkinter_shapes_font")
|
CTkSettings.circle_font_is_ready = pyglet.font.have_font("CustomTkinter_shapes_font")
|
||||||
@ -81,5 +81,6 @@ if not sys.platform == "darwin":
|
|||||||
if not CTkSettings.circle_font_is_ready:
|
if not CTkSettings.circle_font_is_ready:
|
||||||
if CTkSettings.preferred_drawing_method == "font_shapes":
|
if CTkSettings.preferred_drawing_method == "font_shapes":
|
||||||
sys.stderr.write("WARNING (customtkinter.CTkSettings): " +
|
sys.stderr.write("WARNING (customtkinter.CTkSettings): " +
|
||||||
"Preferred drawing method 'font_shapes' can not be used because the font file could not be loaded. Using 'circle_shapes' instead.")
|
"Preferred drawing method 'font_shapes' can not be used because the font file could not be loaded.\n" +
|
||||||
|
"Using 'circle_shapes' instead. The rendering quality will be very bad!")
|
||||||
CTkSettings.preferred_drawing_method = "circle_shapes"
|
CTkSettings.preferred_drawing_method = "circle_shapes"
|
||||||
|
BIN
customtkinter/assets/CustomTkinter_shapes_font-fine.otf
Normal file
BIN
customtkinter/assets/CustomTkinter_shapes_font-fine.otf
Normal file
Binary file not shown.
@ -1,24 +1,24 @@
|
|||||||
{
|
{
|
||||||
"color": {
|
"color": {
|
||||||
"window_bg_color": ["#ECECEC", "#323232"],
|
"window_bg_color": ["#ECECEC", "gray14"],
|
||||||
"button": ["#64A1D2", "#1C94CF"],
|
"button": ["#3599D6", "#1C94CF"],
|
||||||
"button_hover": ["#A7C2E0", "#5FB4DD"],
|
"button_hover": ["#A7C2E0", "#5FB4DD"],
|
||||||
"button_border": ["#A7C2E0", "#5FB4DD"],
|
"button_border": ["gray25", "gray86"],
|
||||||
"checkbox_border": ["gray20", "#ededed"],
|
"checkbox_border": ["gray20", "#ededed"],
|
||||||
"entry": ["white", "black"],
|
"entry": ["white", "gray10"],
|
||||||
"entry_border": ["gray65", "gray40"],
|
"entry_border": ["gray65", "gray35"],
|
||||||
"entry_placeholder_text": ["gray52", "gray62"],
|
"entry_placeholder_text": ["gray52", "gray62"],
|
||||||
"frame_border": ["#A7C2E0", "#5FB4DD"],
|
"frame_border": ["#A7C2E0", "#5FB4DD"],
|
||||||
"frame_low": ["#D4D5D6", "#3F3F3F"],
|
"frame_low": ["#D4D5D6", "gray20"],
|
||||||
"frame_high": ["#BFBEC1", "#505050"],
|
"frame_high": ["gray77", "gray24"],
|
||||||
"label": ["white", "#626061"],
|
"label": [null, null],
|
||||||
"text": ["gray18", "gray90"],
|
"text": ["gray20", "gray90"],
|
||||||
"progressbar": ["#6B6B6B", "#222222"],
|
"progressbar": ["#6B6B6B", "#222222"],
|
||||||
"progressbar_progress": ["#64A1D2", "#1C94CF"],
|
"progressbar_progress": ["#3599D6", "#1C94CF"],
|
||||||
"progressbar_border": ["gray", "gray"],
|
"progressbar_border": ["gray", "gray"],
|
||||||
"slider": ["#6B6B6B", "#222222"],
|
"slider": ["#6B6B6B", "#222222"],
|
||||||
"slider_progress": ["#A5A6A5", "#555555"],
|
"slider_progress": ["#A5A6A5", "#555555"],
|
||||||
"slider_button": ["#64A1D2", "#1C94CF"],
|
"slider_button": ["#3599D6", "#1C94CF"],
|
||||||
"slider_button_hover": ["#A7C2E0", "#5FB4DD"],
|
"slider_button_hover": ["#A7C2E0", "#5FB4DD"],
|
||||||
"darken_factor": 0.8
|
"darken_factor": 0.8
|
||||||
},
|
},
|
||||||
@ -26,22 +26,22 @@
|
|||||||
"text": {
|
"text": {
|
||||||
"macOS": {
|
"macOS": {
|
||||||
"font": "SF Display",
|
"font": "SF Display",
|
||||||
"size": -14
|
"size": -13
|
||||||
},
|
},
|
||||||
"Windows": {
|
"Windows": {
|
||||||
"font": "Roboto",
|
"font": "Roboto",
|
||||||
"size": -14
|
"size": -13
|
||||||
},
|
},
|
||||||
"Linux": {
|
"Linux": {
|
||||||
"font": "Roboto",
|
"font": "Roboto",
|
||||||
"size": -14
|
"size": -13
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
"shape": {
|
"shape": {
|
||||||
"button_corner_radius": 8,
|
"button_corner_radius": 8,
|
||||||
"button_border_width": 0,
|
"button_border_width": 0,
|
||||||
"checkbox_corner_radius": 6,
|
"checkbox_corner_radius": 7,
|
||||||
"checkbox_border_width": 3,
|
"checkbox_border_width": 3,
|
||||||
"entry_border_width": 2,
|
"entry_border_width": 2,
|
||||||
"frame_corner_radius": 10,
|
"frame_corner_radius": 10,
|
||||||
@ -49,9 +49,9 @@
|
|||||||
"label_corner_radius": 8,
|
"label_corner_radius": 8,
|
||||||
"progressbar_border_width": 0,
|
"progressbar_border_width": 0,
|
||||||
"progressbar_corner_radius": 100,
|
"progressbar_corner_radius": 100,
|
||||||
"slider_border_width": 5,
|
"slider_border_width": 6,
|
||||||
"slider_corner_radius": 8,
|
"slider_corner_radius": 8,
|
||||||
"slider_button_length": 10,
|
"slider_button_length": 0,
|
||||||
"slider_button_corner_radius": 8
|
"slider_button_corner_radius": 100
|
||||||
}
|
}
|
||||||
}
|
}
|
57
customtkinter/assets/themes/dark-blue.json
Normal file
57
customtkinter/assets/themes/dark-blue.json
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"color": {
|
||||||
|
"window_bg_color": ["gray95", "gray10"],
|
||||||
|
"button": ["#608BD5", "#395E9C"],
|
||||||
|
"button_hover": ["#A4BDE6", "#748BB3"],
|
||||||
|
"button_border": ["gray25", "gray75"],
|
||||||
|
"checkbox_border": ["gray25", "gray75"],
|
||||||
|
"entry": ["white", "gray10"],
|
||||||
|
"entry_border": ["gray65", "gray35"],
|
||||||
|
"entry_placeholder_text": ["gray52", "gray62"],
|
||||||
|
"frame_border": ["#A7C2E0", "#5FB4DD"],
|
||||||
|
"frame_low": ["gray88", "gray16"],
|
||||||
|
"frame_high": ["gray82", "gray20"],
|
||||||
|
"label": [null, null],
|
||||||
|
"text": ["gray20", "gray90"],
|
||||||
|
"progressbar": ["gray40", "gray6"],
|
||||||
|
"progressbar_progress": ["#608BD5", "#395E9C"],
|
||||||
|
"progressbar_border": ["gray", "gray"],
|
||||||
|
"slider": ["gray40", "#222222"],
|
||||||
|
"slider_progress": ["white", "#555555"],
|
||||||
|
"slider_button": ["#608BD5", "#395E9C"],
|
||||||
|
"slider_button_hover": ["#A4BDE6", "#748BB3"],
|
||||||
|
"darken_factor": 0.8
|
||||||
|
},
|
||||||
|
|
||||||
|
"text": {
|
||||||
|
"macOS": {
|
||||||
|
"font": "SF Display",
|
||||||
|
"size": -13
|
||||||
|
},
|
||||||
|
"Windows": {
|
||||||
|
"font": "Roboto",
|
||||||
|
"size": -13
|
||||||
|
},
|
||||||
|
"Linux": {
|
||||||
|
"font": "Roboto",
|
||||||
|
"size": -13
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
"shape": {
|
||||||
|
"button_corner_radius": 8,
|
||||||
|
"button_border_width": 0,
|
||||||
|
"checkbox_corner_radius": 7,
|
||||||
|
"checkbox_border_width": 3,
|
||||||
|
"entry_border_width": 2,
|
||||||
|
"frame_corner_radius": 8,
|
||||||
|
"frame_border_width": 0,
|
||||||
|
"label_corner_radius": 8,
|
||||||
|
"progressbar_border_width": 0,
|
||||||
|
"progressbar_corner_radius": 3,
|
||||||
|
"slider_border_width": 6,
|
||||||
|
"slider_corner_radius": 8,
|
||||||
|
"slider_button_length": 12,
|
||||||
|
"slider_button_corner_radius": 3
|
||||||
|
}
|
||||||
|
}
|
57
customtkinter/assets/themes/green.json
Normal file
57
customtkinter/assets/themes/green.json
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"color": {
|
||||||
|
"window_bg_color": ["gray95", "gray10"],
|
||||||
|
"button": ["#72CF9F", "#11B384"],
|
||||||
|
"button_hover": ["#0E9670", "#0D8A66"],
|
||||||
|
"button_border": ["gray25", "gray75"],
|
||||||
|
"checkbox_border": ["gray25", "gray75"],
|
||||||
|
"entry": ["white", "gray10"],
|
||||||
|
"entry_border": ["gray65", "gray35"],
|
||||||
|
"entry_placeholder_text": ["gray52", "gray62"],
|
||||||
|
"frame_border": ["#A7C2E0", "#5FB4DD"],
|
||||||
|
"frame_low": ["gray88", "gray16"],
|
||||||
|
"frame_high": ["gray82", "gray20"],
|
||||||
|
"label": [null, null],
|
||||||
|
"text": ["gray20", "gray90"],
|
||||||
|
"progressbar": ["gray40", "gray6"],
|
||||||
|
"progressbar_progress": ["#72CF9F", "#11B384"],
|
||||||
|
"progressbar_border": ["gray", "gray"],
|
||||||
|
"slider": ["gray40", "#222222"],
|
||||||
|
"slider_progress": ["white", "#555555"],
|
||||||
|
"slider_button": ["#72CF9F", "#11B384"],
|
||||||
|
"slider_button_hover": ["#0E9670", "#0D8A66"],
|
||||||
|
"darken_factor": 0.8
|
||||||
|
},
|
||||||
|
|
||||||
|
"text": {
|
||||||
|
"macOS": {
|
||||||
|
"font": "SF Display",
|
||||||
|
"size": -13
|
||||||
|
},
|
||||||
|
"Windows": {
|
||||||
|
"font": "Roboto",
|
||||||
|
"size": -13
|
||||||
|
},
|
||||||
|
"Linux": {
|
||||||
|
"font": "Roboto",
|
||||||
|
"size": -13
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
"shape": {
|
||||||
|
"button_corner_radius": 8,
|
||||||
|
"button_border_width": 0,
|
||||||
|
"checkbox_corner_radius": 7,
|
||||||
|
"checkbox_border_width": 3,
|
||||||
|
"entry_border_width": 2,
|
||||||
|
"frame_corner_radius": 10,
|
||||||
|
"frame_border_width": 0,
|
||||||
|
"label_corner_radius": 8,
|
||||||
|
"progressbar_border_width": 0,
|
||||||
|
"progressbar_corner_radius": 100,
|
||||||
|
"slider_border_width": 6,
|
||||||
|
"slider_corner_radius": 100,
|
||||||
|
"slider_button_length": 0,
|
||||||
|
"slider_button_corner_radius": 100
|
||||||
|
}
|
||||||
|
}
|
@ -64,7 +64,7 @@ class CTkButton(tkinter.Frame):
|
|||||||
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
|
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
|
||||||
self.fg_color = CTkThemeManager.theme["color"]["button"] if fg_color == "default_theme" else fg_color
|
self.fg_color = CTkThemeManager.theme["color"]["button"] if fg_color == "default_theme" else fg_color
|
||||||
self.hover_color = CTkThemeManager.theme["color"]["button_hover"] if hover_color == "default_theme" else hover_color
|
self.hover_color = CTkThemeManager.theme["color"]["button_hover"] if hover_color == "default_theme" else hover_color
|
||||||
self.border_color = CTkThemeManager.theme["color"]["button_hover"] if border_color == "default_theme" else border_color
|
self.border_color = CTkThemeManager.theme["color"]["button_border"] if border_color == "default_theme" else border_color
|
||||||
|
|
||||||
# shape and size
|
# shape and size
|
||||||
self.width = width
|
self.width = width
|
||||||
|
@ -7,7 +7,10 @@ class CTkCanvas(tkinter.Canvas):
|
|||||||
# This dict maps a corner_radius of a circle to a specific font character, which is circle shape which fills the space
|
# This dict maps a corner_radius of a circle to a specific font character, which is circle shape which fills the space
|
||||||
# of one monospace character to a specific amount from 100% to 90% (A to I).
|
# of one monospace character to a specific amount from 100% to 90% (A to I).
|
||||||
radius_to_char = {19: 'B', 18: 'B', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'B', 12: 'B', 11: 'B', 10: 'B',
|
radius_to_char = {19: 'B', 18: 'B', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'B', 12: 'B', 11: 'B', 10: 'B',
|
||||||
9: 'C', 8: 'D', 7: 'C', 6: 'E', 5: 'F', 4: 'F', 3: 'H', 2: 'H', 1: 'H', 0: 'A'}
|
9: 'C', 8: 'D', 7: 'C', 6: 'E', 5: 'F', 4: 'G', 3: 'H', 2: 'H', 1: 'H', 0: 'A'}
|
||||||
|
|
||||||
|
radius_to_char_fine = {19: 'A', 18: 'A', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'C', 12: 'C', 11: 'C', 10: 'C',
|
||||||
|
9: 'D', 8: 'D', 7: 'D', 6: 'F', 5: 'D', 4: 'G', 3: 'G', 2: 'H', 1: 'H', 0: 'A'}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@ -19,7 +22,7 @@ class CTkCanvas(tkinter.Canvas):
|
|||||||
if radius >= 20:
|
if radius >= 20:
|
||||||
return "A"
|
return "A"
|
||||||
else:
|
else:
|
||||||
return self.radius_to_char[radius]
|
return self.radius_to_char_fine[radius]
|
||||||
|
|
||||||
def create_aa_circle(self, x_pos, y_pos, radius, angle=0, fill="white", tags="", anchor=tkinter.CENTER) -> str:
|
def create_aa_circle(self, x_pos, y_pos, radius, angle=0, fill="white", tags="", anchor=tkinter.CENTER) -> str:
|
||||||
# create a circle with a font element
|
# create a circle with a font element
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
import tkinter
|
import tkinter
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from customtkinter.customtkinter_label import CTkLabel
|
from .appearance_mode_tracker import AppearanceModeTracker
|
||||||
from customtkinter.customtkinter_button import CTkButton
|
from .customtkinter_theme_manager import CTkThemeManager
|
||||||
from customtkinter.customtkinter_entry import CTkEntry
|
from .customtkinter_label import CTkLabel
|
||||||
from customtkinter.customtkinter_theme_manager import CTkThemeManager
|
from .customtkinter_button import CTkButton
|
||||||
|
from .customtkinter_entry import CTkEntry
|
||||||
|
from .customtkinter_frame import CTkFrame
|
||||||
|
from .customtkinter_toplevel import CTkToplevel
|
||||||
|
|
||||||
|
|
||||||
class CTkDialog:
|
class CTkDialog:
|
||||||
@ -15,6 +18,8 @@ class CTkDialog:
|
|||||||
fg_color="default_theme",
|
fg_color="default_theme",
|
||||||
hover_color="default_theme",
|
hover_color="default_theme",
|
||||||
border_color="default_theme"):
|
border_color="default_theme"):
|
||||||
|
|
||||||
|
self.appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark"
|
||||||
self.master = master
|
self.master = master
|
||||||
|
|
||||||
self.user_input = None
|
self.user_input = None
|
||||||
@ -22,11 +27,12 @@ class CTkDialog:
|
|||||||
|
|
||||||
self.height = len(text.split("\n"))*20 + 150
|
self.height = len(text.split("\n"))*20 + 150
|
||||||
|
|
||||||
|
self.window_bg_color = CTkThemeManager.theme["color"]["window_bg_color"]
|
||||||
self.fg_color = CTkThemeManager.theme["color"]["button"] if fg_color == "default_theme" else fg_color
|
self.fg_color = CTkThemeManager.theme["color"]["button"] if fg_color == "default_theme" else fg_color
|
||||||
self.hover_color = CTkThemeManager.theme["color"]["button_hover"] if hover_color == "default_theme" else hover_color
|
self.hover_color = CTkThemeManager.theme["color"]["button_hover"] if hover_color == "default_theme" else hover_color
|
||||||
self.border_color = CTkThemeManager.theme["color"]["button_hover"] if border_color == "default_theme" else border_color
|
self.border_color = CTkThemeManager.theme["color"]["button_hover"] if border_color == "default_theme" else border_color
|
||||||
|
|
||||||
self.top = customtkinter.CTkToplevel()
|
self.top = CTkToplevel()
|
||||||
self.top.geometry(f"280x{self.height}")
|
self.top.geometry(f"280x{self.height}")
|
||||||
self.top.resizable(False, False)
|
self.top.resizable(False, False)
|
||||||
self.top.title(title)
|
self.top.title(title)
|
||||||
@ -34,14 +40,16 @@ class CTkDialog:
|
|||||||
self.top.focus_force()
|
self.top.focus_force()
|
||||||
self.top.grab_set()
|
self.top.grab_set()
|
||||||
|
|
||||||
self.label_frame = customtkinter.CTkFrame(master=self.top,
|
self.label_frame = CTkFrame(master=self.top,
|
||||||
corner_radius=0,
|
corner_radius=0,
|
||||||
|
fg_color=CTkThemeManager.single_color(self.window_bg_color, self.appearance_mode),
|
||||||
width=300,
|
width=300,
|
||||||
height=self.height-100)
|
height=self.height-100)
|
||||||
self.label_frame.place(relx=0.5, rely=0, anchor=tkinter.N)
|
self.label_frame.place(relx=0.5, rely=0, anchor=tkinter.N)
|
||||||
|
|
||||||
self.button_and_entry_frame = customtkinter.CTkFrame(master=self.top,
|
self.button_and_entry_frame = CTkFrame(master=self.top,
|
||||||
corner_radius=0,
|
corner_radius=0,
|
||||||
|
fg_color=CTkThemeManager.single_color(self.window_bg_color, self.appearance_mode),
|
||||||
width=300,
|
width=300,
|
||||||
height=100)
|
height=100)
|
||||||
self.button_and_entry_frame.place(relx=0.5, rely=1, anchor=tkinter.S)
|
self.button_and_entry_frame.place(relx=0.5, rely=1, anchor=tkinter.S)
|
||||||
@ -95,22 +103,3 @@ class CTkDialog:
|
|||||||
time.sleep(0.05)
|
time.sleep(0.05)
|
||||||
self.top.destroy()
|
self.top.destroy()
|
||||||
return self.user_input
|
return self.user_input
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import customtkinter
|
|
||||||
customtkinter.set_appearance_mode("System")
|
|
||||||
customtkinter.set_default_color_theme("dark-blue")
|
|
||||||
|
|
||||||
app = customtkinter.CTk()
|
|
||||||
app.geometry("400x300")
|
|
||||||
app.title("CTkDialog Test")
|
|
||||||
|
|
||||||
def button_click_event():
|
|
||||||
dialog = CTkDialog(master=None, text="Type in a number:", title="Test")
|
|
||||||
print("Number:", dialog.get_input())
|
|
||||||
|
|
||||||
button = CTkButton(master=app, text="Open Dialog", command=button_click_event)
|
|
||||||
button.place(relx=0.5, rely=0.5, anchor=tkinter.CENTER)
|
|
||||||
|
|
||||||
app.mainloop()
|
|
||||||
|
@ -67,7 +67,7 @@ class CTkDrawEngine:
|
|||||||
if self._rendering_method == "polygon_shapes":
|
if self._rendering_method == "polygon_shapes":
|
||||||
return self._draw_rounded_rect_with_border_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius)
|
return self._draw_rounded_rect_with_border_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius)
|
||||||
elif self._rendering_method == "font_shapes":
|
elif self._rendering_method == "font_shapes":
|
||||||
return self._draw_rounded_rect_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, ())
|
return self._draw_rounded_rect_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, (), symmetric_circles=True)
|
||||||
elif self._rendering_method == "circle_shapes":
|
elif self._rendering_method == "circle_shapes":
|
||||||
return self._draw_rounded_rect_with_border_circle_shapes(width, height, corner_radius, border_width, inner_corner_radius)
|
return self._draw_rounded_rect_with_border_circle_shapes(width, height, corner_radius, border_width, inner_corner_radius)
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ class CTkDrawEngine:
|
|||||||
return requires_recoloring
|
return requires_recoloring
|
||||||
|
|
||||||
def _draw_rounded_rect_with_border_font_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int,
|
def _draw_rounded_rect_with_border_font_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int,
|
||||||
exclude_parts: tuple) -> bool:
|
exclude_parts: tuple, symmetric_circles: bool = True) -> bool:
|
||||||
requires_recoloring = False
|
requires_recoloring = False
|
||||||
|
|
||||||
# create border button parts
|
# create border button parts
|
||||||
@ -134,16 +134,20 @@ class CTkDrawEngine:
|
|||||||
# create canvas border corner parts if not already created
|
# create canvas border corner parts if not already created
|
||||||
if not self._canvas.find_withtag("border_oval_1_a"):
|
if not self._canvas.find_withtag("border_oval_1_a"):
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
requires_recoloring = True
|
requires_recoloring = True
|
||||||
|
|
||||||
if not self._canvas.find_withtag("border_oval_3_a") and round(corner_radius) * 2 < height:
|
if not self._canvas.find_withtag("border_oval_3_a") and round(corner_radius) * 2 < height:
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
requires_recoloring = True
|
requires_recoloring = True
|
||||||
|
|
||||||
elif self._canvas.find_withtag("border_oval_3_a") and not round(corner_radius) * 2 < height:
|
elif self._canvas.find_withtag("border_oval_3_a") and not round(corner_radius) * 2 < height:
|
||||||
@ -181,24 +185,28 @@ class CTkDrawEngine:
|
|||||||
# create canvas border corner parts if not already created
|
# create canvas border corner parts if not already created
|
||||||
if not self._canvas.find_withtag("inner_oval_1_a") and "inner_oval_1" not in exclude_parts:
|
if not self._canvas.find_withtag("inner_oval_1_a") and "inner_oval_1" not in exclude_parts:
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
requires_recoloring = True
|
requires_recoloring = True
|
||||||
|
|
||||||
if not self._canvas.find_withtag("inner_oval_2_a") and "inner_oval_2" not in exclude_parts:
|
if not self._canvas.find_withtag("inner_oval_2_a") and "inner_oval_2" not in exclude_parts:
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
requires_recoloring = True
|
requires_recoloring = True
|
||||||
|
|
||||||
if not self._canvas.find_withtag("inner_oval_3_a") and round(inner_corner_radius) * 2 < height - (2 * border_width) and "inner_oval_3" not in exclude_parts:
|
if not self._canvas.find_withtag("inner_oval_3_a") and round(inner_corner_radius) * 2 < height - (2 * border_width) and "inner_oval_3" not in exclude_parts:
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
requires_recoloring = True
|
requires_recoloring = True
|
||||||
elif self._canvas.find_withtag("inner_oval_3_a") and not round(inner_corner_radius) * 2 < height - (2 * border_width):
|
elif self._canvas.find_withtag("inner_oval_3_a") and not round(inner_corner_radius) * 2 < height - (2 * border_width):
|
||||||
self._canvas.delete("inner_oval_3_a", "inner_oval_3_b")
|
self._canvas.delete("inner_oval_3_a", "inner_oval_3_b")
|
||||||
|
|
||||||
if not self._canvas.find_withtag("inner_oval_4_a") and round(inner_corner_radius) * 2 < height - (2 * border_width) and "inner_oval_4" not in exclude_parts:
|
if not self._canvas.find_withtag("inner_oval_4_a") and round(inner_corner_radius) * 2 < height - (2 * border_width) and "inner_oval_4" not in exclude_parts:
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER)
|
||||||
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
if symmetric_circles:
|
||||||
|
self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180)
|
||||||
requires_recoloring = True
|
requires_recoloring = True
|
||||||
elif self._canvas.find_withtag("inner_oval_4_a") and not round(inner_corner_radius) * 2 < height - (2 * border_width):
|
elif self._canvas.find_withtag("inner_oval_4_a") and not round(inner_corner_radius) * 2 < height - (2 * border_width):
|
||||||
self._canvas.delete("inner_oval_4_a", "inner_oval_4_b")
|
self._canvas.delete("inner_oval_4_a", "inner_oval_4_b")
|
||||||
|
@ -117,8 +117,6 @@ class CTkEntry(tkinter.Frame):
|
|||||||
return self.master.cget("bg")
|
return self.master.cget("bg")
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
#print(self.master["style"])
|
|
||||||
#return self.master.cget("background")
|
|
||||||
|
|
||||||
def update_dimensions(self, event):
|
def update_dimensions(self, event):
|
||||||
# only redraw if dimensions changed (for performance)
|
# only redraw if dimensions changed (for performance)
|
||||||
@ -172,6 +170,9 @@ class CTkEntry(tkinter.Frame):
|
|||||||
fill=CTkThemeManager.single_color(self.border_color, self.appearance_mode),
|
fill=CTkThemeManager.single_color(self.border_color, self.appearance_mode),
|
||||||
outline=CTkThemeManager.single_color(self.border_color, self.appearance_mode))
|
outline=CTkThemeManager.single_color(self.border_color, self.appearance_mode))
|
||||||
|
|
||||||
|
if self.placeholder_text_active:
|
||||||
|
self.entry.config(fg=CTkThemeManager.single_color(self.placeholder_text_color, self.appearance_mode))
|
||||||
|
|
||||||
def bind(self, *args, **kwargs):
|
def bind(self, *args, **kwargs):
|
||||||
self.entry.bind(*args, **kwargs)
|
self.entry.bind(*args, **kwargs)
|
||||||
|
|
||||||
|
@ -117,12 +117,20 @@ class CTkLabel(tkinter.Frame):
|
|||||||
|
|
||||||
self.canvas.configure(bg=CTkThemeManager.single_color(self.bg_color, self.appearance_mode))
|
self.canvas.configure(bg=CTkThemeManager.single_color(self.bg_color, self.appearance_mode))
|
||||||
|
|
||||||
self.canvas.itemconfig("inner_parts",
|
if CTkThemeManager.single_color(self.fg_color, self.appearance_mode) is not None:
|
||||||
fill=CTkThemeManager.single_color(self.fg_color, self.appearance_mode),
|
self.canvas.itemconfig("inner_parts",
|
||||||
outline=CTkThemeManager.single_color(self.fg_color, self.appearance_mode))
|
fill=CTkThemeManager.single_color(self.fg_color, self.appearance_mode),
|
||||||
|
outline=CTkThemeManager.single_color(self.fg_color, self.appearance_mode))
|
||||||
|
|
||||||
self.text_label.configure(fg=CTkThemeManager.single_color(self.text_color, self.appearance_mode),
|
self.text_label.configure(fg=CTkThemeManager.single_color(self.text_color, self.appearance_mode),
|
||||||
bg=CTkThemeManager.single_color(self.fg_color, self.appearance_mode))
|
bg=CTkThemeManager.single_color(self.fg_color, self.appearance_mode))
|
||||||
|
else:
|
||||||
|
self.canvas.itemconfig("inner_parts",
|
||||||
|
fill=CTkThemeManager.single_color(self.bg_color, self.appearance_mode),
|
||||||
|
outline=CTkThemeManager.single_color(self.bg_color, self.appearance_mode))
|
||||||
|
|
||||||
|
self.text_label.configure(fg=CTkThemeManager.single_color(self.text_color, self.appearance_mode),
|
||||||
|
bg=CTkThemeManager.single_color(self.bg_color, self.appearance_mode))
|
||||||
|
|
||||||
def config(self, *args, **kwargs):
|
def config(self, *args, **kwargs):
|
||||||
self.configure(*args, **kwargs)
|
self.configure(*args, **kwargs)
|
||||||
|
@ -6,7 +6,7 @@ import json
|
|||||||
class CTkThemeManager:
|
class CTkThemeManager:
|
||||||
|
|
||||||
theme = {} # contains all the theme data
|
theme = {} # contains all the theme data
|
||||||
built_in_themes = ["blue", "green", "dark_blue"]
|
built_in_themes = ["blue", "green", "dark-blue"]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def load_theme(cls, theme_name_or_path: str):
|
def load_theme(cls, theme_name_or_path: str):
|
||||||
|
@ -4,9 +4,7 @@ import customtkinter
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
customtkinter.set_appearance_mode("Light") # Modes: "System" (standard), "Dark", "Light"
|
customtkinter.set_appearance_mode("Light") # Modes: "System" (standard), "Dark", "Light"
|
||||||
customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue"
|
customtkinter.set_default_color_theme("dark-blue") # Themes: "blue" (standard), "green", "dark-blue"
|
||||||
|
|
||||||
customtkinter.CTkSettings.preferred_drawing_method = "polygon_shapes"
|
|
||||||
|
|
||||||
|
|
||||||
class App(customtkinter.CTk):
|
class App(customtkinter.CTk):
|
||||||
@ -52,28 +50,29 @@ class App(customtkinter.CTk):
|
|||||||
|
|
||||||
self.label_1 = customtkinter.CTkLabel(master=self.frame_left,
|
self.label_1 = customtkinter.CTkLabel(master=self.frame_left,
|
||||||
text="CustomTkinter",
|
text="CustomTkinter",
|
||||||
|
text_font=("Roboto Medium", -16), # font name and size in px
|
||||||
fg_color=None)
|
fg_color=None)
|
||||||
self.label_1.grid(row=1, column=0, pady=10, padx=10)
|
self.label_1.grid(row=1, column=0, pady=10, padx=10)
|
||||||
|
|
||||||
self.button_1 = customtkinter.CTkButton(master=self.frame_left,
|
self.button_1 = customtkinter.CTkButton(master=self.frame_left,
|
||||||
text="CTkButton 1",
|
text="CTkButton 1",
|
||||||
command=self.button_event,
|
command=self.button_event,
|
||||||
border_width=0,
|
fg_color=None,
|
||||||
corner_radius=8)
|
border_width=2)
|
||||||
self.button_1.grid(row=2, column=0, pady=10, padx=20)
|
self.button_1.grid(row=2, column=0, pady=10, padx=20)
|
||||||
|
|
||||||
self.button_2 = customtkinter.CTkButton(master=self.frame_left,
|
self.button_2 = customtkinter.CTkButton(master=self.frame_left,
|
||||||
text="CTkButton 2",
|
text="CTkButton 2",
|
||||||
command=self.button_event,
|
command=self.button_event,
|
||||||
border_width=0,
|
fg_color=None,
|
||||||
corner_radius=8)
|
border_width=2)
|
||||||
self.button_2.grid(row=3, column=0, pady=10, padx=20)
|
self.button_2.grid(row=3, column=0, pady=10, padx=20)
|
||||||
|
|
||||||
self.button_3 = customtkinter.CTkButton(master=self.frame_left,
|
self.button_3 = customtkinter.CTkButton(master=self.frame_left,
|
||||||
text="CTkButton 3",
|
text="CTkButton 3",
|
||||||
command=self.button_event,
|
command=self.button_event,
|
||||||
border_width=0,
|
fg_color=None,
|
||||||
corner_radius=8)
|
border_width=2)
|
||||||
self.button_3.grid(row=4, column=0, pady=10, padx=20)
|
self.button_3.grid(row=4, column=0, pady=10, padx=20)
|
||||||
|
|
||||||
self.check_box_1 = customtkinter.CTkCheckBox(master=self.frame_left,
|
self.check_box_1 = customtkinter.CTkCheckBox(master=self.frame_left,
|
||||||
@ -103,19 +102,18 @@ class App(customtkinter.CTk):
|
|||||||
"amet consetetur sadipscing elitr,\n" +
|
"amet consetetur sadipscing elitr,\n" +
|
||||||
"sed diam nonumy eirmod tempor\n" +
|
"sed diam nonumy eirmod tempor\n" +
|
||||||
"invidunt ut labore",
|
"invidunt ut labore",
|
||||||
width=250,
|
width=240,
|
||||||
height=100,
|
height=100,
|
||||||
fg_color=("white", "gray38"), # <- custom tuple-color
|
fg_color=("white", "gray38"), # <- custom tuple-color
|
||||||
justify=tkinter.LEFT)
|
justify=tkinter.LEFT)
|
||||||
self.label_info_1.place(relx=0.5, rely=0.15, anchor=tkinter.N)
|
self.label_info_1.place(relx=0.5, rely=0.15, anchor=tkinter.N)
|
||||||
|
|
||||||
self.progressbar = customtkinter.CTkProgressBar(master=self.frame_info)
|
self.progressbar = customtkinter.CTkProgressBar(master=self.frame_info, width=240)
|
||||||
self.progressbar.place(relx=0.5, rely=0.85, anchor=tkinter.S)
|
self.progressbar.place(relx=0.5, rely=0.85, anchor=tkinter.S)
|
||||||
|
|
||||||
# ============ frame_right <- ============
|
# ============ frame_right <- ============
|
||||||
|
|
||||||
self.slider_1 = customtkinter.CTkSlider(master=self.frame_right,
|
self.slider_1 = customtkinter.CTkSlider(master=self.frame_right,
|
||||||
height=16,
|
|
||||||
from_=1,
|
from_=1,
|
||||||
to=0,
|
to=0,
|
||||||
number_of_steps=3,
|
number_of_steps=3,
|
||||||
@ -125,8 +123,6 @@ class App(customtkinter.CTk):
|
|||||||
|
|
||||||
self.slider_2 = customtkinter.CTkSlider(master=self.frame_right,
|
self.slider_2 = customtkinter.CTkSlider(master=self.frame_right,
|
||||||
width=160,
|
width=160,
|
||||||
height=16,
|
|
||||||
button_length=0,
|
|
||||||
command=self.progressbar.set)
|
command=self.progressbar.set)
|
||||||
self.slider_2.grid(row=2, column=0, columnspan=2, pady=10, padx=20, sticky="we")
|
self.slider_2.grid(row=2, column=0, columnspan=2, pady=10, padx=20, sticky="we")
|
||||||
self.slider_2.set(0.7)
|
self.slider_2.set(0.7)
|
||||||
@ -142,27 +138,19 @@ class App(customtkinter.CTk):
|
|||||||
self.button_4 = customtkinter.CTkButton(master=self.frame_right,
|
self.button_4 = customtkinter.CTkButton(master=self.frame_right,
|
||||||
height=25,
|
height=25,
|
||||||
text="CTkButton",
|
text="CTkButton",
|
||||||
command=self.button_event,
|
command=self.button_event)
|
||||||
border_width=0,
|
|
||||||
corner_radius=8)
|
|
||||||
self.button_4.grid(row=2, column=2, columnspan=1, pady=10, padx=20, sticky="we")
|
self.button_4.grid(row=2, column=2, columnspan=1, pady=10, padx=20, sticky="we")
|
||||||
|
|
||||||
self.entry = customtkinter.CTkEntry(master=self.frame_right,
|
self.entry = customtkinter.CTkEntry(master=self.frame_right,
|
||||||
width=120,
|
width=120,
|
||||||
height=30,
|
height=30,
|
||||||
corner_radius=10,
|
|
||||||
border_width=2,
|
|
||||||
placeholder_text="CTkEntry")
|
placeholder_text="CTkEntry")
|
||||||
self.entry.grid(row=4, column=0, columnspan=2, pady=20, padx=20, sticky="we")
|
self.entry.grid(row=4, column=0, columnspan=2, pady=20, padx=20, sticky="we")
|
||||||
|
|
||||||
self.button_5 = customtkinter.CTkButton(master=self.frame_right,
|
self.button_5 = customtkinter.CTkButton(master=self.frame_right,
|
||||||
height=26,
|
height=30,
|
||||||
text="CTkButton",
|
text="CTkButton",
|
||||||
command=self.button_event,
|
command=self.button_event)
|
||||||
fg_color="gray30",
|
|
||||||
border_width=2,
|
|
||||||
border_color=("gray30", "gray50"),
|
|
||||||
corner_radius=13)
|
|
||||||
self.button_5.grid(row=4, column=2, columnspan=1, pady=20, padx=20, sticky="we")
|
self.button_5.grid(row=4, column=2, columnspan=1, pady=20, padx=20, sticky="we")
|
||||||
|
|
||||||
self.progressbar.set(0.5)
|
self.progressbar.set(0.5)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import customtkinter
|
import customtkinter
|
||||||
import tkinter
|
import tkinter
|
||||||
|
|
||||||
customtkinter.CTkSettings.preferred_drawing_method = "polygon_shapes"
|
|
||||||
customtkinter.set_default_color_theme("blue")
|
customtkinter.set_default_color_theme("blue")
|
||||||
customtkinter.set_appearance_mode("dark")
|
customtkinter.set_appearance_mode("dark")
|
||||||
|
|
||||||
@ -21,7 +20,7 @@ f2 = customtkinter.CTkFrame(app, fg_color="gray10", corner_radius=0)
|
|||||||
f2.grid(row=0, column=1, rowspan=1, columnspan=1, sticky="nsew")
|
f2.grid(row=0, column=1, rowspan=1, columnspan=1, sticky="nsew")
|
||||||
f2.grid_columnconfigure(0, weight=1)
|
f2.grid_columnconfigure(0, weight=1)
|
||||||
|
|
||||||
f3 = customtkinter.CTkFrame(app, fg_color="gray90", corner_radius=0)
|
f3 = customtkinter.CTkFrame(app, fg_color="gray85", corner_radius=0)
|
||||||
f3.grid(row=0, column=2, rowspan=1, columnspan=1, sticky="nsew")
|
f3.grid(row=0, column=2, rowspan=1, columnspan=1, sticky="nsew")
|
||||||
f3.grid_columnconfigure(0, weight=1)
|
f3.grid_columnconfigure(0, weight=1)
|
||||||
|
|
||||||
@ -38,8 +37,8 @@ for i in range(0, 18, 1):
|
|||||||
fg_color="#228da8")
|
fg_color="#228da8")
|
||||||
b.grid(row=i, column=0, pady=5, padx=15, sticky="nsew")
|
b.grid(row=i, column=0, pady=5, padx=15, sticky="nsew")
|
||||||
|
|
||||||
b = customtkinter.CTkButton(f3, corner_radius=i, height=34, border_width=3, text=f"{i} {i - 3}",
|
b = customtkinter.CTkButton(f3, corner_radius=i, height=34, border_width=2, text=f"{i} {i-2}",
|
||||||
fg_color=None, border_color="gray10", text_color="black")
|
fg_color=None, border_color="gray20", text_color="black")
|
||||||
b.grid(row=i, column=0, pady=5, padx=15, sticky="nsew")
|
b.grid(row=i, column=0, pady=5, padx=15, sticky="nsew")
|
||||||
|
|
||||||
b = customtkinter.CTkButton(f4, corner_radius=i, height=34, border_width=0, text=f"{i}",
|
b = customtkinter.CTkButton(f4, corner_radius=i, height=34, border_width=0, text=f"{i}",
|
||||||
|
29
test/test_string_dialog.py
Normal file
29
test/test_string_dialog.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import customtkinter
|
||||||
|
import tkinter
|
||||||
|
|
||||||
|
customtkinter.set_appearance_mode("light")
|
||||||
|
customtkinter.set_default_color_theme("dark-blue")
|
||||||
|
|
||||||
|
app = customtkinter.CTk()
|
||||||
|
app.geometry("400x300")
|
||||||
|
app.title("CTkDialog Test")
|
||||||
|
|
||||||
|
|
||||||
|
def change_mode():
|
||||||
|
if customtkinter.get_appearance_mode().lower() == "dark":
|
||||||
|
customtkinter.set_appearance_mode("light")
|
||||||
|
elif customtkinter.get_appearance_mode().lower() == "light":
|
||||||
|
customtkinter.set_appearance_mode("dark")
|
||||||
|
|
||||||
|
|
||||||
|
def button_click_event():
|
||||||
|
dialog = customtkinter.CTkDialog(master=None, text="Type in a number:", title="Test")
|
||||||
|
print("Number:", dialog.get_input())
|
||||||
|
|
||||||
|
|
||||||
|
button = customtkinter.CTkButton(app, text="Open Dialog", command=button_click_event)
|
||||||
|
button.place(relx=0.5, rely=0.5, anchor=tkinter.CENTER)
|
||||||
|
c1 = customtkinter.CTkCheckBox(app, text="dark mode", command=change_mode)
|
||||||
|
c1.place(relx=0.5, rely=0.8, anchor=tkinter.CENTER)
|
||||||
|
|
||||||
|
app.mainloop()
|
Loading…
x
Reference in New Issue
Block a user