Set scrollbar width for Listbox, Table to 12 px, removed global variable used to hold "master" window / app, Table.Update - Dummy num_rows parm to maintain compat with tkinter
This commit is contained in:
parent
c8b4bec9bf
commit
5ced9df9f9
|
@ -6,6 +6,7 @@ import textwrap
|
||||||
import pickle
|
import pickle
|
||||||
import base64
|
import base64
|
||||||
import calendar
|
import calendar
|
||||||
|
from random import randint
|
||||||
|
|
||||||
FORCE_PYQT5 = False
|
FORCE_PYQT5 = False
|
||||||
|
|
||||||
|
@ -239,24 +240,6 @@ EVENT_SYSTEM_TRAY_MESSAGE_CLICKED = '__MESSAGE_CLICKED__'
|
||||||
MENU_KEY_SEPARATOR = '::'
|
MENU_KEY_SEPARATOR = '::'
|
||||||
MENU_DISABLED_CHARACTER = '!'
|
MENU_DISABLED_CHARACTER = '!'
|
||||||
|
|
||||||
# a shameful global variable. This represents the top-level window information. Needed because opening a second window is different than opening the first.
|
|
||||||
class MyWindows():
|
|
||||||
def __init__(self):
|
|
||||||
self.NumOpenWindows = 0
|
|
||||||
self.user_defined_icon = None
|
|
||||||
self.hidden_master_root = None
|
|
||||||
self.QTApplication = None
|
|
||||||
self.active_popups = {}
|
|
||||||
def Decrement(self):
|
|
||||||
self.NumOpenWindows -= 1 * (self.NumOpenWindows != 0) # decrement if not 0
|
|
||||||
# print('---- DECREMENTING Num Open Windows = {} ---'.format(self.NumOpenWindows))
|
|
||||||
|
|
||||||
def Increment(self):
|
|
||||||
self.NumOpenWindows += 1
|
|
||||||
# print('++++ INCREMENTING Num Open Windows = {} ++++'.format(self.NumOpenWindows))
|
|
||||||
|
|
||||||
|
|
||||||
_my_windows = MyWindows() # terrible hack using globals... means need a class for collecing windows
|
|
||||||
|
|
||||||
|
|
||||||
# ====================================================================== #
|
# ====================================================================== #
|
||||||
|
@ -1330,8 +1313,6 @@ class Button(Element):
|
||||||
|
|
||||||
# ------- Button Callback ------- #
|
# ------- Button Callback ------- #
|
||||||
def ButtonCallBack(self):
|
def ButtonCallBack(self):
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
|
|
||||||
# print('Button callback')
|
# print('Button callback')
|
||||||
|
|
||||||
|
@ -1419,7 +1400,7 @@ class Button(Element):
|
||||||
self.ParentForm.QT_QMainWindow.close()
|
self.ParentForm.QT_QMainWindow.close()
|
||||||
if self.ParentForm.NonBlocking:
|
if self.ParentForm.NonBlocking:
|
||||||
# TODO DESTROY WIN
|
# TODO DESTROY WIN
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
elif self.BType == BUTTON_TYPE_READ_FORM: # LEAVE THE WINDOW OPEN!! DO NOT CLOSE
|
elif self.BType == BUTTON_TYPE_READ_FORM: # LEAVE THE WINDOW OPEN!! DO NOT CLOSE
|
||||||
# first, get the results table built
|
# first, get the results table built
|
||||||
# modify the Results table in the parent FlexForm object
|
# modify the Results table in the parent FlexForm object
|
||||||
|
@ -1435,7 +1416,7 @@ class Button(Element):
|
||||||
self.ParentForm.QT_QMainWindow.close()
|
self.ParentForm.QT_QMainWindow.close()
|
||||||
if self.ParentForm.CurrentlyRunningMainloop: # if this window is running the mainloop, kick out
|
if self.ParentForm.CurrentlyRunningMainloop: # if this window is running the mainloop, kick out
|
||||||
self.ParentForm.QTApplication.exit()
|
self.ParentForm.QTApplication.exit()
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
elif self.BType == BUTTON_TYPE_CALENDAR_CHOOSER: # this is a return type button so GET RESULTS and destroy window
|
elif self.BType == BUTTON_TYPE_CALENDAR_CHOOSER: # this is a return type button so GET RESULTS and destroy window
|
||||||
should_submit_window = False
|
should_submit_window = False
|
||||||
|
|
||||||
|
@ -2542,17 +2523,21 @@ class Table(Element):
|
||||||
print('Vertical Header value ', value)
|
print('Vertical Header value ', value)
|
||||||
|
|
||||||
|
|
||||||
def Update(self, values=None, visible=None):
|
def Update(self, values=None, num_rows=None, visible=None):
|
||||||
if values is not None:
|
if values is not None:
|
||||||
self.Values = values
|
self.Values = values
|
||||||
self.SelectedRows = []
|
self.SelectedRows = []
|
||||||
self.QT_TableWidget.clear()
|
self.QT_TableWidget.clear()
|
||||||
|
if len(values) != 0:
|
||||||
self.QT_TableWidget.setRowCount(len(self.Values))
|
self.QT_TableWidget.setRowCount(len(self.Values))
|
||||||
self.QT_TableWidget.setColumnCount(len(self.Values[0]))
|
self.QT_TableWidget.setColumnCount(len(self.Values[0]))
|
||||||
for rownum, rows in enumerate(self.Values):
|
for rownum, rows in enumerate(self.Values):
|
||||||
# self.QT_TableWidget.insertRow(rownum)
|
# self.QT_TableWidget.insertRow(rownum)
|
||||||
for colnum, columns in enumerate(rows):
|
for colnum, columns in enumerate(rows):
|
||||||
self.QT_TableWidget.setItem(rownum, colnum, QTableWidgetItem(self.Values[rownum][colnum]))
|
self.QT_TableWidget.setItem(rownum, colnum, QTableWidgetItem(self.Values[rownum][colnum]))
|
||||||
|
# if num_rows is not None:
|
||||||
|
# self.QT_TableWidget.setFixedHeight(num_rows * 35 + 25) # convert num rows into pixels...crude but effective
|
||||||
|
|
||||||
super().Update(self.QT_TableWidget, visible=visible)
|
super().Update(self.QT_TableWidget, visible=visible)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2799,11 +2784,10 @@ class SystemTray:
|
||||||
self.LastMessage = None
|
self.LastMessage = None
|
||||||
self.LastTitle = None
|
self.LastTitle = None
|
||||||
|
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
if _my_windows.QTApplication is None:
|
if Window.QTApplication is None:
|
||||||
_my_windows.QTApplication = QApplication(sys.argv)
|
Window.QTApplication = QApplication(sys.argv)
|
||||||
self.App = _my_windows.QTApplication
|
self.App = Window.QTApplication
|
||||||
self.QWidget = QWidget()
|
self.QWidget = QWidget()
|
||||||
|
|
||||||
qicon = None
|
qicon = None
|
||||||
|
@ -2982,6 +2966,13 @@ class SystemTray:
|
||||||
# ------------------------------------------------------------------------- #
|
# ------------------------------------------------------------------------- #
|
||||||
class Window:
|
class Window:
|
||||||
|
|
||||||
|
NumOpenWindows = 0
|
||||||
|
user_defined_icon = None
|
||||||
|
hidden_master_root = None
|
||||||
|
QTApplication = None
|
||||||
|
active_popups = {}
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, title, default_element_size=DEFAULT_ELEMENT_SIZE, default_button_element_size=(None, None),
|
def __init__(self, title, default_element_size=DEFAULT_ELEMENT_SIZE, default_button_element_size=(None, None),
|
||||||
auto_size_text=None, auto_size_buttons=None, location=(None, None), size=(None, None), element_padding=None, button_color=None, font=None,
|
auto_size_text=None, auto_size_buttons=None, location=(None, None), size=(None, None), element_padding=None, button_color=None, font=None,
|
||||||
progress_bar_color=(None, None), background_color=None, border_depth=None, auto_close=False,
|
progress_bar_color=(None, None), background_color=None, border_depth=None, auto_close=False,
|
||||||
|
@ -3032,7 +3023,7 @@ class Window:
|
||||||
self.Font = font if font else DEFAULT_FONT
|
self.Font = font if font else DEFAULT_FONT
|
||||||
self.RadioDict = {}
|
self.RadioDict = {}
|
||||||
self.BorderDepth = border_depth
|
self.BorderDepth = border_depth
|
||||||
self.WindowIcon = icon if icon is not None else _my_windows.user_defined_icon
|
self.WindowIcon = icon if icon is not None else Window.user_defined_icon
|
||||||
self.AutoClose = auto_close
|
self.AutoClose = auto_close
|
||||||
self.NonBlocking = False
|
self.NonBlocking = False
|
||||||
self.TKroot = None
|
self.TKroot = None
|
||||||
|
@ -3075,6 +3066,17 @@ class Window:
|
||||||
self.XFound = False
|
self.XFound = False
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def IncrementOpenCount():
|
||||||
|
Window.NumOpenWindows += 1
|
||||||
|
# print('+++++ INCREMENTING Num Open Windows = {} ---'.format(Window.NumOpenWindows))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def DecrementOpenCount():
|
||||||
|
Window.NumOpenWindows -= 1 * (Window.NumOpenWindows != 0) # decrement if not 0
|
||||||
|
# print('----- DECREMENTING Num Open Windows = {} ---'.format(Window.NumOpenWindows))
|
||||||
|
|
||||||
|
|
||||||
# ------------------------- Add ONE Row to Form ------------------------- #
|
# ------------------------- Add ONE Row to Form ------------------------- #
|
||||||
def AddRow(self, *args):
|
def AddRow(self, *args):
|
||||||
''' Parms are a variable number of Elements '''
|
''' Parms are a variable number of Elements '''
|
||||||
|
@ -3219,7 +3221,7 @@ class Window:
|
||||||
rc = self.TKroot.update()
|
rc = self.TKroot.update()
|
||||||
except:
|
except:
|
||||||
self.TKrootDestroyed = True
|
self.TKrootDestroyed = True
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
results = BuildResults(self, False, self)
|
results = BuildResults(self, False, self)
|
||||||
if results[0] != None and results[0] != timeout_key:
|
if results[0] != None and results[0] != timeout_key:
|
||||||
return results
|
return results
|
||||||
|
@ -3248,10 +3250,10 @@ class Window:
|
||||||
if self.RootNeedsDestroying:
|
if self.RootNeedsDestroying:
|
||||||
self.LastButtonClicked = None
|
self.LastButtonClicked = None
|
||||||
self.QTApplication.exit()
|
self.QTApplication.exit()
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
# if form was closed with X
|
# if form was closed with X
|
||||||
if self.LastButtonClicked is None and self.LastKeyboardEvent is None and self.ReturnValues[0] is None:
|
if self.LastButtonClicked is None and self.LastKeyboardEvent is None and self.ReturnValues[0] is None:
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
# Determine return values
|
# Determine return values
|
||||||
if self.LastKeyboardEvent is not None or self.LastButtonClicked is not None:
|
if self.LastKeyboardEvent is not None or self.LastButtonClicked is not None:
|
||||||
results = BuildResults(self, False, self)
|
results = BuildResults(self, False, self)
|
||||||
|
@ -3292,7 +3294,7 @@ class Window:
|
||||||
except:
|
except:
|
||||||
print('* ERROR FINALIZING *')
|
print('* ERROR FINALIZING *')
|
||||||
self.TKrootDestroyed = True
|
self.TKrootDestroyed = True
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
@ -3346,10 +3348,10 @@ class Window:
|
||||||
print('*** Error loading form to disk ***')
|
print('*** Error loading form to disk ***')
|
||||||
|
|
||||||
def GetScreenDimensions(self):
|
def GetScreenDimensions(self):
|
||||||
if _my_windows.QTApplication is None:
|
if Window.QTApplication is None:
|
||||||
_my_windows.QTApplication = QApplication(sys.argv)
|
Window.QTApplication = QApplication(sys.argv)
|
||||||
try:
|
try:
|
||||||
screen = _my_windows.QTApplication.primaryScreen()
|
screen = Window.QTApplication.primaryScreen()
|
||||||
except:
|
except:
|
||||||
return None, None
|
return None, None
|
||||||
size = screen.size()
|
size = screen.size()
|
||||||
|
@ -4634,8 +4636,14 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
|
||||||
elif element_type == ELEM_TYPE_INPUT_LISTBOX:
|
elif element_type == ELEM_TYPE_INPUT_LISTBOX:
|
||||||
max_line_len = max([len(str(l)) for l in element.Values]) if len(element.Values) != 0 else 0
|
max_line_len = max([len(str(l)) for l in element.Values]) if len(element.Values) != 0 else 0
|
||||||
element.QT_ListWidget = QListWidget()
|
element.QT_ListWidget = QListWidget()
|
||||||
style = ''
|
style = element.QT_ListWidget.styleSheet()
|
||||||
style = create_style_from_font(font)
|
style += """QScrollBar:vertical {
|
||||||
|
border: none;
|
||||||
|
background:lightgray;
|
||||||
|
width:12px;
|
||||||
|
margin: 0px 0px 0px 0px;
|
||||||
|
} """
|
||||||
|
style += create_style_from_font(font)
|
||||||
|
|
||||||
if element.TextColor is not None:
|
if element.TextColor is not None:
|
||||||
style += 'color: %s;' % element.TextColor
|
style += 'color: %s;' % element.TextColor
|
||||||
|
@ -5252,6 +5260,12 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
|
||||||
add_treeview_data(element.TreeData.root_node, element.QT_QTreeWidget)
|
add_treeview_data(element.TreeData.root_node, element.QT_QTreeWidget)
|
||||||
|
|
||||||
style = ''
|
style = ''
|
||||||
|
style += """QScrollBar:vertical {
|
||||||
|
border: none;
|
||||||
|
background:lightgray;
|
||||||
|
width:12px;
|
||||||
|
margin: 0px 0px 0px 0px;
|
||||||
|
} """
|
||||||
style += 'margin: {}px {}px {}px {}px;'.format(*full_element_pad)
|
style += 'margin: {}px {}px {}px {}px;'.format(*full_element_pad)
|
||||||
style += 'border: {}px solid gray; '.format(border_depth)
|
style += 'border: {}px solid gray; '.format(border_depth)
|
||||||
element.QT_QTreeWidget.setStyleSheet(style)
|
element.QT_QTreeWidget.setStyleSheet(style)
|
||||||
|
@ -5351,17 +5365,16 @@ def stop_timer(timer):
|
||||||
|
|
||||||
# ----====----====----====----====----==== STARTUP TK ====----====----====----====----====----#
|
# ----====----====----====----====----==== STARTUP TK ====----====----====----====----====----#
|
||||||
def StartupTK(window):
|
def StartupTK(window):
|
||||||
global _my_windows
|
|
||||||
global using_pyqt5
|
global using_pyqt5
|
||||||
|
|
||||||
ow = _my_windows.NumOpenWindows
|
ow = Window.NumOpenWindows
|
||||||
|
|
||||||
if _my_windows.QTApplication is None:
|
if Window.QTApplication is None:
|
||||||
_my_windows.QTApplication = QApplication(sys.argv)
|
Window.QTApplication = QApplication(sys.argv)
|
||||||
|
|
||||||
window.QTApplication = _my_windows.QTApplication
|
window.QTApplication = Window.QTApplication
|
||||||
|
|
||||||
_my_windows.Increment()
|
Window.IncrementOpenCount()
|
||||||
|
|
||||||
|
|
||||||
# window.QTWindow = QWidget()
|
# window.QTWindow = QWidget()
|
||||||
|
@ -5479,7 +5492,7 @@ def StartupTK(window):
|
||||||
window.TimerCancelled = True
|
window.TimerCancelled = True
|
||||||
# print('..... BACK from MainLoop')
|
# print('..... BACK from MainLoop')
|
||||||
if not window.FormRemainedOpen:
|
if not window.FormRemainedOpen:
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
if window.RootNeedsDestroying:
|
if window.RootNeedsDestroying:
|
||||||
# print('** Destroying window **')
|
# print('** Destroying window **')
|
||||||
window.QT_QMainWindow.close() # destroy the window
|
window.QT_QMainWindow.close() # destroy the window
|
||||||
|
@ -5576,7 +5589,6 @@ def _ProgressMeterUpdate(bar, value, text_elem, *args):
|
||||||
:param value: int
|
:param value: int
|
||||||
:return: True if not cancelled, OK....False if Error
|
:return: True if not cancelled, OK....False if Error
|
||||||
'''
|
'''
|
||||||
global _my_windows
|
|
||||||
if bar == None: return False
|
if bar == None: return False
|
||||||
if bar.BarExpired: return False
|
if bar.BarExpired: return False
|
||||||
message, w, h = ConvertArgsToSingleString(*args)
|
message, w, h = ConvertArgsToSingleString(*args)
|
||||||
|
@ -5588,7 +5600,7 @@ def _ProgressMeterUpdate(bar, value, text_elem, *args):
|
||||||
bar.BarExpired = True
|
bar.BarExpired = True
|
||||||
bar.ParentForm._Close()
|
bar.ParentForm._Close()
|
||||||
if rc: # if update was OK but bar expired, decrement num windows
|
if rc: # if update was OK but bar expired, decrement num windows
|
||||||
_my_windows.Decrement()
|
Window.DecrementOpenCount()
|
||||||
if bar.ParentForm.RootNeedsDestroying:
|
if bar.ParentForm.RootNeedsDestroying:
|
||||||
try:
|
try:
|
||||||
bar.ParentForm.QT_QMainWindow.close()
|
bar.ParentForm.QT_QMainWindow.close()
|
||||||
|
@ -5813,7 +5825,6 @@ _easy_print_data = None # global variable... I'm cheating
|
||||||
|
|
||||||
|
|
||||||
class DebugWin():
|
class DebugWin():
|
||||||
global _my_windows
|
|
||||||
def __init__(self, size=(None, None), location=(None, None), font=None, no_titlebar=False, no_button=False,
|
def __init__(self, size=(None, None), location=(None, None), font=None, no_titlebar=False, no_button=False,
|
||||||
grab_anywhere=False, keep_on_top=False):
|
grab_anywhere=False, keep_on_top=False):
|
||||||
# Show a form that's a running counter
|
# Show a form that's a running counter
|
||||||
|
@ -5830,7 +5841,7 @@ class DebugWin():
|
||||||
]
|
]
|
||||||
self.window.AddRows(self.layout)
|
self.window.AddRows(self.layout)
|
||||||
self.window.Read(timeout=0) # Show a non-blocking form, returns immediately
|
self.window.Read(timeout=0) # Show a non-blocking form, returns immediately
|
||||||
_my_windows.active_popups[self.window] = 'debug window'
|
Window.active_popups[self.window] = 'debug window'
|
||||||
return
|
return
|
||||||
|
|
||||||
def Print(self, *args, end=None, sep=None):
|
def Print(self, *args, end=None, sep=None):
|
||||||
|
@ -5840,7 +5851,7 @@ class DebugWin():
|
||||||
if self.window is None: # if window was destroyed already, just print
|
if self.window is None: # if window was destroyed already, just print
|
||||||
print(*args, sep=sepchar, end=endchar)
|
print(*args, sep=sepchar, end=endchar)
|
||||||
return
|
return
|
||||||
_my_windows.active_popups[self.window] = 'debug window'
|
Window.active_popups[self.window] = 'debug window'
|
||||||
event, values = self.window.Read(timeout=0)
|
event, values = self.window.Read(timeout=0)
|
||||||
if event == 'Quit' or event is None:
|
if event == 'Quit' or event is None:
|
||||||
self.Close()
|
self.Close()
|
||||||
|
@ -5932,14 +5943,13 @@ ScrolledTextBox = PopupScrolled
|
||||||
# Sets the icon to be used by default #
|
# Sets the icon to be used by default #
|
||||||
# ===================================================#
|
# ===================================================#
|
||||||
def SetGlobalIcon(icon):
|
def SetGlobalIcon(icon):
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(icon, 'r') as icon_file:
|
with open(icon, 'r') as icon_file:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
raise FileNotFoundError
|
raise FileNotFoundError
|
||||||
_my_windows.user_defined_icon = icon
|
Window.user_defined_icon = icon
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@ -5990,7 +6000,6 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e
|
||||||
global DEFAULT_INPUT_TEXT_COLOR
|
global DEFAULT_INPUT_TEXT_COLOR
|
||||||
global DEFAULT_TOOLTIP_TIME
|
global DEFAULT_TOOLTIP_TIME
|
||||||
global DEFAULT_ERROR_BUTTON_COLOR
|
global DEFAULT_ERROR_BUTTON_COLOR
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
if icon:
|
if icon:
|
||||||
try:
|
try:
|
||||||
|
@ -5998,7 +6007,7 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
raise FileNotFoundError
|
raise FileNotFoundError
|
||||||
_my_windows.user_defined_icon = icon
|
Window.user_defined_icon = icon
|
||||||
|
|
||||||
if button_color != None:
|
if button_color != None:
|
||||||
DEFAULT_BUTTON_COLOR = button_color
|
DEFAULT_BUTTON_COLOR = button_color
|
||||||
|
@ -6471,8 +6480,6 @@ def Popup(*args, title=None, button_color=None, background_color=None, text_colo
|
||||||
:param location:
|
:param location:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
|
|
||||||
if not args:
|
if not args:
|
||||||
args_to_print = ['']
|
args_to_print = ['']
|
||||||
|
@ -6540,7 +6547,7 @@ def Popup(*args, title=None, button_color=None, background_color=None, text_colo
|
||||||
window.Layout(layout)
|
window.Layout(layout)
|
||||||
if non_blocking:
|
if non_blocking:
|
||||||
button, values = window.Read(timeout=0)
|
button, values = window.Read(timeout=0)
|
||||||
_my_windows.active_popups[window] = title
|
Window.active_popups[window] = title
|
||||||
else:
|
else:
|
||||||
button, values = window.Read()
|
button, values = window.Read()
|
||||||
|
|
||||||
|
@ -6925,11 +6932,10 @@ def PopupGetFolder(message, title=None, default_path='', no_window=False, size=(
|
||||||
:return: Contents of text field. None if closed using X or cancelled
|
:return: Contents of text field. None if closed using X or cancelled
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
if no_window:
|
if no_window:
|
||||||
if _my_windows.QTApplication is None:
|
if Window.QTApplication is None:
|
||||||
_my_windows.QTApplication = QApplication(sys.argv)
|
Window.QTApplication = QApplication(sys.argv)
|
||||||
|
|
||||||
folder_name = QFileDialog.getExistingDirectory(dir=initial_folder)
|
folder_name = QFileDialog.getExistingDirectory(dir=initial_folder)
|
||||||
return folder_name
|
return folder_name
|
||||||
|
@ -6980,11 +6986,9 @@ def PopupGetFile(message, title=None, default_path='', default_extension='', sav
|
||||||
:return: string representing the path chosen, None if cancelled or window closed with X
|
:return: string representing the path chosen, None if cancelled or window closed with X
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global _my_windows
|
|
||||||
|
|
||||||
if no_window:
|
if no_window:
|
||||||
if _my_windows.QTApplication is None:
|
if Window.QTApplication is None:
|
||||||
_my_windows.QTApplication = QApplication(sys.argv)
|
Window.QTApplication = QApplication(sys.argv)
|
||||||
|
|
||||||
if save_as:
|
if save_as:
|
||||||
qt_types = convert_tkinter_filetypes_to_qt(file_types)
|
qt_types = convert_tkinter_filetypes_to_qt(file_types)
|
||||||
|
@ -7059,24 +7063,150 @@ def PopupGetText(message, title=None, default_text='', password_char='', size=(N
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
layout = [[Text('You are running the PySimpleGUI.py file itself')],
|
ChangeLookAndFeel('GreenTan')
|
||||||
[Text('You should be importing it rather than running it')],
|
# SetOptions(element_padding=(0,0))
|
||||||
[Text('Here is your sample input window....')],
|
# ------ Menu Definition ------ #
|
||||||
[Text('Source File', size=(150, 25), justification='right'), InputText('Source', focus=True), FileBrowse()],
|
menu_def = [['&File', ['!&Open::KeyOpen', '&Save::KeySave', '---', '&Properties::KeyProp', 'E&xit']],
|
||||||
[Text('Destination Folder', size=(150, 25), justification='right'), InputText('Dest'), FolderBrowse()],
|
['&Edit', ['&Paste', ['Special::KeySpecial', '!Normal', ], 'Undo'], ],
|
||||||
[Ok(bind_return_key=True), Cancel()]]
|
['!&Toolbar', ['Command &1', 'Command &2', 'Command &3', 'Command &4']],
|
||||||
|
['&Help', '&About...'], ]
|
||||||
|
|
||||||
window = Window('Demo window..',
|
treedata = TreeData()
|
||||||
|
|
||||||
|
treedata.Insert("", '_A_', 'Tree Item 1', [1, 2, 3], )
|
||||||
|
treedata.Insert("", '_B_', 'B', [4, 5, 6], )
|
||||||
|
treedata.Insert("_A_", '_A1_', 'Sub Item 1', ['can', 'be', 'anything'], )
|
||||||
|
treedata.Insert("", '_C_', 'C', [], )
|
||||||
|
treedata.Insert("_C_", '_C1_', 'C1', ['or'], )
|
||||||
|
treedata.Insert("_A_", '_A2_', 'Sub Item 2', [None, None])
|
||||||
|
treedata.Insert("_A1_", '_A3_', 'A30', ['getting deep'])
|
||||||
|
treedata.Insert("_C_", '_C2_', 'C2', ['nothing', 'at', 'all'])
|
||||||
|
|
||||||
|
for i in range(100):
|
||||||
|
treedata.Insert('_C_', i, i, [])
|
||||||
|
|
||||||
|
frame1 = [
|
||||||
|
[Input('Input Text', do_not_clear=True, size=(250, 35), tooltip='Input'), Stretch()],
|
||||||
|
[Multiline(size=(250, 75), do_not_clear=True, default_text='Multiline Input', tooltip='Multiline input'),
|
||||||
|
MultilineOutput(size=(250, 75), default_text='Multiline Output', tooltip='Multiline output')],
|
||||||
|
]
|
||||||
|
|
||||||
|
frame2 = [
|
||||||
|
[Listbox(['Listbox 1', 'Listbox 2', 'Listbox 3', 'Item 4', 'Item 5'], size=(200, 85), tooltip='Listbox',
|
||||||
|
key='_LISTBOX_', font='Courier 12', text_color='red', background_color='white')],
|
||||||
|
[Combo(['Combo item 1', 'Combo item 2', 'Combo item 3'], size=(200, 35), tooltip='Combo')],
|
||||||
|
[Spin([1, 2, 3], size=(40, 30), tooltip='Spinner')],
|
||||||
|
]
|
||||||
|
|
||||||
|
frame3 = [
|
||||||
|
[Checkbox('Checkbox1', True, tooltip='Checkbox'), Checkbox('Checkbox1')],
|
||||||
|
[Radio('Radio Button1', 1, tooltip='Radio'), Radio('Radio Button2', 1, default=True), Stretch()],
|
||||||
|
]
|
||||||
|
|
||||||
|
frame4 = [
|
||||||
|
[Slider(range=(0, 100), orientation='v', size=(3, 30), default_value=40, tooltip='Slider'),
|
||||||
|
Dial(range=(0, 100), tick_interval=1, resolution=1, size=(150, 150), default_value=40, tooltip='Dial'),
|
||||||
|
Stretch()],
|
||||||
|
]
|
||||||
|
matrix = [[str(x * y) for x in range(4)] for y in range(3)]
|
||||||
|
|
||||||
|
frame5 = [
|
||||||
|
[Table(values=matrix, max_col_width=25,
|
||||||
|
auto_size_columns=True, display_row_numbers=True, change_submits=False, bind_return_key=True,
|
||||||
|
justification='right', num_rows=8, alternating_row_color='lightblue', key='_table_',
|
||||||
|
text_color='black', tooltip='Table'),
|
||||||
|
Tree(data=treedata, headings=['col1', 'col2', 'col3'], change_submits=True, auto_size_columns=True,
|
||||||
|
num_rows=10, col0_width=10, key='_TREE_', show_expanded=True, size=(200, 150), tooltip='Tree'),
|
||||||
|
Stretch()],
|
||||||
|
]
|
||||||
|
|
||||||
|
graph_elem = Graph((880, 150), (0, 0), (600, 300), key='+GRAPH+', tooltip='Graph')
|
||||||
|
|
||||||
|
frame6 = [
|
||||||
|
[graph_elem, Stretch()],
|
||||||
|
]
|
||||||
|
|
||||||
|
tab1 = Tab('Graph Number 1', frame6, tooltip='Tab 1')
|
||||||
|
tab2 = Tab('Graph Number 2', [[]])
|
||||||
|
|
||||||
|
layout = [
|
||||||
|
[Menu(menu_def, key='_REALMENU_')],
|
||||||
|
[Text('You are running the PySimpleGUI.py file itself', font='ANY 15')],
|
||||||
|
[Text('You should be importing it rather than running it', font='ANY 15')],
|
||||||
|
# [Image(data_base64=logo, tooltip='Image', click_submits=True, key='_IMAGE_'),
|
||||||
|
[Frame('Input Text Group', frame1, title_color='red', tooltip='Text Group'), Stretch()],
|
||||||
|
[Frame('Multiple Choice Group', frame2, title_color='green'),
|
||||||
|
Frame('Binary Choice Group', frame3, title_color='purple'),
|
||||||
|
Frame('Variable Choice Group', frame4, title_color='blue'), Stretch()],
|
||||||
|
[Frame('Structured Data Group', frame5, title_color='red'), ],
|
||||||
|
# [Frame('Graphing Group', frame6)],
|
||||||
|
[TabGroup([[tab1, tab2]])],
|
||||||
|
[ProgressBar(max_value=600, start_value=400, size=(600, 25), key='+PROGRESS+'),
|
||||||
|
Text('', key='_PROGTEXT_'), Stretch(),
|
||||||
|
ButtonMenu('&Menu', ['Menu', ['&Pause Graph', 'Menu item::optional_key']], key='_MENU_',
|
||||||
|
tooltip='Button Menu'),
|
||||||
|
Button('Button'), Button('Exit', tooltip='Exit button')],
|
||||||
|
]
|
||||||
|
|
||||||
|
window = Window('Window Title',
|
||||||
|
font=('Helvetica', 13),
|
||||||
|
default_button_element_size=(100, 30),
|
||||||
auto_size_buttons=False,
|
auto_size_buttons=False,
|
||||||
default_element_size=(280,22),
|
default_element_size=(200, 22),
|
||||||
auto_size_text=False,
|
border_depth=1,
|
||||||
default_button_element_size=(80,22)
|
).Layout(layout).Finalize()
|
||||||
).Layout(layout)
|
graph_elem.DrawCircle((200, 200), 50, 'blue')
|
||||||
event, values = window.Read()
|
i = 0
|
||||||
|
graph_paused = False
|
||||||
|
|
||||||
|
# window.Element('_LISTBOX_').SetValue(['Listbox 1','Listbox 3'])
|
||||||
|
while True: # Event Loop
|
||||||
|
# TimerStart()
|
||||||
|
event, values = window.Read(timeout=10)
|
||||||
|
print(event) if event != TIMEOUT_KEY else None
|
||||||
|
if event is None or event == 'Exit':
|
||||||
|
break
|
||||||
|
if values['_MENU_'] == 'Pause Graph':
|
||||||
|
graph_paused = not graph_paused
|
||||||
|
if event != TIMEOUT_KEY:
|
||||||
print(event, values)
|
print(event, values)
|
||||||
|
if not graph_paused:
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
if i < 600:
|
||||||
|
graph_elem.DrawLine((i, 0), (i, randint(0, 300)), width=1,
|
||||||
|
color='#{:06x}'.format(randint(0, 0xffffff)))
|
||||||
|
else:
|
||||||
|
graph_elem.Move(-1, 0)
|
||||||
|
graph_elem.DrawLine((i, 0), (i, randint(0, 300)), width=1,
|
||||||
|
color='#{:06x}'.format(randint(0, 0xffffff)))
|
||||||
|
|
||||||
|
window.FindElement('+PROGRESS+').UpdateBar(i % 600)
|
||||||
|
window.FindElement('_PROGTEXT_').Update((i % 600) // 6)
|
||||||
|
|
||||||
|
# TimerStop()
|
||||||
window.Close()
|
window.Close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# layout = [[Text('You are running the PySimpleGUI.py file itself')],
|
||||||
|
# [Text('You should be importing it rather than running it')],
|
||||||
|
# [Text('Here is your sample input window....')],
|
||||||
|
# [Text('Source File', size=(150, 25), justification='right'), InputText('Source', focus=True), FileBrowse()],
|
||||||
|
# [Text('Destination Folder', size=(150, 25), justification='right'), InputText('Dest'), FolderBrowse()],
|
||||||
|
# [Ok(bind_return_key=True), Cancel()]]
|
||||||
|
#
|
||||||
|
# window = Window('Demo window..',
|
||||||
|
# auto_size_buttons=False,
|
||||||
|
# default_element_size=(280,22),
|
||||||
|
# auto_size_text=False,
|
||||||
|
# default_button_element_size=(80,22)
|
||||||
|
# ).Layout(layout)
|
||||||
|
# event, values = window.Read()
|
||||||
|
# print(event, values)
|
||||||
|
# window.Close()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
exit(69)
|
exit(69)
|
||||||
|
|
Loading…
Reference in New Issue