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:
parent
24de0ff8b5
commit
94e18b2993
103
PySimpleGUI.py
103
PySimpleGUI.py
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue