diff --git a/PySimpleGUI.py b/PySimpleGUI.py index 473df4d0..2d0af1d7 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -2128,21 +2128,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) @@ -2164,7 +2168,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): @@ -2198,7 +2203,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: @@ -2217,6 +2222,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 @@ -3968,7 +3974,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 diff --git a/PySimpleGUIQt/PySimpleGUIQt.py b/PySimpleGUIQt/PySimpleGUIQt.py index a1836557..1a8a5a64 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,13 @@ 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.QTApplication.processEvents() # refresh the window if 0: # TODO add window closed with X logic self.TKrootDestroyed = True _my_windows.Decrement() @@ -3267,7 +3269,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 +3554,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 +3564,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: @@ -3623,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 ------------------------- # @@ -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