Font feature added to Input Text fields... can't believe it wasn't implemented. Has the beginnings of the Treeview element. Should hold off using it for now though.

This commit is contained in:
MikeTheWatchGuy 2018-09-12 13:46:06 -04:00
parent 24de0ff8b5
commit 94e18b2993
1 changed files with 86 additions and 17 deletions

View File

@ -95,6 +95,13 @@ LISTBOX_SELECT_MODE_EXTENDED = 'extended'
SELECT_MODE_SINGLE = tk.SINGLE SELECT_MODE_SINGLE = tk.SINGLE
LISTBOX_SELECT_MODE_SINGLE = 'single' LISTBOX_SELECT_MODE_SINGLE = 'single'
TREEVIEW_SELECT_MODE_NONE = tk.NONE
TREEVIEW_SELECT_MODE_BROWSE = tk.BROWSE
TREEVIEW_SELECT_MODE_EXTENDED = tk.EXTENDED
DEFAULT_TREEVIEW_SECECT_MODE = TREEVIEW_SELECT_MODE_EXTENDED
# DEFAULT_METER_ORIENTATION = 'Vertical' # DEFAULT_METER_ORIENTATION = 'Vertical'
# ----====----====----==== Constants the user should NOT f-with ====----====----====----# # ----====----====----==== Constants the user should NOT f-with ====----====----====----#
ThisRow = 555666777 # magic number ThisRow = 555666777 # magic number
@ -163,6 +170,7 @@ ELEM_TYPE_COLUMN = 555
ELEM_TYPE_MENUBAR = 600 ELEM_TYPE_MENUBAR = 600
ELEM_TYPE_PROGRESS_BAR = 200 ELEM_TYPE_PROGRESS_BAR = 200
ELEM_TYPE_BLANK = 100 ELEM_TYPE_BLANK = 100
ELEM_TYPE_TREEVIEW = 700
# ------------------------- MsgBox Buttons Types ------------------------- # # ------------------------- MsgBox Buttons Types ------------------------- #
MSG_BOX_YES_NO = 1 MSG_BOX_YES_NO = 1
@ -262,7 +270,7 @@ class Element():
# ---------------------------------------------------------------------- # # ---------------------------------------------------------------------- #
class InputText(Element): class InputText(Element):
def __init__(self, default_text ='', scale=(None, None), size=(None, None), auto_size_text=None, password_char='', def __init__(self, default_text ='', scale=(None, None), size=(None, None), auto_size_text=None, password_char='',
justification=None, background_color=None, text_color=None, do_not_clear=False, key=None, focus=False, pad=None): justification=None, background_color=None, text_color=None, font=None, do_not_clear=False, key=None, focus=False, pad=None):
''' '''
Input a line of text Element Input a line of text Element
:param default_text: Default value to display :param default_text: Default value to display
@ -279,7 +287,7 @@ class InputText(Element):
self.Focus = focus self.Focus = focus
self.do_not_clear = do_not_clear self.do_not_clear = do_not_clear
self.Justification = justification self.Justification = justification
super().__init__(ELEM_TYPE_INPUT_TEXT, scale=scale, size=size, auto_size_text=auto_size_text, background_color=bg, text_color=fg, key=key, pad=pad) super().__init__(ELEM_TYPE_INPUT_TEXT, scale=scale, size=size, auto_size_text=auto_size_text, background_color=bg, text_color=fg, key=key, pad=pad, font=font)
def Update(self, value=None, disabled=None): def Update(self, value=None, disabled=None):
@ -761,9 +769,9 @@ class TKOutput(tk.Frame):
self.output.configure(fg=text_color) self.output.configure(fg=text_color)
self.vsb = tk.Scrollbar(frame, orient="vertical", command=self.output.yview) self.vsb = tk.Scrollbar(frame, orient="vertical", command=self.output.yview)
self.output.configure(yscrollcommand=self.vsb.set) self.output.configure(yscrollcommand=self.vsb.set)
self.output.pack(side="left", fill="both") self.output.pack(side="left", fill="both", expand=True)
self.vsb.pack(side="left", fill="y") self.vsb.pack(side="left", fill="y", expand=False)
frame.pack(side="left", padx=pad[0], pady=pad[1]) frame.pack(side="left", padx=pad[0], pady=pad[1], expand=True, fill='y')
self.previous_stdout = sys.stdout self.previous_stdout = sys.stdout
self.previous_stderr = sys.stderr self.previous_stderr = sys.stderr
@ -1162,10 +1170,10 @@ class TkScrollableFrame(tk.Frame):
# create a canvas object and a vertical scrollbar for scrolling it # create a canvas object and a vertical scrollbar for scrolling it
self.vscrollbar = tk.Scrollbar(self, orient=tk.VERTICAL) self.vscrollbar = tk.Scrollbar(self, orient=tk.VERTICAL)
self.vscrollbar.pack(side='right', fill="y", expand="false") self.vscrollbar.pack(side='right', fill="y", expand="true")
self.hscrollbar = tk.Scrollbar(self, orient=tk.HORIZONTAL) self.hscrollbar = tk.Scrollbar(self, orient=tk.HORIZONTAL)
self.hscrollbar.pack(side='bottom', fill="x", expand="false") self.hscrollbar.pack(side='bottom', fill="x", expand="true")
self.canvas = tk.Canvas(self, yscrollcommand=self.vscrollbar.set, xscrollcommand=self.hscrollbar.set) self.canvas = tk.Canvas(self, yscrollcommand=self.vscrollbar.set, xscrollcommand=self.hscrollbar.set)
self.canvas.pack(side="left", fill="both", expand=True) self.canvas.pack(side="left", fill="both", expand=True)
@ -1179,17 +1187,20 @@ class TkScrollableFrame(tk.Frame):
# create a frame inside the canvas which will be scrolled with it # create a frame inside the canvas which will be scrolled with it
self.TKFrame = tk.Frame(self.canvas, **kwargs) self.TKFrame = tk.Frame(self.canvas, **kwargs)
self.canvas.create_window(0, 0, window=self.TKFrame, anchor="nw") self.frame_id = self.canvas.create_window(0, 0, window=self.TKFrame, anchor="nw")
self.canvas.config(borderwidth=0, highlightthickness=0) self.canvas.config(borderwidth=0, highlightthickness=0)
self.TKFrame.config(borderwidth=0, highlightthickness=0) self.TKFrame.config(borderwidth=0, highlightthickness=0)
self.config(borderwidth=0, highlightthickness=0) self.config(borderwidth=0, highlightthickness=0)
self.canvas.bind("<Configure>", self.resize_frame)
self.bind('<Configure>', self.set_scrollregion) self.bind('<Configure>', self.set_scrollregion)
self.bind_mouse_scroll(self.canvas, self.yscroll) self.bind_mouse_scroll(self.canvas, self.yscroll)
self.bind_mouse_scroll(self.hscrollbar, self.xscroll) self.bind_mouse_scroll(self.hscrollbar, self.xscroll)
self.bind_mouse_scroll(self.vscrollbar, self.yscroll) self.bind_mouse_scroll(self.vscrollbar, self.yscroll)
def resize_frame(self, e):
self.canvas.itemconfig(self.frame_id, height=e.height, width=e.width)
def yscroll(self, event): def yscroll(self, event):
if event.num == 5 or event.delta < 0: if event.num == 5 or event.delta < 0:
@ -1482,9 +1493,8 @@ class TKCalendar(ttk.Frame):
# Canvas # # Canvas #
# ---------------------------------------------------------------------- # # ---------------------------------------------------------------------- #
class Menu(Element): class Menu(Element):
def __init__(self, menu_definition, command=None, background_color=None, scale=(None, None), size=(None, None), pad=None, key=None): def __init__(self, menu_definition, background_color=None, scale=(None, None), size=(None, None), pad=None, key=None):
self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR
self.Command = command
self.MenuDefinition = menu_definition self.MenuDefinition = menu_definition
self.TKMenu = None self.TKMenu = None
@ -1501,6 +1511,47 @@ class Menu(Element):
super().__del__() super().__del__()
# ---------------------------------------------------------------------- #
# TreeView #
# ---------------------------------------------------------------------- #
class Treeview(Element):
def __init__(self, values, column_headings=None, display_columns=None, show=None, tags=None, label=None, image=None, readonly=None, disabled=False, select_mode=None, children_hidden=False, font=None, justification='left', text_color=None, background_color=None, scale=(None, None), size=(None, None), pad=None, key=None):
self.Values = values
self.ColumnHeadings = column_headings
self.ColumnsToDisplay = display_columns
self.Show = show
self.ChildrenHidden = children_hidden
self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR
self.TextColor = text_color
self.Disabled = disabled
self.ReadOnly = readonly
self.Image = image
self.Label = label
self.Tags = tags
self.Justification = justification
self.InitialState = None
self.SelectMode = select_mode
self.TKTreeview = None
super().__init__(ELEM_TYPE_TREEVIEW, text_color=text_color, background_color=background_color, scale=scale, font=font, size=size, pad=pad, key=key)
return
def __del__(self):
super().__del__()
class TreeviewItem(object):
def __init__(self, text=None, image=None, values=None, hidden=False, tags=None ):
self.Text = text
self.Image = image
self.Vales = values
self.Hidden = hidden
self.Tags = tags
# ------------------------------------------------------------------------- # # ------------------------------------------------------------------------- #
# FlexForm CLASS # # FlexForm CLASS #
# ------------------------------------------------------------------------- # # ------------------------------------------------------------------------- #
@ -2259,7 +2310,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
col_frame = tk.Frame(tk_row_frame) col_frame = tk.Frame(tk_row_frame)
PackFormIntoFrame(element, col_frame, toplevel_form) PackFormIntoFrame(element, col_frame, toplevel_form)
col_frame.pack(side=tk.LEFT, padx=element.Pad[0], pady=element.Pad[1]) col_frame.pack(side=tk.LEFT, padx=element.Pad[0], pady=element.Pad[1], expand=True, fill='both')
if element.BackgroundColor != COLOR_SYSTEM_DEFAULT and element.BackgroundColor is not None: if element.BackgroundColor != COLOR_SYSTEM_DEFAULT and element.BackgroundColor is not None:
col_frame.configure(background=element.BackgroundColor, highlightbackground=element.BackgroundColor, highlightcolor=element.BackgroundColor) col_frame.configure(background=element.BackgroundColor, highlightbackground=element.BackgroundColor, highlightcolor=element.BackgroundColor)
# ------------------------- TEXT element ------------------------- # # ------------------------- TEXT element ------------------------- #
@ -2301,7 +2352,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
tktext_label.configure(background=element.BackgroundColor) tktext_label.configure(background=element.BackgroundColor)
if element.TextColor != COLOR_SYSTEM_DEFAULT and element.TextColor is not None: if element.TextColor != COLOR_SYSTEM_DEFAULT and element.TextColor is not None:
tktext_label.configure(fg=element.TextColor) tktext_label.configure(fg=element.TextColor)
tktext_label.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1]) tktext_label.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1], fill='both', expand=True)
element.TKText = tktext_label element.TKText = tktext_label
# ------------------------- BUTTON element ------------------------- # # ------------------------- BUTTON element ------------------------- #
elif element_type == ELEM_TYPE_BUTTON: elif element_type == ELEM_TYPE_BUTTON:
@ -2367,14 +2418,14 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
else: else:
justification = DEFAULT_TEXT_JUSTIFICATION justification = DEFAULT_TEXT_JUSTIFICATION
justify = tk.LEFT if justification == 'left' else tk.CENTER if justification == 'center' else tk.RIGHT justify = tk.LEFT if justification == 'left' else tk.CENTER if justification == 'center' else tk.RIGHT
anchor = tk.NW if justification == 'left' else tk.N if justification == 'center' else tk.NE # anchor = tk.NW if justification == 'left' else tk.N if justification == 'center' else tk.NE
element.TKEntry = tk.Entry(tk_row_frame, width=element_size[0], textvariable=element.TKStringVar, bd=border_depth, font=font, show=show, justify=justify) element.TKEntry = tk.Entry(tk_row_frame, width=element_size[0], textvariable=element.TKStringVar, bd=border_depth, font=font, show=show, justify=justify)
element.TKEntry.bind('<Return>', element.ReturnKeyHandler) element.TKEntry.bind('<Return>', element.ReturnKeyHandler)
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT: if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
element.TKEntry.configure(background=element.BackgroundColor) element.TKEntry.configure(background=element.BackgroundColor)
if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT: if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT:
element.TKEntry.configure(fg=text_color) element.TKEntry.configure(fg=text_color)
element.TKEntry.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1]) element.TKEntry.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1], expand=True, fill='x')
if element.Focus is True or (toplevel_form.UseDefaultFocus and not focus_set): if element.Focus is True or (toplevel_form.UseDefaultFocus and not focus_set):
focus_set = True focus_set = True
element.TKEntry.focus_set() element.TKEntry.focus_set()
@ -2476,7 +2527,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT: if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
element.TKText.configure(background=element.BackgroundColor) element.TKText.configure(background=element.BackgroundColor)
element.TKText.vbar.config(troughcolor=DEFAULT_SCROLLBAR_COLOR) element.TKText.vbar.config(troughcolor=DEFAULT_SCROLLBAR_COLOR)
element.TKText.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1]) element.TKText.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1], expand=True, fill='both')
if element.EnterSubmits: if element.EnterSubmits:
element.TKText.bind('<Return>', element.ReturnKeyHandler) element.TKText.bind('<Return>', element.ReturnKeyHandler)
if element.Focus is True or (toplevel_form.UseDefaultFocus and not focus_set): if element.Focus is True or (toplevel_form.UseDefaultFocus and not focus_set):
@ -2556,7 +2607,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
elif element_type == ELEM_TYPE_OUTPUT: elif element_type == ELEM_TYPE_OUTPUT:
width, height = element_size width, height = element_size
element.TKOut = TKOutput(tk_row_frame, width=width, height=height, bd=border_depth, background_color=element.BackgroundColor, text_color=text_color, font=font, pad=element.Pad) element.TKOut = TKOutput(tk_row_frame, width=width, height=height, bd=border_depth, background_color=element.BackgroundColor, text_color=text_color, font=font, pad=element.Pad)
element.TKOut.pack(side=tk.LEFT) element.TKOut.pack(side=tk.LEFT, expand=True, fill='both')
# ------------------------- IMAGE Box element ------------------------- # # ------------------------- IMAGE Box element ------------------------- #
elif element_type == ELEM_TYPE_IMAGE: elif element_type == ELEM_TYPE_IMAGE:
if element.Filename is not None: if element.Filename is not None:
@ -2641,10 +2692,28 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
tkscale.configure(fg=text_color) tkscale.configure(fg=text_color)
tkscale.pack(side=tk.LEFT, padx=element.Pad[0],pady=element.Pad[1]) tkscale.pack(side=tk.LEFT, padx=element.Pad[0],pady=element.Pad[1])
element.TKScale = tkscale element.TKScale = tkscale
# ------------------------- Treeview element ------------------------- #
elif element_type == ELEM_TYPE_TREEVIEW:
width, height = element_size
anchor = tk.W if element.Justification == 'left' else tk.E
element.TKTreeview = ttk.Treeview(tk_row_frame, columns=element.ColumnHeadings,
displaycolumns=element.ColumnsToDisplay, show=element.Show, height=height, selectmode=element.SelectMode)
treeview = element.TKTreeview
for heading in element.ColumnHeadings:
treeview.heading(heading, text=heading)
treeview.column(heading, width=width*CharWidthInPixels(), anchor=anchor)
for value in element.Values:
id = treeview.insert('', 'end', text=value, values=value)
print(id)
for i in range(5):
treeview.insert(id, 'end', text=value, values=i)
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
element.TKTreeview.configure(background=element.BackgroundColor)
element.TKTreeview.pack(side=tk.LEFT, padx=element.Pad[0], pady=element.Pad[1], expand=True, fill='both')
#............................DONE WITH ROW pack the row of widgets ..........................# #............................DONE WITH ROW pack the row of widgets ..........................#
# done with row, pack the row of widgets # done with row, pack the row of widgets
# tk_row_frame.grid(row=row_num+2, sticky=tk.NW, padx=DEFAULT_MARGINS[0]) # tk_row_frame.grid(row=row_num+2, sticky=tk.NW, padx=DEFAULT_MARGINS[0])
tk_row_frame.pack(side=tk.TOP, anchor='sw', padx=DEFAULT_MARGINS[0]) tk_row_frame.pack(side=tk.TOP, anchor='sw', padx=DEFAULT_MARGINS[0], expand=True, fill='both')
if form.BackgroundColor is not None and form.BackgroundColor != COLOR_SYSTEM_DEFAULT: if form.BackgroundColor is not None and form.BackgroundColor != COLOR_SYSTEM_DEFAULT:
tk_row_frame.configure(background=form.BackgroundColor) tk_row_frame.configure(background=form.BackgroundColor)