From f92a592c0c995b2245c190233055edbf60df954f Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Thu, 8 Nov 2018 18:05:17 -0500 Subject: [PATCH 1/3] Non-blocking reads!! Fix for listbox returning too few values --- PySimpleGUIQt/PySimpleGUIQt.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/PySimpleGUIQt/PySimpleGUIQt.py b/PySimpleGUIQt/PySimpleGUIQt.py index a1836557..5219295f 100644 --- a/PySimpleGUIQt/PySimpleGUIQt.py +++ b/PySimpleGUIQt/PySimpleGUIQt.py @@ -2570,7 +2570,7 @@ class Window: def Read(self, timeout=None, timeout_key=TIMEOUT_KEY): if timeout == 0: # timeout of zero runs the old readnonblocking - event, values = self.ReadNonBlocking() + event, values = self._ReadNonBlocking() if event is None: event = timeout_key if values is None: @@ -2636,11 +2636,14 @@ class Window: else: return self.ReturnValues - def ReadNonBlocking(self): + def _ReadNonBlocking(self): if self.TKrootDestroyed: return None, None if not self.Shown: self.Show(non_blocking=True) + else: + # self.QTWindow.show() ####### The thing that causes the window to be visible ###### + print(self.QTApplication.processEvents()) if 0: # TODO add window closed with X logic self.TKrootDestroyed = True _my_windows.Decrement() @@ -3267,7 +3270,7 @@ def BuildResultsForSubform(form, initialize_only, top_level_form): value = 0 elif element.Type == ELEM_TYPE_INPUT_LISTBOX: try: - value= [element.QT_ListWidget.currentItem().text(),] + value= [item.text() for item in element.QT_ListWidget.selectedItems()] except: value = [] elif element.Type == ELEM_TYPE_INPUT_SPIN: @@ -3552,7 +3555,9 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): element_pad = full_element_pad # ------------------------- COLUMN element ------------------------- # if element_type == ELEM_TYPE_COLUMN: - column_widget = QWidget() + # column_widget = QWidget() + column_widget = QGroupBox() + # column_widget.setFrameShape(QtWidgets.QFrame.NoFrame) style = '' if font is not None: @@ -3560,14 +3565,21 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): style += 'font-size: %spt;'%font[1] if element.BackgroundColor is not None: style += 'background-color: %s;' % element.BackgroundColor + style += 'border: 0px solid gray; ' column_widget.setStyleSheet(style) + # print(style) column_layout = QFormLayout() column_vbox = QVBoxLayout() PackFormIntoFrame(element, column_layout, toplevel_win) + + column_vbox.addLayout(column_layout) column_widget.setLayout(column_vbox) + + column_widget.setStyleSheet(style) + qt_row_layout.addWidget(column_widget) # ------------------------- TEXT element ------------------------- # elif element_type == ELEM_TYPE_TEXT: @@ -4118,11 +4130,14 @@ def StartupTK(window): if window.FocusElement is not None: window.FocusElement.setFocus() - window.QTWindow.show() ####### The thing that causes the window to be visible ###### + if not window.NonBlocking: + window.QTWindow.show() ####### The thing that causes the window to be visible ###### + window.QTApplication.exec_() + else: + window.QTWindow.show() ####### The thing that causes the window to be visible ###### + window.QTApplication.processEvents() - window.QTApplication.exec_() - window.CurrentlyRunningMainloop = False window.TimerCancelled = True From 5ee602b980bc587d5d4bc917a1e597b7a2310051 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Thu, 8 Nov 2018 18:18:28 -0500 Subject: [PATCH 2/3] Button Tooltips --- PySimpleGUIQt/PySimpleGUIQt.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PySimpleGUIQt/PySimpleGUIQt.py b/PySimpleGUIQt/PySimpleGUIQt.py index 5219295f..1a8a5a64 100644 --- a/PySimpleGUIQt/PySimpleGUIQt.py +++ b/PySimpleGUIQt/PySimpleGUIQt.py @@ -2642,8 +2642,7 @@ class Window: if not self.Shown: self.Show(non_blocking=True) else: - # self.QTWindow.show() ####### The thing that causes the window to be visible ###### - print(self.QTApplication.processEvents()) + self.QTApplication.processEvents() # refresh the window if 0: # TODO add window closed with X logic self.TKrootDestroyed = True _my_windows.Decrement() @@ -3635,7 +3634,8 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win): qt_row_layout.addWidget(element.QT_QPushButton) element.QT_QPushButton.setContentsMargins(*full_element_pad) - + if element.Tooltip: + element.QT_QPushButton.setToolTip(element.Tooltip) element.QT_QPushButton.clicked.connect(element.ButtonCallBack) # element.QT_QPushButton.clicked.connect(window.QTApplication.exit) # ------------------------- INPUT (Single Line) element ------------------------- # From 32254b3b17c674932bf8c26dc54cca45e4b3f878 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Thu, 8 Nov 2018 18:36:08 -0500 Subject: [PATCH 3/3] New Column parameter - vertical_scroll_only - if set does not add horizontal scroll bars --- PySimpleGUI.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/PySimpleGUI.py b/PySimpleGUI.py index 46567b50..ed400598 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -2120,21 +2120,25 @@ class Slider(Element): # TkScrollableFrame (Used by Column) # # ---------------------------------------------------------------------- # class TkScrollableFrame(tk.Frame): - def __init__(self, master, **kwargs): + def __init__(self, master, vertical_only, **kwargs): tk.Frame.__init__(self, master, **kwargs) # create a canvas object and a vertical scrollbar for scrolling it self.vscrollbar = tk.Scrollbar(self, orient=tk.VERTICAL) self.vscrollbar.pack(side='right', fill="y", expand="false") - self.hscrollbar = tk.Scrollbar(self, orient=tk.HORIZONTAL) - self.hscrollbar.pack(side='bottom', fill="x", expand="false") + if not vertical_only: + self.hscrollbar = tk.Scrollbar(self, orient=tk.HORIZONTAL) + self.hscrollbar.pack(side='bottom', fill="x", expand="false") + self.canvas = tk.Canvas(self, yscrollcommand=self.vscrollbar.set, xscrollcommand=self.hscrollbar.set) + else: + self.canvas = tk.Canvas(self, yscrollcommand=self.vscrollbar.set) - self.canvas = tk.Canvas(self, yscrollcommand=self.vscrollbar.set, xscrollcommand=self.hscrollbar.set) self.canvas.pack(side="left", fill="both", expand=True) self.vscrollbar.config(command=self.canvas.yview) - self.hscrollbar.config(command=self.canvas.xview) + if not vertical_only: + self.hscrollbar.config(command=self.canvas.xview) # reset the view self.canvas.xview_moveto(0) @@ -2156,7 +2160,8 @@ class TkScrollableFrame(tk.Frame): self.bind('', self.set_scrollregion) self.bind_mouse_scroll(self.canvas, self.yscroll) - self.bind_mouse_scroll(self.hscrollbar, self.xscroll) + if not vertical_only: + self.bind_mouse_scroll(self.hscrollbar, self.xscroll) self.bind_mouse_scroll(self.vscrollbar, self.yscroll) def resize_frame(self, e): @@ -2190,7 +2195,7 @@ class TkScrollableFrame(tk.Frame): # Column # # ---------------------------------------------------------------------- # class Column(Element): - def __init__(self, layout, background_color=None, size=(None, None), pad=None, scrollable=False, key=None): + def __init__(self, layout, background_color=None, size=(None, None), pad=None, scrollable=False, vertical_scroll_only=False, key=None): ''' Column Element :param layout: @@ -2209,6 +2214,7 @@ class Column(Element): self.Rows = [] self.TKFrame = None self.Scrollable = scrollable + self.VerticalScrollOnly = vertical_scroll_only # self.ImageFilename = image_filename # self.ImageData = image_data # self.ImageSize = image_size @@ -3960,7 +3966,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): # ------------------------- COLUMN element ------------------------- # if element_type == ELEM_TYPE_COLUMN: if element.Scrollable: - col_frame = TkScrollableFrame(tk_row_frame) # do not use yet! not working + col_frame = TkScrollableFrame(tk_row_frame, element.VerticalScrollOnly) # do not use yet! not working PackFormIntoFrame(element, col_frame.TKFrame, toplevel_form) col_frame.TKFrame.update() if element.Size == (None, None): # if no size specified, use column width x column height/2