Compare commits

..

3 Commits

Author SHA1 Message Date
cxykevin 19ee0bb25e Merge branch 'master' of http://hmtsai.cn:3000/cxykevin/magictk 2024-04-12 22:01:52 +08:00
cxykevin bc299029d4 优化button 2024-04-12 22:01:51 +08:00
cxykevin 2afec173df 大量优化button 2024-04-12 22:00:29 +08:00
5 changed files with 450 additions and 323 deletions

View File

@ -81,7 +81,8 @@ if __name__ == "__main__":
func=lambda s: kaoji(), w=130).pack(side='left') func=lambda s: kaoji(), w=130).pack(side='left')
frame6.pack() frame6.pack()
win.mainloop() frame7 = magictk.Frame(win)
magictk.Entry(frame7, w=100).pack(side='left')
frame7.pack()
# from magictk import workspace win.mainloop()
# print(workspace.get_gtk_workspace_size())

View File

@ -5,3 +5,4 @@ from magictk.checkbox import Checkbox, RadioGroup
from magictk.submenu import Menu, MenuObjs from magictk.submenu import Menu, MenuObjs
from magictk.select import Select from magictk.select import Select
from magictk.frame import Frame from magictk.frame import Frame
from magictk.entry import Entry

View File

@ -1,52 +1,22 @@
import json import json
import tkinter import tkinter
from tkinter import ttk from tkinter import ttk
from tkinter import font as tkfont
try:
import color_tmpl
except ImportError:
from magictk import color_tmpl
try:
import photoload
except ImportError:
from magictk import photoload
from magictk import color_tmpl
def set_font(): from magictk import photoload
global use_font from magictk import fontconfig
font_family = ["Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei",
"微软雅黑",
"Arial", "sans-serif"]
t_family = tkfont.families(root=None, displayof=None)
for i in font_family:
if i in t_family:
use_font = i
break
else:
print("Unknown font")
class Button: class Button:
color = color_tmpl.default_color color = color_tmpl.default_color
__fill_obj = []
__fill_func = []
__fill_gc = []
__fill_fc = []
__fill_hc = []
hover_mode = 0.0 hover_mode = 0.0
__is_hover = 0 _is_hover = 0
__flash_t = 0 _flash_t = 0
max_flash = 4 max_flash = 4
__anim_obj_id = -1 _anim_obj_id = -1
__color_bd = "border_base"
__color_bg = "background"
__color_fg = "primary"
__color_fg1 = "primary_light"
__color_fg2 = "primary_light2"
text = "Button" text = "Button"
def __draw_corner(self, r_x, r_y, x, y, **kwargs): def _draw_corner(self, r_x, r_y, x, y, **kwargs):
border_info = json.loads(photoload.loadres("buttonborder")) border_info = json.loads(photoload.loadres("buttonborder"))
y_n = 0 y_n = 0
for i in border_info: for i in border_info:
@ -65,49 +35,64 @@ class Button:
else: else:
lcolor = j lcolor = j
g_color = color_tmpl.mix_color( g_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_bd], int((1-lcolor/255)*1000)/1000) self.color["background"], self.color[self._color_bd], int((1-lcolor/255)*1000)/1000)
if (j < 0): if (j < 0):
f_color = color_tmpl.mix_color( f_color = color_tmpl.mix_color(
self.color[self.__color_fg2], self.color[self.__color_fg1], int((1-lcolor/255)*1000)/1000) self.color[self._color_fg2], self.color[self._color_fg1], int((1-lcolor/255)*1000)/1000)
else: else:
f_color = color_tmpl.mix_color( f_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_fg1], int((1-lcolor/255)*1000)/1000) self.color["background"], self.color[self._color_fg1], int((1-lcolor/255)*1000)/1000)
if (j < 0): if (j < 0):
h_color = color_tmpl.mix_color( h_color = color_tmpl.mix_color(
self.color[self.__color_fg2], self.color[self.__color_fg], int((1-lcolor/255)*1000)/1000) self.color[self._color_fg2], self.color[self._color_fg], int((1-lcolor/255)*1000)/1000)
else: else:
h_color = color_tmpl.mix_color( h_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_fg], int((1-lcolor/255)*1000)/1000) self.color["background"], self.color[self._color_fg], int((1-lcolor/255)*1000)/1000)
obj = self.canvas.create_rectangle( obj = self.canvas.create_rectangle(
px, py, px, py, width=0, fill=g_color) px, py, px, py, width=0, fill=g_color)
def update_color(obj, g_color, f_color, h_color): def update_color(obj, g_color, f_color, h_color):
if (self.__is_hover == 2): if (self._is_hover == 2):
self.canvas.itemconfig( self.canvas.itemconfig(
obj, fill=h_color) obj, fill=h_color)
else: else:
self.canvas.itemconfig( self.canvas.itemconfig(
obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode)) obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode))
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_gc.append(g_color) self._fill_gc.append(g_color)
self.__fill_fc.append(f_color) self._fill_fc.append(f_color)
self.__fill_hc.append(h_color) self._fill_hc.append(h_color)
self.__fill_obj.append(obj) self._fill_obj.append(obj)
x_n += 1 x_n += 1
y_n += 1 y_n += 1
def __update_color(self): def _update_color(self):
n = 0 n = 0
for i in self.__fill_func: for i in self._fill_func:
i(self.__fill_obj[n], self.__fill_gc[n], i(self._fill_obj[n], self._fill_gc[n],
self.__fill_fc[n], self.__fill_hc[n]) self._fill_fc[n], self._fill_hc[n])
n += 1 n += 1
def __init__(self, master=None, root_anim=None, w=80, h=30, text="Button", func=lambda s: print("Press"), color_list: None | dict = None): def __init__(self, master=None, root_anim=None, w=80, h=30, text="Button", func=lambda s: print("Press"), color_list: None | dict = None, _set_defaultcolor=None):
set_font() global use_font
self.__func = func use_font = fontconfig.getfont()
self._fill_obj = []
self._fill_func = []
self._fill_gc = []
self._fill_fc = []
self._fill_hc = []
self._func = func
if (_set_defaultcolor is None):
self._color_bd = "border_base"
self._color_bg = "background"
self._color_bg1 = "background"
self._color_fg = "primary"
self._color_fg1 = "primary_light"
self._color_fg2 = "primary_light2"
self._color_fg3 = "primary_light2"
self._color_text = None
self.w = max(30, w) self.w = max(30, w)
self.h = max(30, h) self.h = max(30, h)
self.text = text self.text = text
@ -122,8 +107,8 @@ class Button:
self.canvas = tkinter.Canvas( self.canvas = tkinter.Canvas(
master, bg=self.color["background"], width=self.w, height=self.h, borderwidth=0, bd=0, highlightcolor=self.color["background"], highlightthickness=0) master, bg=self.color["background"], width=self.w, height=self.h, borderwidth=0, bd=0, highlightcolor=self.color["background"], highlightthickness=0)
self.__draw() self._draw()
self.__update_color() self._update_color()
self.__bind_event() self.__bind_event()
self.bind_anim() self.bind_anim()
@ -136,90 +121,94 @@ class Button:
def place(self, *args, **kwargs): def place(self, *args, **kwargs):
self.canvas.place(*args, **kwargs) self.canvas.place(*args, **kwargs)
def __draw(self): def _draw(self):
self.__draw_corner(0, 0, 0, 0) self._draw_corner(0, 0, 0, 0)
self.__draw_corner(1, 0, self.w-4, 0) self._draw_corner(1, 0, self.w-4, 0)
self.__draw_corner(0, 1, 0, self.h-5) self._draw_corner(0, 1, 0, self.h-5)
self.__draw_corner(1, 1, self.w-4, self.h-5) self._draw_corner(1, 1, self.w-4, self.h-5)
def update_color(obj, g_color, f_color, h_color): def update_color(obj, g_color, f_color, h_color):
if (self.__is_hover == 2): if (self._is_hover == 2):
self.canvas.itemconfig( self.canvas.itemconfig(
obj, fill=h_color) obj, fill=h_color)
else: else:
self.canvas.itemconfig( self.canvas.itemconfig(
obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode)) obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode))
self.__fill_fc.append(self.color[self.__color_fg1]) self._fill_fc.append(self.color[self._color_fg1])
self.__fill_gc.append(self.color[self.__color_bd]) self._fill_gc.append(self.color[self._color_bd])
self.__fill_hc.append(self.color[self.__color_fg]) self._fill_hc.append(self.color[self._color_fg])
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line( self._fill_obj.append(self.canvas.create_line(
1, 5, 1, self.h-5, width=1, fill=self.color[self.__color_bd])) 1, 5, 1, self.h-5, width=1, fill=self.color[self._color_bd]))
self.__fill_fc.append(self.color[self.__color_fg1]) self._fill_fc.append(self.color[self._color_fg1])
self.__fill_gc.append(self.color[self.__color_bd]) self._fill_gc.append(self.color[self._color_bd])
self.__fill_hc.append(self.color[self.__color_fg]) self._fill_hc.append(self.color[self._color_fg])
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line( self._fill_obj.append(self.canvas.create_line(
5, 1, self.w-4, 1, width=1, fill=self.color[self.__color_fg1])) 5, 1, self.w-4, 1, width=1, fill=self.color[self._color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1]) self._fill_fc.append(self.color[self._color_fg1])
self.__fill_gc.append(self.color[self.__color_bd]) self._fill_gc.append(self.color[self._color_bd])
self.__fill_hc.append(self.color[self.__color_fg]) self._fill_hc.append(self.color[self._color_fg])
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line( self._fill_obj.append(self.canvas.create_line(
self.w-1, 5, self.w-1, self.h-5, width=1, fill=self.color[self.__color_fg1])) self.w-1, 5, self.w-1, self.h-5, width=1, fill=self.color[self._color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1]) self._fill_fc.append(self.color[self._color_fg1])
self.__fill_gc.append(self.color[self.__color_bd]) self._fill_gc.append(self.color[self._color_bd])
self.__fill_hc.append(self.color[self.__color_fg]) self._fill_hc.append(self.color[self._color_fg])
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line( self._fill_obj.append(self.canvas.create_line(
5, self.h-2, self.w-4, self.h-2, width=1, fill=self.color[self.__color_fg1])) 5, self.h-2, self.w-4, self.h-2, width=1, fill=self.color[self._color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg2]) self._fill_fc.append(self.color[self._color_fg3])
self.__fill_gc.append(self.color["background"]) self._fill_gc.append(self.color[self._color_bg1])
self.__fill_hc.append(self.color[self.__color_fg2]) self._fill_hc.append(self.color[self._color_fg2])
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_rectangle( self._fill_obj.append(self.canvas.create_rectangle(
2, 5, self.w-1, self.h-5, width=0, fill=self.color[self.__color_fg2])) 2, 5, self.w-1, self.h-5, width=0, fill=self.color[self._color_fg2]))
self.__fill_fc.append(self.color[self.__color_fg2]) self._fill_fc.append(self.color[self._color_fg3])
self.__fill_gc.append(self.color["background"]) self._fill_gc.append(self.color[self._color_bg1])
self.__fill_hc.append(self.color[self.__color_fg2]) self._fill_hc.append(self.color[self._color_fg2])
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_rectangle( self._fill_obj.append(self.canvas.create_rectangle(
5, 2, self.w-4, self.h-2, width=0, fill=self.color[self.__color_fg2])) 5, 2, self.w-4, self.h-2, width=0, fill=self.color[self._color_fg2]))
self.__fill_fc.append(self.color[self.__color_fg]) if (self._color_text is None):
self.__fill_gc.append(self.color["regular_text"]) self._fill_fc.append(self.color[self._color_fg])
self.__fill_hc.append(self.color[self.__color_fg]) self._fill_gc.append(self.color["regular_text"])
self.__fill_func.append(update_color) self._fill_hc.append(self.color[self._color_fg])
self.__fill_obj.append( else:
self._fill_fc.append(self._color_text)
self._fill_gc.append(self._color_text)
self._fill_hc.append(self._color_text)
self._fill_func.append(update_color)
self._fill_obj.append(
self.canvas.create_text(int(self.w/2), int(self.h/2), text=self.text, font=(use_font, 10))) self.canvas.create_text(int(self.w/2), int(self.h/2), text=self.text, font=(use_font, 10)))
def bind_anim(self): def bind_anim(self):
def anim_magictk(): def anim_magictk():
if (self.__is_hover == 1 and self.__flash_t < self.max_flash): if (self._is_hover == 1 and self._flash_t < self.max_flash):
self.__flash_t += (1 if (len(self.root.anim) > 6) else 1) self._flash_t += (1 if (len(self.root.anim) > 6) else 1)
self.__flash_t = min(self.__flash_t, self.max_flash) self._flash_t = min(self._flash_t, self.max_flash)
self.hover_mode = self.__flash_t/self.max_flash self.hover_mode = self._flash_t/self.max_flash
self.__update_color() self._update_color()
elif (self.__is_hover == 0 and self.__flash_t > 0): elif (self._is_hover == 0 and self._flash_t > 0):
self.__flash_t -= (1 if (len(self.root.anim) > 6) else 1) self._flash_t -= (1 if (len(self.root.anim) > 6) else 1)
self.__flash_t = max(self.__flash_t, 0) self._flash_t = max(self._flash_t, 0)
self.hover_mode = self.__flash_t/self.max_flash self.hover_mode = self._flash_t/self.max_flash
self.__update_color() self._update_color()
# elif (self.__is_hover == 0 and self.__flash_t <= 0): else:
# if self.__anim_obj_id != -1: return -1
# self.__anim_obj_id = None
def anim_normal(*args): def anim_normal(*args):
if (self.__is_hover == 1 and self.__flash_t < self.max_flash): if (self._is_hover == 1 and self._flash_t < self.max_flash):
self.__flash_t += 1 self._flash_t += 1
self.hover_mode = self.__flash_t/self.max_flash self.hover_mode = self._flash_t/self.max_flash
self.__update_color() self._update_color()
elif (self.__is_hover == 0 and self.__flash_t > 0): elif (self._is_hover == 0 and self._flash_t > 0):
self.__flash_t -= 1 self._flash_t -= 1
self.hover_mode = self.__flash_t/self.max_flash self.hover_mode = self._flash_t/self.max_flash
self.__update_color() self._update_color()
self.root.after(anim_normal, 16) self.root.after(anim_normal, 16)
try: try:
@ -229,54 +218,37 @@ class Button:
else: else:
if (anim_magictk not in self.root.anim): if (anim_magictk not in self.root.anim):
self.root.anim.append(anim_magictk) self.root.anim.append(anim_magictk)
self.__anim_obj_id = self.root.anim[-1] self._anim_obj_id = self.root.anim[-1]
def __bind_event(self): def __bind_event(self):
def enter_v(*args): def enter_v(*args):
# self.bind_anim() self.bind_anim()
if (self.__is_hover == 0): if (self._is_hover == 0):
self.__is_hover = 1 self._is_hover = 1
self.canvas.bind("<Enter>", enter_v) self.canvas.bind("<Enter>", enter_v)
def leave_v(*args): def leave_v(*args):
# self.bind_anim() self.bind_anim()
if (self.__is_hover == 1): if (self._is_hover == 1):
self.__is_hover = 0 self._is_hover = 0
self.canvas.bind("<Leave>", leave_v) self.canvas.bind("<Leave>", leave_v)
def press_v(*args): def press_v(*args):
self.__is_hover = 2 self._is_hover = 2
self.__update_color() self._update_color()
self.canvas.bind("<Button-1>", press_v) self.canvas.bind("<Button-1>", press_v)
def pressrelease_v(*args): def pressrelease_v(*args):
# self.bind_anim() self.bind_anim()
self.__is_hover = 1 self._is_hover = 1
self.__func(self) self._func(self)
self.__update_color() self._update_color()
self.canvas.bind("<ButtonRelease-1>", pressrelease_v) self.canvas.bind("<ButtonRelease-1>", pressrelease_v)
class ButtonFill(Button): class ButtonFill(Button):
__color_bd = "primary"
__color_bg = "primary"
__color_fg = "primary"
__color_fg1 = "primary_light3"
__color_fg2 = "primary_dark"
color = color_tmpl.default_color
__fill_obj = []
__fill_func = []
__fill_gc = []
__fill_fc = []
__fill_hc = []
hover_mode = 0.0
__is_hover = 0
__flash_t = 0
max_flash = 4
__anim_obj_id = -1
text = "ButtonFill"
def __draw_corner(self, r_x, r_y, x, y, **kwargs): def _draw_corner(self, r_x, r_y, x, y, **kwargs):
border_info = json.loads(photoload.loadres("buttonborder")) border_info = json.loads(photoload.loadres("buttonborder"))
y_n = 0 y_n = 0
for i in border_info: for i in border_info:
@ -296,192 +268,50 @@ class ButtonFill(Button):
lcolor = j lcolor = j
if (j < 0): if (j < 0):
g_color = color_tmpl.mix_color( g_color = color_tmpl.mix_color(
self.color[self.__color_bg], self.color[self.__color_bd], int((1-lcolor/255)*1000)/1000) self.color[self._color_bg], self.color[self._color_bd], int((1-lcolor/255)*1000)/1000)
else: else:
g_color = color_tmpl.mix_color( g_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_bd], int((1-lcolor/255)*1000)/1000) self.color["background"], self.color[self._color_bd], int((1-lcolor/255)*1000)/1000)
if (j < 0): if (j < 0):
f_color = color_tmpl.mix_color( f_color = color_tmpl.mix_color(
self.color[self.__color_fg1], self.color[self.__color_fg1], int((1-lcolor/255)*1000)/1000) self.color[self._color_fg1], self.color[self._color_fg1], int((1-lcolor/255)*1000)/1000)
else: else:
f_color = color_tmpl.mix_color( f_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_fg1], int((1-lcolor/255)*1000)/1000) self.color["background"], self.color[self._color_fg1], int((1-lcolor/255)*1000)/1000)
if (j < 0): if (j < 0):
h_color = color_tmpl.mix_color( h_color = color_tmpl.mix_color(
self.color[self.__color_fg2], self.color[self.__color_fg2], int((1-lcolor/255)*1000)/1000) self.color[self._color_fg2], self.color[self._color_fg2], int((1-lcolor/255)*1000)/1000)
else: else:
h_color = color_tmpl.mix_color( h_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_fg2], int((1-lcolor/255)*1000)/1000) self.color["background"], self.color[self._color_fg2], int((1-lcolor/255)*1000)/1000)
obj = self.canvas.create_rectangle( obj = self.canvas.create_rectangle(
px, py, px, py, width=0, fill=g_color) px, py, px, py, width=0, fill=g_color)
def update_color(obj, g_color, f_color, h_color): def update_color(obj, g_color, f_color, h_color):
if (self.__is_hover == 2): if (self._is_hover == 2):
self.canvas.itemconfig( self.canvas.itemconfig(
obj, fill=h_color) obj, fill=h_color)
else: else:
self.canvas.itemconfig( self.canvas.itemconfig(
obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode)) obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode))
self.__fill_func.append(update_color) self._fill_func.append(update_color)
self.__fill_gc.append(g_color) self._fill_gc.append(g_color)
self.__fill_fc.append(f_color) self._fill_fc.append(f_color)
self.__fill_hc.append(h_color) self._fill_hc.append(h_color)
self.__fill_obj.append(obj) self._fill_obj.append(obj)
x_n += 1 x_n += 1
y_n += 1 y_n += 1
def __update_color(self):
n = 0
for i in self.__fill_func:
i(self.__fill_obj[n], self.__fill_gc[n],
self.__fill_fc[n], self.__fill_hc[n])
n += 1
def __init__(self, master=None, root_anim=None, color_type="primary", w=80, h=30, text="Button", func=lambda s: print("Press"), color_list: None | dict = None): def __init__(self, master=None, root_anim=None, color_type="primary", w=80, h=30, text="Button", func=lambda s: print("Press"), color_list: None | dict = None):
self.__func = func self._color_bd = color_type
set_font() self._color_bg = color_type
self.__color_bd = color_type self._color_bg1 = color_type
self.__color_bg = color_type self._color_fg = color_type+"_light3"
self.__color_fg = color_type self._color_fg1 = color_type+"_dark"
self.__color_fg1 = color_type+"_light3" self._color_fg2 = color_type+"_light3"
self.__color_fg2 = color_type+"_dark" self._color_fg3 = color_type+"_dark"
self.w = max(30, w) self._color_text = "#FFFFFF"
self.h = max(30, h) super().__init__(master=master, root_anim=root_anim, w=w, h=h,
self.text = text text=text, color_list=color_list, func=func, _set_defaultcolor=True)
self.__master = master
if (color_list is not None):
self.color = color_list
if (root_anim == None):
self.root = master.root
else:
self.root = root_anim
self.canvas = tkinter.Canvas(
master, bg=self.color["background"], width=self.w, height=self.h, borderwidth=0, bd=0, highlightcolor=self.color["background"], highlightthickness=0)
self.__draw()
self.__update_color()
self.__bind_event()
self.bind_anim()
def __draw(self):
self.__draw_corner(0, 0, 0, 0)
self.__draw_corner(1, 0, self.w-4, 0)
self.__draw_corner(0, 1, 0, self.h-5)
self.__draw_corner(1, 1, self.w-4, self.h-5)
def update_color(obj, g_color, f_color, h_color):
if (self.__is_hover == 2):
self.canvas.itemconfig(
obj, fill=h_color)
else:
self.canvas.itemconfig(
obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
1, 5, 1, self.h-5, width=1, fill=self.color[self.__color_bd]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
5, 1, self.w-4, 1, width=1, fill=self.color[self.__color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
self.w-1, 5, self.w-1, self.h-5, width=1, fill=self.color[self.__color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
5, self.h-2, self.w-4, self.h-2, width=1, fill=self.color[self.__color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_rectangle(
2, 5, self.w-1, self.h-5, width=0, fill=self.color[self.__color_fg2]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_rectangle(
5, 2, self.w-4, self.h-2, width=0, fill=self.color[self.__color_fg2]))
self.__fill_fc.append("#FFFFFF")
self.__fill_gc.append("#FFFFFF")
self.__fill_hc.append("#FFFFFF")
self.__fill_func.append(update_color)
self.__fill_obj.append(
self.canvas.create_text(int(self.w/2), int(self.h/2), text=self.text, font=(use_font, 10)))
def bind_anim(self):
def anim_magictk():
if (self.__is_hover == 1 and self.__flash_t < self.max_flash):
self.__flash_t += (1 if (len(self.root.anim) > 6) else 1)
self.__flash_t = min(self.__flash_t, self.max_flash)
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
elif (self.__is_hover == 0 and self.__flash_t > 0):
self.__flash_t -= (1 if (len(self.root.anim) > 6) else 1)
self.__flash_t = max(self.__flash_t, 0)
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
# elif (self.__is_hover == 0 and self.__flash_t <= 0):
# if self.__anim_obj_id != -1:
# self.__anim_obj_id = None
def anim_normal(*args):
if (self.__is_hover == 1 and self.__flash_t < self.max_flash):
self.__flash_t += 1
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
elif (self.__is_hover == 0 and self.__flash_t > 0):
self.__flash_t -= 1
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
self.root.after(anim_normal, 16)
try:
self.root.anim == 0
except:
self.root.after(anim_normal, 16)
else:
if (anim_magictk not in self.root.anim):
self.root.anim.append(anim_magictk)
self.__anim_obj_id = self.root.anim[-1]
def __bind_event(self):
def enter_v(*args):
# self.bind_anim()
if (self.__is_hover == 0):
self.__is_hover = 1
self.canvas.bind("<Enter>", enter_v)
def leave_v(*args):
# self.bind_anim()
if (self.__is_hover == 1):
self.__is_hover = 0
self.canvas.bind("<Leave>", leave_v)
def press_v(*args):
self.__is_hover = 2
self.__update_color()
self.canvas.bind("<Button-1>", press_v)
def pressrelease_v(*args):
# self.bind_anim()
self.__is_hover = 1
self.__func(self)
self.__update_color()
self.canvas.bind("<ButtonRelease-1>", pressrelease_v)

269
magictk/entry.py Normal file
View File

@ -0,0 +1,269 @@
import json
import tkinter
import sys
from tkinter import ttk
from tkinter import font as tkfont
try:
import color_tmpl
except ImportError:
from magictk import color_tmpl
try:
import photoload
except ImportError:
from magictk import photoload
try:
import submenu
except ImportError:
from magictk import submenu
def set_font():
global use_font
font_family = ["Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei",
"微软雅黑",
"Arial", "sans-serif"]
t_family = tkfont.families(root=None, displayof=None)
for i in font_family:
if i in t_family:
use_font = i
break
else:
print("Unknown font")
class Entry:
color = color_tmpl.default_color
__fill_obj = []
__fill_func = []
__fill_gc = []
__fill_fc = []
__fill_hc = []
hover_mode = 0.0
__is_hover = 0
__flash_t = 0
max_flash = 6
__anim_obj_id = -1
__color_bd = "border_base"
__color_bg = "background"
__color_fg = "primary"
__color_fg1 = "primary"
__color_fg2 = "background"
text = "Input"
input_text = ""
def __draw_corner(self, r_x, r_y, x, y, **kwargs):
border_info = json.loads(photoload.loadres("buttonborder"))
y_n = 0
for i in border_info:
x_n = 0
for j in i:
if (r_x == 0):
px = x+x_n+1
else:
px = x+4-x_n-1
if (r_y == 0):
py = y+y_n+1
else:
py = y+4-y_n-1
if (j < 0):
lcolor = -j
else:
lcolor = j
g_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_bd], int((1-lcolor/255)*1000)/1000)
if (j < 0):
f_color = color_tmpl.mix_color(
self.color[self.__color_fg2], self.color[self.__color_fg1], int((1-lcolor/255)*1000)/1000)
else:
f_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_fg1], int((1-lcolor/255)*1000)/1000)
if (j < 0):
h_color = color_tmpl.mix_color(
self.color[self.__color_fg2], self.color[self.__color_fg], int((1-lcolor/255)*1000)/1000)
else:
h_color = color_tmpl.mix_color(
self.color["background"], self.color[self.__color_fg], int((1-lcolor/255)*1000)/1000)
obj = self.canvas.create_rectangle(
px, py, px, py, width=0, fill=g_color)
def update_color(obj, g_color, f_color, h_color):
if (self.__is_hover == 2):
self.canvas.itemconfig(
obj, fill=h_color)
else:
self.canvas.itemconfig(
obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode))
self.__fill_func.append(update_color)
self.__fill_gc.append(g_color)
self.__fill_fc.append(f_color)
self.__fill_hc.append(h_color)
self.__fill_obj.append(obj)
x_n += 1
y_n += 1
def __update_color(self):
n = 0
for i in self.__fill_func:
i(self.__fill_obj[n], self.__fill_gc[n],
self.__fill_fc[n], self.__fill_hc[n])
n += 1
def __init__(self, master=None, root_anim=None, w=200, h=30, text="Input", color_list: None | dict = None, items=[]):
set_font()
self.input_text = ""
self.items = items
self.w = max(120, w)
self.h = max(30, h)
self.text = text
self.choose = -1
self.__master = master
if (color_list is not None):
self.color = color_list
if (root_anim == None):
self.root = master.root
else:
self.root = root_anim
self.canvas = tkinter.Canvas(
master, bg=self.color["background"], width=self.w, height=self.h, borderwidth=0, bd=0, highlightcolor=self.color["background"], highlightthickness=0)
self.__draw()
self.__update_color()
self.__bind_event()
self.bind_anim()
def pack(self, *args, **kwargs):
self.canvas.pack(*args, **kwargs)
def guid(self, *args, **kwargs):
self.canvas.guid(*args, **kwargs)
def place(self, *args, **kwargs):
self.canvas.place(*args, **kwargs)
def __draw(self):
self.__draw_corner(0, 0, 0, 0)
self.__draw_corner(1, 0, self.w-4, 0)
self.__draw_corner(0, 1, 0, self.h-5)
self.__draw_corner(1, 1, self.w-4, self.h-5)
def update_color(obj, g_color, f_color, h_color):
if (self.__is_hover == 2):
self.canvas.itemconfig(
obj, fill=h_color)
else:
self.canvas.itemconfig(
obj, fill=color_tmpl.mix_color(g_color, f_color, self.hover_mode))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
1, 5, 1, self.h-5, width=1, fill=self.color[self.__color_bd]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
5, 1, self.w-4, 1, width=1, fill=self.color[self.__color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
self.w-1, 5, self.w-1, self.h-5, width=1, fill=self.color[self.__color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg1])
self.__fill_gc.append(self.color[self.__color_bd])
self.__fill_hc.append(self.color[self.__color_fg])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_line(
5, self.h-2, self.w-4, self.h-2, width=1, fill=self.color[self.__color_fg1]))
self.__fill_fc.append(self.color[self.__color_fg2])
self.__fill_gc.append(self.color["background"])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_rectangle(
2, 5, self.w-1, self.h-5, width=0, fill=self.color[self.__color_fg2]))
self.__fill_fc.append(self.color[self.__color_fg2])
self.__fill_gc.append(self.color["background"])
self.__fill_hc.append(self.color[self.__color_fg2])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.canvas.create_rectangle(
5, 2, self.w-4, self.h-2, width=0, fill=self.color[self.__color_fg2]))
self.__text_obj = self.canvas.create_text(
20, int(self.h/2), text=self.text, font=(use_font, 10), justify="left")
self.__fill_fc.append(self.color["placeholder"])
self.__fill_gc.append(self.color["placeholder"])
self.__fill_hc.append(self.color["placeholder"])
self.__fill_func.append(update_color)
self.__fill_obj.append(self.__text_obj)
self.canvas.moveto(self.__text_obj, 16, self.h//2-10)
def bind_anim(self):
def anim_magictk():
if (self.__is_hover == 1 and self.__flash_t < self.max_flash):
self.__flash_t += (1 if (len(self.root.anim) > 6) else 1)
self.__flash_t = min(self.__flash_t, self.max_flash)
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
elif (self.__is_hover == 0 and self.__flash_t > 0):
self.__flash_t -= (1 if (len(self.root.anim) > 6) else 1)
self.__flash_t = max(self.__flash_t, 0)
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
# elif (self.__is_hover == 0 and self.__flash_t <= 0):
# if self.__anim_obj_id != -1:
# self.__anim_obj_id = None
def anim_normal(*args):
if (self.__is_hover == 1 and self.__flash_t < self.max_flash):
self.__flash_t += 1
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
elif (self.__is_hover == 0 and self.__flash_t > 0):
self.__flash_t -= 1
self.hover_mode = self.__flash_t/self.max_flash
self.__update_color()
self.root.after(anim_normal, 16)
try:
self.root.anim == 0
except:
self.root.after(anim_normal, 16)
else:
if (anim_magictk not in self.root.anim):
self.root.anim.append(anim_magictk)
self.__anim_obj_id = self.root.anim[-1]
def __callback_menu(self, obj, ids):
self.__menuobj.menu_effect[self.__last] = {}
self.__menuobj.menu_effect[ids] = {
"fill": self.color["primary"], "font": (obj.font[0], obj.font[1], "bold")}
self.__last = ids
self.canvas.itemconfigure(self.__text_obj, text=self.items[ids])
self.canvas.moveto(self.__text_obj, 16, self.h//2-10)
def __bind_event(self):
def closecallback(obj):
self.__is_hover = 0
def pressrelease_v(event: tkinter.Event):
if (self.__is_hover == 1):
self.__is_hover = 0
else:
self.__is_hover = 1
self.top = tkinter.Toplevel()
self.top.geometry(
f"{self.w}x{self.h}+{event.x_root-event.x}+{event.y_root-event.y}")
self.top.wm_attributes("-alpha", 0.5)
self.__top_entry = ttk.Entry(self.top, width=self.w)
self.__top_entry.place(x=0, y=0, width=self.w, height=self.h)
self.__top_entry.focus_force()
self.__update_color()
self.canvas.bind("<ButtonRelease-1>", pressrelease_v)

26
magictk/fontconfig.py Normal file
View File

@ -0,0 +1,26 @@
from tkinter import font as tkfont
font = None
def set_font():
font_family = ["Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei",
"微软雅黑",
"Arial", "sans-serif"]
t_family = tkfont.families(root=None, displayof=None)
for i in font_family:
if i in t_family:
use_font = i
break
else:
print("Unknown font")
return use_font
def getfont():
global font
if (font is None):
font = set_font()
return font