mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
progress on test_ttk_frames.py
This commit is contained in:
parent
7da9c73115
commit
cdbf2382ef
@ -83,7 +83,7 @@ if sys.platform.startswith("win"):
|
|||||||
pathbuf = create_unicode_buffer(fontpath)
|
pathbuf = create_unicode_buffer(fontpath)
|
||||||
AddFontResourceEx = windll.gdi32.AddFontResourceExW
|
AddFontResourceEx = windll.gdi32.AddFontResourceExW
|
||||||
else:
|
else:
|
||||||
raise TypeError('fontpath must be of type str or unicode')
|
raise TypeError('fontpath must be of type bytes or str')
|
||||||
|
|
||||||
flags = (FR_PRIVATE if private else 0) | (FR_NOT_ENUM if not enumerable else 0)
|
flags = (FR_PRIVATE if private else 0) | (FR_NOT_ENUM if not enumerable else 0)
|
||||||
num_fonts_added = AddFontResourceEx(byref(pathbuf), flags, 0)
|
num_fonts_added = AddFontResourceEx(byref(pathbuf), flags, 0)
|
||||||
|
5
customtkinter/customtkinter_base_class.py
Normal file
5
customtkinter/customtkinter_base_class.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import tkinter
|
||||||
|
import tkinter.ttk as ttk
|
||||||
|
|
||||||
|
|
||||||
|
class CTkWidgetBaseClass:
|
@ -1,4 +1,5 @@
|
|||||||
import tkinter
|
import tkinter
|
||||||
|
import tkinter.ttk as ttk
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from .customtkinter_tk import CTk
|
from .customtkinter_tk import CTk
|
||||||
@ -143,10 +144,32 @@ class CTkButton(tkinter.Frame):
|
|||||||
self.draw(no_color_updates=True) # fast drawing without color changes
|
self.draw(no_color_updates=True) # fast drawing without color changes
|
||||||
|
|
||||||
def detect_color_of_master(self):
|
def detect_color_of_master(self):
|
||||||
if isinstance(self.master, CTkFrame):
|
""" detect color of self.master widget to set correct bg_color """
|
||||||
|
|
||||||
|
if isinstance(self.master, CTkFrame): # master is CTkFrame
|
||||||
return self.master.fg_color
|
return self.master.fg_color
|
||||||
else:
|
|
||||||
return self.master.cget("bg")
|
elif isinstance(self.master, ttk.Frame): # master is ttk widget
|
||||||
|
print("button on", self.master.winfo_class())
|
||||||
|
try:
|
||||||
|
ttk_style = ttk.Style()
|
||||||
|
return ttk_style.lookup(self.master.winfo_class(), 'background')
|
||||||
|
except Exception:
|
||||||
|
return "#000000"
|
||||||
|
|
||||||
|
elif isinstance(self.master, ttk.LabelFrame):
|
||||||
|
print("button on", self.master.winfo_class())
|
||||||
|
try:
|
||||||
|
ttk_style = ttk.Style()
|
||||||
|
return ttk_style.lookup(self.master.winfo_class(), 'foreground')
|
||||||
|
except Exception:
|
||||||
|
return "#000000"
|
||||||
|
|
||||||
|
else: # master is normal tkinter widget
|
||||||
|
try:
|
||||||
|
return self.master.cget("bg") # try to get bg color by .cget() method
|
||||||
|
except Exception:
|
||||||
|
return "#000000"
|
||||||
|
|
||||||
def draw(self, no_color_updates=False):
|
def draw(self, no_color_updates=False):
|
||||||
requires_recoloring = self.draw_engine.draw_rounded_rect_with_border(self.width, self.height, self.corner_radius, self.border_width)
|
requires_recoloring = self.draw_engine.draw_rounded_rect_with_border(self.width, self.height, self.corner_radius, self.border_width)
|
||||||
|
@ -62,13 +62,6 @@ class CTkThemeManager:
|
|||||||
|
|
||||||
return cls.rgb2hex(new_rgb)
|
return cls.rgb2hex(new_rgb)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def disabled_color(cls, hex_color: str):
|
|
||||||
if appearance_mode == 0: # Light mode
|
|
||||||
return cls.theme["color"]["text_disabled"]
|
|
||||||
else:
|
|
||||||
return cls.multiply_hex_color(hex_color, 0.8)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def multiply_hex_color(cls, hex_color: str, factor: float = None) -> str:
|
def multiply_hex_color(cls, hex_color: str, factor: float = None) -> str:
|
||||||
if factor is None:
|
if factor is None:
|
||||||
@ -90,4 +83,4 @@ class CTkThemeManager:
|
|||||||
cls.MAIN_HOVER_COLOR = main_color_hover
|
cls.MAIN_HOVER_COLOR = main_color_hover
|
||||||
|
|
||||||
|
|
||||||
CTkThemeManager.load_theme("blue")
|
CTkThemeManager.load_theme("blue") # standard theme
|
||||||
|
@ -7,10 +7,10 @@ app.geometry("600x500")
|
|||||||
canvas = tkinter.Canvas(master=app, highlightthickness=0, bg="gray30")
|
canvas = tkinter.Canvas(master=app, highlightthickness=0, bg="gray30")
|
||||||
canvas.pack(expand=True, fill="both")
|
canvas.pack(expand=True, fill="both")
|
||||||
|
|
||||||
text_1 = canvas.create_text(100, 100, text="⬤", font=('Helvetica','2','bold'))
|
text_1 = canvas.create_text(100, 100, text="⬤", font=('Helvetica', -4, 'bold'))
|
||||||
text_2 = canvas.create_text(100, 200, text="⬤", font=('Helvetica','4','bold'))
|
text_2 = canvas.create_text(100, 200, text="⬤", font=('Helvetica', -8, 'bold'))
|
||||||
text_3 = canvas.create_text(100, 300, text="⬤", font=('Helvetica','6','bold'))
|
text_3 = canvas.create_text(100, 300, text="⬤", font=('Helvetica', -12, 'bold'))
|
||||||
text_4 = canvas.create_text(100, 400, text="⬤", font=('Helvetica',8,'bold'))
|
text_4 = canvas.create_text(100, 400, text="⬤", font=('Helvetica', -20, 'bold'))
|
||||||
text_4 = canvas.create_text(400, 400, text="⬤", font=('Helvetica',80,'bold'))
|
text_5 = canvas.create_text(400, 400, text="⬤", font=('Helvetica', -100, 'bold'))
|
||||||
|
|
||||||
app.mainloop()
|
app.mainloop()
|
||||||
|
97
test/test_ttk_frames.py
Normal file
97
test/test_ttk_frames.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import tkinter
|
||||||
|
import tkinter.ttk as ttk
|
||||||
|
import customtkinter
|
||||||
|
|
||||||
|
root_tk = customtkinter.CTk()
|
||||||
|
root_tk.geometry("1400x480")
|
||||||
|
root_tk.title("CustomTkinter TTk Compatibility Test")
|
||||||
|
|
||||||
|
root_tk.grid_rowconfigure(0, weight=1)
|
||||||
|
root_tk.grid_columnconfigure((0, 1, 2, 3, 5), weight=1)
|
||||||
|
|
||||||
|
|
||||||
|
button_0 = customtkinter.CTkButton(root_tk)
|
||||||
|
button_0.grid(padx=20, pady=20, row=0, column=0)
|
||||||
|
|
||||||
|
frame_1 = tkinter.Frame(master=root_tk)
|
||||||
|
frame_1.grid(padx=20, pady=20, row=0, column=1, sticky="nsew")
|
||||||
|
button_1 = customtkinter.CTkButton(frame_1, text="tkinter.Frame")
|
||||||
|
button_1.pack(pady=20, padx=20)
|
||||||
|
|
||||||
|
frame_2 = tkinter.LabelFrame(master=root_tk, text="Tkinter LabelFrame")
|
||||||
|
frame_2.grid(padx=20, pady=20, row=0, column=2, sticky="nsew")
|
||||||
|
button_2 = customtkinter.CTkButton(frame_2, text="tkinter.LabelFrame")
|
||||||
|
button_2.pack(pady=20, padx=20)
|
||||||
|
|
||||||
|
frame_3 = ttk.Frame(master=root_tk)
|
||||||
|
frame_3.grid(padx=20, pady=20, row=0, column=3, sticky="nsew")
|
||||||
|
button_3 = customtkinter.CTkButton(frame_3, text="ttk.Frame")
|
||||||
|
button_3.pack(pady=20, padx=20)
|
||||||
|
|
||||||
|
frame_4 = ttk.LabelFrame(master=root_tk, text="TTk LabelFrame")
|
||||||
|
frame_4.grid(padx=20, pady=20, row=0, column=4, sticky="nsew")
|
||||||
|
button_4 = customtkinter.CTkButton(frame_4)
|
||||||
|
button_4.pack(pady=20, padx=20)
|
||||||
|
|
||||||
|
frame_5 = ttk.Notebook(master=root_tk)
|
||||||
|
frame_5.grid(padx=20, pady=20, row=0, column=5, sticky="nsew")
|
||||||
|
button_5 = customtkinter.CTkButton(frame_5, text="ttk.Notebook")
|
||||||
|
button_5.pack(pady=20, padx=20)
|
||||||
|
|
||||||
|
ttk_style = ttk.Style()
|
||||||
|
ttk_style.configure(frame_3.winfo_class(), background='red')
|
||||||
|
|
||||||
|
|
||||||
|
def iter_layout(layout, tab_amnt=0, elements=[]):
|
||||||
|
"""Recursively prints the layout children."""
|
||||||
|
el_tabs = ' '*tab_amnt
|
||||||
|
val_tabs = ' '*(tab_amnt + 1)
|
||||||
|
|
||||||
|
for element, child in layout:
|
||||||
|
elements.append(element)
|
||||||
|
print(el_tabs+ '\'{}\': {}'.format(element, '{'))
|
||||||
|
for key, value in child.items():
|
||||||
|
if type(value) == str:
|
||||||
|
print(val_tabs + '\'{}\' : \'{}\','.format(key, value))
|
||||||
|
else:
|
||||||
|
print(val_tabs + '\'{}\' : [('.format(key))
|
||||||
|
iter_layout(value, tab_amnt=tab_amnt+3)
|
||||||
|
print(val_tabs + ')]')
|
||||||
|
|
||||||
|
print(el_tabs + '{}{}'.format('} // ', element))
|
||||||
|
|
||||||
|
return elements
|
||||||
|
|
||||||
|
def stylename_elements_options(stylename, widget):
|
||||||
|
"""Function to expose the options of every element associated to a widget stylename."""
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Get widget elements
|
||||||
|
style = ttk.Style()
|
||||||
|
layout = style.layout(stylename)
|
||||||
|
config = widget.configure()
|
||||||
|
|
||||||
|
print('{:*^50}\n'.format(f'Style = {stylename}'))
|
||||||
|
|
||||||
|
print('{:*^50}'.format('Config'))
|
||||||
|
for key, value in config.items():
|
||||||
|
print('{:<15}{:^10}{}'.format(key, '=>', value))
|
||||||
|
|
||||||
|
print('\n{:*^50}'.format('Layout'))
|
||||||
|
elements = iter_layout(layout)
|
||||||
|
|
||||||
|
# Get options of widget elements
|
||||||
|
print('\n{:*^50}'.format('element options'))
|
||||||
|
for element in elements:
|
||||||
|
print('{0:30} options: {1}'.format(
|
||||||
|
element, style.element_options(element)))
|
||||||
|
|
||||||
|
except tk.TclError:
|
||||||
|
print('_tkinter.TclError: "{0}" in function'
|
||||||
|
'widget_elements_options({0}) is not a regonised stylename.'
|
||||||
|
.format(stylename))
|
||||||
|
|
||||||
|
|
||||||
|
stylename_elements_options(frame_3.winfo_class(), frame_3)
|
||||||
|
|
||||||
|
root_tk.mainloop()
|
Loading…
Reference in New Issue
Block a user