diff --git a/magictk/entry.py b/magictk/entry.py index 186d299..f87218d 100644 --- a/magictk/entry.py +++ b/magictk/entry.py @@ -2,34 +2,10 @@ 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") +from magictk import color_tmpl +from magictk import photoload +from magictk import fontconfig +from magictk import button class Entry: @@ -112,7 +88,8 @@ class Entry: n += 1 def __init__(self, master=None, root_anim=None, w=200, h=30, text="Input", color_list: dict = None, items=[]): - set_font() + global use_font + use_font = fontconfig.getfont() self.input_text = "" self.items = items self.w = max(120, w) @@ -127,8 +104,39 @@ class Entry: else: self.root = root_anim + self.frames = tkinter.Frame( + master, width=self.w, height=self.h, bg=self.color["background"]) 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.frames, + bg=self.color["background"], + width=self.w, + height=self.h, + borderwidth=0, + bd=0, + highlightcolor=self.color["background"], + highlightthickness=0 + ) + self.canvas.place(x=0, y=0, relwidth=1.0, relheight=1.0) + self.__input_textvar = tkinter.StringVar() + self.inputobj = tkinter.Entry( + self.frames, + bg=self.color["background"], + fg=self.color["regular_text"], + highlightthickness=0, + bd=0, + font=(use_font, 10), + textvariable=self.__input_textvar + ) + self.inputobj.place(x=10, y=6, width=self.w-20, height=self.h-12) + self.show_label = tkinter.Label(self.frames, + text=self.text, + bg=self.color["background"], + fg=self.color["secondary_text"], + anchor="w", + font=(use_font, 10) + ) + self.show_label.place(x=10, y=6, width=self.w-20, height=self.h-12) + self.packed = True self.__draw() self.__update_color() @@ -136,13 +144,13 @@ class Entry: self.bind_anim() def pack(self, *args, **kwargs): - self.canvas.pack(*args, **kwargs) + self.frames.pack(*args, **kwargs) def guid(self, *args, **kwargs): - self.canvas.guid(*args, **kwargs) + self.frames.guid(*args, **kwargs) def place(self, *args, **kwargs): - self.canvas.place(*args, **kwargs) + self.frames.place(*args, **kwargs) def __draw(self): self.__draw_corner(0, 0, 0, 0) @@ -217,9 +225,6 @@ class Entry: 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): @@ -240,30 +245,45 @@ class Entry: 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 + if (self.__is_hover == 1): + self.top.destroy() + self.__is_hover = 0 + self.canvas.focus_force() def pressrelease_v(event: tkinter.Event): if (self.__is_hover == 1): - self.__is_hover = 0 + closecallback(event) 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() - + if sys.platform.startswith("linux"): # what's fuck? + self.top = tkinter.Toplevel() + self.top.geometry( + f"{1}x{1}+{10000}+{10000}") + 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.root.update() + self.inputobj.focus_force() self.__update_color() + + def update_text(*args): + self.input_text = self.__input_textvar.get() + if (self.input_text == ""): + if (self.packed == False): + self.show_label.place( + x=10, y=6, width=self.w-20, height=self.h-12) + self.packed = True + else: + if (self.packed): + self.show_label.place_forget() + self.packed = False + self.frames.bind("", pressrelease_v) self.canvas.bind("", pressrelease_v) + self.inputobj.bind("", pressrelease_v) + self.show_label.bind("", pressrelease_v) + self.__input_textvar.trace_add("write", update_text) + # self.frames.bind_all("", closecallback) + if (sys.platform.startswith("linux")): + self.frames.bind("", closecallback)