From a7678cb58794311b2f38933a1d664dfbd22ebf1c Mon Sep 17 00:00:00 2001 From: thirschbuechler Date: Thu, 24 Apr 2025 13:51:28 +0200 Subject: [PATCH 1/7] Qt -- fix two undefined vars --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 3ec86102..8548f4e9 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -5342,7 +5342,7 @@ def _ReadNonBlocking(self): self.QTApplication.processEvents() # refresh the window if 0: # TODO add window closed with X logic self.TKrootDestroyed = True - _my_windows.Decrement() + #_my_windows.Decrement() # undefined # print("read failed") # return None, None return BuildResults(self, False, self) @@ -13422,6 +13422,7 @@ def PopupOK( grab_anywhere=False, keep_on_top=False, location=(None, None), + image=None ): """ Display Popup with OK button only From b2952a3d0b4822bc80c00ce8f18aba4572c48724 Mon Sep 17 00:00:00 2001 From: thirschbuechler Date: Thu, 24 Apr 2025 14:33:33 +0200 Subject: [PATCH 2/7] Qt -- Tree: fix Update and add_treeview_data, store treedata key and values for each element, deduplicate add_treeview_data def --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 140 ++++++++++---------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 8548f4e9..0512746c 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -82,9 +82,10 @@ QSystemTrayIcon, QColorDialog, ) +# ToDo import all here or just use QtGui.bla for all, etc. from PySide6.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon, QAction - from PySide6.QtCore import Qt, QEvent, QSize + import PySide6.QtGui as QtGui import PySide6.QtCore as QtCore import PySide6.QtWidgets as QtWidgets @@ -4534,55 +4535,78 @@ def _QtCallbackCellActivated(self, value=None): # if self.ParentForm.CurrentlyRunningMainloop: # self.ParentForm.TKroot.quit() - def Update(self, values=None, key=None, value=None, text=None, visible=None): + def add_treeview_data(self, node=None, widget=None): + """ make tree from treedata + + Note: cannot happen in __init__ because the widget is not created yet, + only in packformintoframe and self.update() + """ + # print(f'Inserting {node.key} under parent {node.parent}') + + if node is None and widget is None: + # create root + node = self.TreeData.root_node + widget = self.QT_QTreeWidget + child = widget + else: + # create child + child = QTreeWidgetItem(widget) + child.setText(0, str(node.text)) + + if node.key: + key = node.key + else: + # not recommended + key = None + + # optional + if node.values: + values = node.values + else: + values = None + + UserData = dict(key=key, values=values) + + if hasattr(child, "setData"): + child.setData(0, Qt.UserRole, UserData) + #child.setData(1, Qt.UserRole, otherData) + + # this is how readouts in your event loop event work, + # given you have a sg.Tree('TREE') in your layout, + # which is populated by treedata with keys and values via treedata.insert, + # and something like `e_values = window.read(), if event == 'TREE'` + # tree_name = node.data(0, Qt.DisplayRole) + # UserData = (node.data(0, Qt.UserRole)) + # UserData["key"], UserData["values"] + + if type(node.icon) is bytes: + ba = QtCore.QByteArray.fromBase64(node.icon) + pixmap = QtGui.QPixmap() + pixmap.loadFromData(ba) + qicon = QIcon(pixmap) + child.setIcon(0, qicon) + elif node.icon is not None: + qicon = QIcon(node.icon) + child.setIcon(0, qicon) + for node in node.children: + self.add_treeview_data(node, child) + return # None + + def Update(self, values=None, visible=None, **kwargs): + """ Update the tree with new treedata + + for legacy compatibility, allow unused, unspecified kwargs + """ if values is not None: self.TreeData = values self.SelectedRows = [] - # self.QT_QTreeWidget = QTreeWidget() - TreeWidgetItems = QTreeWidgetItemIterator(self.QT_QTreeWidget) - - for item in TreeWidgetItems: - item2 = item.value() - self.QT_QTreeWidget.removeItemWidget(item2, 0) - - # def add_treeview_data(node, widget): - # # print(f'Inserting {node.key} under parent {node.parent}') - # child = QTreeWidgetItem(widget) - # if node.key != '': - # child.setText(0, str(node.text)) - # # child.setData(0,0,node.values) - # if node.icon is not None: - # qicon = QIcon(node.icon) - # child.setIcon(0, qicon) - # for node in node.children: - # add_treeview_data(node, child) - - def add_treeview_data(node, widget): - # print(f'Inserting {node.key} under parent {node.parent}') - if node != self.TreeData.root_node: - child = QTreeWidgetItem(widget) - child.setText(0, str(node.text)) - else: - child = widget - # if node.key != '': - # child.setData(0,0,node.values) - if type(node.icon) is bytes: - ba = QtCore.QByteArray.fromBase64(node.icon) - pixmap = QtGui.QPixmap() - pixmap.loadFromData(ba) - qicon = QIcon(pixmap) - child.setIcon(0, qicon) - elif node.icon is not None: - qicon = QIcon(node.icon) - child.setIcon(0, qicon) - for node in node.children: - add_treeview_data(node, child) - return - add_treeview_data(self.TreeData.root_node, self.QT_QTreeWidget) + # clear + self.QT_QTreeWidget.clear() + + # redo entire tree + self.add_treeview_data() - if key is not None: - pass super().Update(self.QT_QTreeWidget, visible=visible) return self @@ -8980,31 +9004,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): width = element.DefaultColumnWidth # treeview.column(heading, width=width * CharWidthInPixels(), anchor=anchor) - def add_treeview_data(node, widget): - # print(f'Inserting {node.key} under parent {node.parent}') - child = widget - if node != element.TreeData.root_node: - child = QTreeWidgetItem(widget) - child.setText(0, str(node.text)) - # if node.key != '': - # child.setData(0,0,node.values) - if type(node.icon) is bytes: - ba = QtCore.QByteArray.fromBase64(node.icon) - pixmap = QtGui.QPixmap() - pixmap.loadFromData(ba) - qicon = QIcon(pixmap) - child.setIcon(0, qicon) - elif node.icon is not None: - qicon = QIcon(node.icon) - child.setIcon(0, qicon) - - for node in node.children: - add_treeview_data(node, child) - - # for node in element.TreeData.root_node.children: - # add_treeview_data(node, element.QT_QTreeWidget) - - add_treeview_data(element.TreeData.root_node, element.QT_QTreeWidget) + element.add_treeview_data() # === style === style = QtStyle('QTreeWidget') From 99232a8c71f6a0df670c8c79ad0cd990ceb8540b Mon Sep 17 00:00:00 2001 From: thirschbuechler Date: Thu, 24 Apr 2025 14:34:11 +0200 Subject: [PATCH 3/7] Qt --Treedata: add delete method --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 0512746c..578a8777 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -4641,6 +4641,25 @@ def Insert(self, parent, key, text, values, icon=None): parent_node = self.tree_dict[parent] parent_node._Add(node) + def delete(self, key): + """ delete individual node and all children + + origin: https://github.com/PySimpleGUI/PySimpleGUI/issues/2514 by https://github.com/deajan + """ + if key == '': + return False + node = self.tree_dict[key] + key_list = [key, ] + parent_node = self.tree_dict[node.parent] + parent_node.children.remove(node) + while key_list != []: + temp = [] + for item in key_list: + temp += self.tree_dict[item].children + del self.tree_dict[item] + key_list = temp + return True + def __repr__(self): return self._NodeStr(self.root_node, 1) From d7161ddb5fc36de4dd815c7eff19d0125dc5f7fb Mon Sep 17 00:00:00 2001 From: thirschbuechler Date: Fri, 25 Apr 2025 15:18:32 +0200 Subject: [PATCH 4/7] Qt -- fix main() -- Listbox error of setItemSelected depreciation for QT6 --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 578a8777..98d4eb15 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -1147,7 +1147,7 @@ def SetValue(self, values): for index, value in enumerate(self.Values): item = self.QT_ListWidget.item(index) if value in values: - self.QT_ListWidget.setItemSelected(item, True) + item.setSelected(True) def GetListValues(self): return self.Values @@ -8215,7 +8215,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): for index, value in enumerate(element.Values): item = element.QT_ListWidget.item(index) if element.DefaultValues is not None and value in element.DefaultValues: - element.QT_ListWidget.setItemSelected(item, True) + item.setSelected(True) if element.Tooltip: element.QT_ListWidget.setToolTip(element.Tooltip) @@ -14173,7 +14173,7 @@ def main(): layout = [ [Menu(menu_def, key='_REALMENU_', background_color='white')], - [Text('You are running the PySimpleGUI.py file itself', font=('ANY', 15, 'Bold'), text_color='yellow')], + [Text('You are running the FreeSimpleGuiQT.py file itself as a demo', font=('ANY', 15, 'Bold'), text_color='yellow')], [Text('You should be importing it rather than running it', font='ANY 15')], [Text('VERSION {}'.format(ver), size=(85, 1), text_color='yellow', font='ANY 18')], # [Image(data_base64=logo, tooltip='Image', click_submits=True, key='_IMAGE_'), From 421d1819032e6981a9c454c67a871b088c2e50ee Mon Sep 17 00:00:00 2001 From: thirschbuechler Date: Fri, 25 Apr 2025 17:18:00 +0200 Subject: [PATCH 5/7] Qt -- declutter code by shortening imports --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 185 +++++++++++--------- 1 file changed, 104 insertions(+), 81 deletions(-) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 98d4eb15..8cd5ae27 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -30,7 +30,7 @@ # Copyright 2024 FreeSimpleGui authors # Copyright 2020 PySimpleGUI.org - +# QWidgets from PySide6.QtWidgets import ( QApplication, QLabel, @@ -77,18 +77,41 @@ QGraphicsView, QGraphicsScene, QGraphicsItemGroup, + QGraphicsEllipseItem, QMenu, QMenuBar, QSystemTrayIcon, QColorDialog, + QAbstractScrollArea, + QScrollArea, +) + +# QtGui +from PySide6.QtGui import ( + QPainter, + QPixmap, + QPen, + QColor, + QBrush, + QPainterPath, + QFont, + QImage, + QIcon, + QAction, + QTextCursor ) -# ToDo import all here or just use QtGui.bla for all, etc. -from PySide6.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon, QAction -from PySide6.QtCore import Qt, QEvent, QSize -import PySide6.QtGui as QtGui -import PySide6.QtCore as QtCore -import PySide6.QtWidgets as QtWidgets +# QtCore +from PySide6.QtCore import ( + Qt, + QEvent, + QSize, + QByteArray, + QRect, + QTimer +) + + using_pyqt5 = False @@ -755,7 +778,7 @@ def Update(self, value=None, disabled=None, select=None, background_color=None, # to dupliate this # self.ValueWasChanged = True if select: - self.QT_QLineEdit.setSelection(0, QtGui.QTextCursor.End) + self.QT_QLineEdit.setSelection(0, QTextCursor.End) super().Update(self.QT_QLineEdit, background_color=background_color, text_color=text_color, font=font, visible=visible) def Get(self): @@ -1729,7 +1752,7 @@ def Update( self.QT_TextEdit.setTextBackgroundColor(background_color_for_value) self.QT_TextEdit.insertPlainText(str(value)) if self.Autoscroll or autoscroll and autoscroll is not False: - self.QT_TextEdit.moveCursor(QtGui.QTextCursor.End) + self.QT_TextEdit.moveCursor(QTextCursor.End) if text_color_for_value is not None: self.QT_TextEdit.setTextColor(self.TextColor) if background_color_for_value is not None: @@ -1908,13 +1931,13 @@ def Update( self.QT_TextBrowser.setText(str(value)) elif value is not None and append: self.QT_TextBrowser.insertPlainText(str(value)) - # self.QT_TextBrowser.moveCursor(QtGui.QTextCursor.End) + # self.QT_TextBrowser.moveCursor(QTextCursor.End) if disabled == True: self.QT_TextBrowser.setDisabled(True) elif disabled == False: self.QT_TextBrowser.setDisabled(False) if self.Autoscroll or autoscroll and autoscroll is not False: - self.QT_TextBrowser.moveCursor(QtGui.QTextCursor.End) + self.QT_TextBrowser.moveCursor(QTextCursor.End) super().Update(self.QT_TextBrowser, background_color=background_color, text_color=text_color, font=font, visible=visible) def Get(self): @@ -2162,7 +2185,7 @@ def write(self, m): :param m: :return: """ - self.QT_TextBrowser.moveCursor(QtGui.QTextCursor.End) + self.QT_TextBrowser.moveCursor(QTextCursor.End) self.QT_TextBrowser.insertPlainText(str(m)) # if self.my_stdout: @@ -2835,22 +2858,22 @@ def Update(self, filename=None, data=None, data_base64=None, size=(None, None), if filename is not None: qlabel = self.QT_QLabel qlabel.setText('') - w = QtGui.QPixmap(filename).width() - h = QtGui.QPixmap(filename).height() - qlabel.setGeometry(QtCore.QRect(0, 0, w, h)) - qlabel.setPixmap(QtGui.QPixmap(filename)) + w = QPixmap(filename).width() + h = QPixmap(filename).height() + qlabel.setGeometry(QRect(0, 0, w, h)) + qlabel.setPixmap(QPixmap(filename)) elif data is not None: qlabel = self.QT_QLabel qlabel.setText('') - ba = QtCore.QByteArray.fromRawData(data) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromRawData(data) + pixmap = QPixmap() pixmap.loadFromData(ba) qlabel.setPixmap(pixmap) elif data_base64 is not None: qlabel = self.QT_QLabel qlabel.setText('') - ba = QtCore.QByteArray.fromBase64(data_base64) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(data_base64) + pixmap = QPixmap() pixmap.loadFromData(ba) qlabel.setPixmap(pixmap) super().Update(self.QT_QLabel, visible=visible) @@ -3041,7 +3064,7 @@ def DrawCircle(self, center_location, radius, fill_color=None, line_color='black return circle_id # type: QGraphicsEllipseItem def RelocateFigure(self, id, x, y): - id = id # type: QtWidgets.QGraphicsEllipseItem + id = id # type: QGraphicsEllipseItem converted_point = self._convert_xy_to_canvas_xy(x, y) id.setX(converted_point[0]) id.setY(converted_point[1]) @@ -4580,8 +4603,8 @@ def add_treeview_data(self, node=None, widget=None): # UserData["key"], UserData["values"] if type(node.icon) is bytes: - ba = QtCore.QByteArray.fromBase64(node.icon) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(node.icon) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) child.setIcon(0, qicon) @@ -4751,13 +4774,13 @@ def __init__(self, menu=None, filename=None, data=None, data_base64=None, toolti if filename is not None: qicon = QIcon(filename) elif data is not None: - ba = QtCore.QByteArray.fromRawData(data) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromRawData(data) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) elif data_base64 is not None: - ba = QtCore.QByteArray.fromBase64(data_base64) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(data_base64) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) if qicon is None: @@ -4845,13 +4868,13 @@ def ShowMessage(self, title, message, filename=None, data=None, data_base64=None if filename is not None: qicon = QIcon(filename) elif data is not None: - ba = QtCore.QByteArray.fromRawData(data) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromRawData(data) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) elif data_base64 is not None: - ba = QtCore.QByteArray.fromBase64(data_base64) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(data_base64) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) @@ -4907,13 +4930,13 @@ def Update( if filename is not None: qicon = QIcon(filename) elif data is not None: - ba = QtCore.QByteArray.fromRawData(data) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromRawData(data) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) elif data_base64 is not None: - ba = QtCore.QByteArray.fromBase64(data_base64) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(data_base64) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) if qicon is not None: @@ -7925,7 +7948,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): # column_widget = QWidget() column_widget = QGroupBox() element.Widget = element.QT_QGroupBox = column_widget - # column_widget.setFrameShape(QtWidgets.QFrame.NoFrame) + # column_widget.setFrameShape(QFrame.NoFrame) # === style === style = QtStyle('QGroupBox') @@ -7943,7 +7966,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): scroll = None if element.Scrollable and (element_size[0] is not None or element_size[1] is not None): - scroll = QtWidgets.QScrollArea() + scroll = QScrollArea() scroll.setWidget(column_widget) if element_size[0] is not None: scroll.setFixedWidth(element_size[0]) @@ -8033,11 +8056,11 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): element.QT_QPushButton.setFixedHeight(element_size[1]) if element.ImageFilename is not None: - element.QT_QPushButton.setIcon(QtGui.QPixmap(element.ImageFilename)) - element.QT_QPushButton.setIconSize(QtGui.QPixmap(element.ImageFilename).rect().size()) + element.QT_QPushButton.setIcon(QPixmap(element.ImageFilename)) + element.QT_QPushButton.setIconSize(QPixmap(element.ImageFilename).rect().size()) if element.ImageData: - ba = QtCore.QByteArray.fromBase64(element.ImageData) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(element.ImageData) + pixmap = QPixmap() pixmap.loadFromData(ba) element.QT_QPushButton.setIcon(pixmap) element.QT_QPushButton.setIconSize(pixmap.rect().size()) @@ -8266,7 +8289,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): toplevel_win.FocusElement = element.QT_TextEdit element.QT_TextEdit.setText(str(default_text)) - element.QT_TextEdit.moveCursor(QtGui.QTextCursor.End) + element.QT_TextEdit.moveCursor(QTextCursor.End) if element.Tooltip: element.QT_TextEdit.setToolTip(element.Tooltip) # qt_row_layout.setContentsMargins(*full_element_pad) @@ -8300,7 +8323,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): element.QT_TextBrowser.setFixedHeight(element_size[1]) element.QT_TextBrowser.insertPlainText(default_text) - element.QT_TextBrowser.moveCursor(QtGui.QTextCursor.End) + element.QT_TextBrowser.moveCursor(QTextCursor.End) if element.Tooltip: element.QT_TextBrowser.setToolTip(element.Tooltip) # qt_row_layout.setContentsMargins(*full_element_pad) @@ -8353,7 +8376,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): element.QT_QProgressBar.setMaximum(element.MaxValue) element.QT_QProgressBar.setValue(element.StartValue) if element.Orientation.lower().startswith('v'): - element.QT_QProgressBar.setOrientation(QtCore.Qt.Vertical) + element.QT_QProgressBar.setOrientation(Qt.Vertical) # === style === style = QtStyle('QProgressBar') @@ -8492,7 +8515,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): if element_size[1] is not None: element.QT_TextBrowser.setFixedHeight(element_size[1]) - element.QT_TextBrowser.moveCursor(QtGui.QTextCursor.End) + element.QT_TextBrowser.moveCursor(QTextCursor.End) element._reroute_stdout() if element.Tooltip: element.QT_TextBrowser.setToolTip(element.Tooltip) @@ -8505,20 +8528,20 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): element.Widget = element.QT_QLabel = qlabel = QLabel() if element.Filename is not None: qlabel.setText('') - w = QtGui.QPixmap(element.Filename).width() - h = QtGui.QPixmap(element.Filename).height() - qlabel.setGeometry(QtCore.QRect(0, 0, w, h)) - qlabel.setPixmap(QtGui.QPixmap(element.Filename)) + w = QPixmap(element.Filename).width() + h = QPixmap(element.Filename).height() + qlabel.setGeometry(QRect(0, 0, w, h)) + qlabel.setPixmap(QPixmap(element.Filename)) elif element.Data is not None: qlabel.setText('') - ba = QtCore.QByteArray.fromRawData(element.Data) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromRawData(element.Data) + pixmap = QPixmap() pixmap.loadFromData(ba) qlabel.setPixmap(pixmap) elif element.DataBase64: qlabel.setText('') - ba = QtCore.QByteArray.fromBase64(element.DataBase64) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(element.DataBase64) + pixmap = QPixmap() pixmap.loadFromData(ba) qlabel.setPixmap(pixmap) @@ -8634,8 +8657,8 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): element.QT_QPushButton.setFixedHeight(element_size[1]) if element.ImageData: - ba = QtCore.QByteArray.fromBase64(element.ImageData) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(element.ImageData) + pixmap = QPixmap() pixmap.loadFromData(ba) element.QT_QPushButton.setIcon(pixmap) element.QT_QPushButton.setIconSize(pixmap.rect().size()) @@ -8765,7 +8788,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): elif element_type == ELEM_TYPE_TAB: element.Widget = tab_widget = QWidget() element.QT_QWidget = tab_widget - # tab_widget.setFrameShape(QtWidgets.QFrame.NoFrame) + # tab_widget.setFrameShape(QFrame.NoFrame) # === style === style = QtStyle('QTabWidget') @@ -8823,18 +8846,18 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): if element.TabLocation is not None: position_dict = { - 'left': QtWidgets.QTabWidget.TabPosition.West, - 'right': QtWidgets.QTabWidget.TabPosition.East, - 'top': QtWidgets.QTabWidget.TabPosition.North, - 'bottom': QtWidgets.QTabWidget.TabPosition.South, - 'lefttop': QtWidgets.QTabWidget.TabPosition.North, - 'leftbottom': QtWidgets.QTabWidget.TabPosition.South, - 'righttop': QtWidgets.QTabWidget.TabPosition.North, - 'rightbottom': QtWidgets.QTabWidget.TabPosition.South, - 'bottomleft': QtWidgets.QTabWidget.TabPosition.South, - 'bottomright': QtWidgets.QTabWidget.TabPosition.South, - 'topleft': QtWidgets.QTabWidget.TabPosition.North, - 'topright': QtWidgets.QTabWidget.TabPosition.North, + 'left': QTabWidget.TabPosition.West, + 'right': QTabWidget.TabPosition.East, + 'top': QTabWidget.TabPosition.North, + 'bottom': QTabWidget.TabPosition.South, + 'lefttop': QTabWidget.TabPosition.North, + 'leftbottom': QTabWidget.TabPosition.South, + 'righttop': QTabWidget.TabPosition.North, + 'rightbottom': QTabWidget.TabPosition.South, + 'bottomleft': QTabWidget.TabPosition.South, + 'bottomright': QTabWidget.TabPosition.South, + 'topleft': QTabWidget.TabPosition.North, + 'topright': QTabWidget.TabPosition.North, } try: element.Widget.setTabPosition(position_dict[element.TabLocation]) @@ -8986,7 +9009,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): element.QT_TableWidget.setHorizontalHeaderLabels(element.ColumnHeadings) element.QT_TableWidget.installEventFilter(element.QT_TableWidget) - element.QT_TableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) + element.QT_TableWidget.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) if element.Tooltip: element.QT_TableWidget.setToolTip(element.Tooltip) if not element.Visible: @@ -9123,21 +9146,21 @@ def ConvertFlexToTK(window): def start_window_read_timer(window, amount): - timer = QtCore.QTimer() + timer = QTimer() timer.timeout.connect(window._timer_timeout) timer.start(amount) return timer def start_systray_read_timer(tray, amount): - timer = QtCore.QTimer() + timer = QTimer() timer.timeout.connect(tray._timer_timeout) timer.start(amount) return timer def start_window_autoclose_timer(window, amount): - timer = QtCore.QTimer() + timer = QTimer() window.autoclose_timer = timer timer.timeout.connect(window._autoclose_timer_callback) timer.start(amount) @@ -9177,10 +9200,10 @@ def StartupTK(window): window.QTApplication.setActiveWindow(window.QT_QMainWindow) - flags = QtCore.Qt.WindowFlags() + flags = Qt.WindowFlags() if window.NoTitleBar: flags |= Qt.FramelessWindowHint - flags |= QtCore.Qt.Tool + flags |= Qt.Tool if window.KeepOnTop: flags |= Qt.WindowStaysOnTopHint @@ -9190,13 +9213,13 @@ def StartupTK(window): window.QT_QMainWindow.setWindowOpacity(window.AlphaChannel) if window.WindowIcon is not None: if type(window.WindowIcon) is bytes: - ba = QtCore.QByteArray.fromBase64(window.WindowIcon) - pixmap = QtGui.QPixmap() + ba = QByteArray.fromBase64(window.WindowIcon) + pixmap = QPixmap() pixmap.loadFromData(ba) qicon = QIcon(pixmap) window.QT_QMainWindow.setWindowIcon(qicon) else: - window.QT_QMainWindow.setWindowIcon(QtGui.QIcon(window.WindowIcon)) + window.QT_QMainWindow.setWindowIcon(QIcon(window.WindowIcon)) if window.DisableMinimize: window.QT_QMainWindow.setWindowFlags(window.QT_QMainWindow.windowFlags() & ~Qt.WindowMinimizeButtonHint) window.QT_QMainWindow.setWindowFlags(window.QT_QMainWindow.windowFlags() & ~Qt.WindowMaximizeButtonHint) @@ -9236,11 +9259,11 @@ def StartupTK(window): if window.BackgroundImage is not None: qlabel = QLabel(window.QTWindow) qlabel.setText('') - w = QtGui.QPixmap(window.BackgroundImage).width() - h = QtGui.QPixmap(window.BackgroundImage).height() - qlabel.setGeometry(QtCore.QRect(0, 0, w, h)) + w = QPixmap(window.BackgroundImage).width() + h = QPixmap(window.BackgroundImage).height() + qlabel.setGeometry(QRect(0, 0, w, h)) # qlabel.setGeometry(window.QTWindow.geometry()) - qlabel.setPixmap(QtGui.QPixmap(window.BackgroundImage)) + qlabel.setPixmap(QPixmap(window.BackgroundImage)) # style += 'background-image: url(%s);' % window.BackgroundImage window.QT_QMainWindow.setWindowTitle(window.Title) From 993621e541e50378d857a5622659ce1763b4e4d1 Mon Sep 17 00:00:00 2001 From: thirschbuechler Date: Fri, 25 Apr 2025 17:26:55 +0200 Subject: [PATCH 6/7] Qt -- fix setActiveWindow depreciation warning --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 8cd5ae27..079f39c2 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -9198,8 +9198,11 @@ def StartupTK(window): window.QT_QMainWindow.installEventFilter(window.QT_QMainWindow) - window.QTApplication.setActiveWindow(window.QT_QMainWindow) - + if not using_pyqt5: + window.QT_QMainWindow.activateWindow() + else: + window.QTApplication.setActiveWindow(window.QT_QMainWindow) + flags = Qt.WindowFlags() if window.NoTitleBar: flags |= Qt.FramelessWindowHint From 67256024c0283223eebf81bc13fc93b41973a8d0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:41:02 +0000 Subject: [PATCH 7/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py | 83 ++++++--------------- 1 file changed, 24 insertions(+), 59 deletions(-) diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 079f39c2..cf72e77c 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -87,30 +87,10 @@ ) # QtGui -from PySide6.QtGui import ( - QPainter, - QPixmap, - QPen, - QColor, - QBrush, - QPainterPath, - QFont, - QImage, - QIcon, - QAction, - QTextCursor -) +from PySide6.QtGui import QPainter, QPixmap, QPen, QColor, QBrush, QPainterPath, QFont, QImage, QIcon, QAction, QTextCursor # QtCore -from PySide6.QtCore import ( - Qt, - QEvent, - QSize, - QByteArray, - QRect, - QTimer -) - +from PySide6.QtCore import Qt, QEvent, QSize, QByteArray, QRect, QTimer using_pyqt5 = False @@ -4559,10 +4539,10 @@ def _QtCallbackCellActivated(self, value=None): # self.ParentForm.TKroot.quit() def add_treeview_data(self, node=None, widget=None): - """ make tree from treedata - - Note: cannot happen in __init__ because the widget is not created yet, - only in packformintoframe and self.update() + """make tree from treedata + + Note: cannot happen in __init__ because the widget is not created yet, + only in packformintoframe and self.update() """ # print(f'Inserting {node.key} under parent {node.parent}') @@ -4575,7 +4555,7 @@ def add_treeview_data(self, node=None, widget=None): # create child child = QTreeWidgetItem(widget) child.setText(0, str(node.text)) - + if node.key: key = node.key else: @@ -4589,11 +4569,11 @@ def add_treeview_data(self, node=None, widget=None): values = None UserData = dict(key=key, values=values) - - if hasattr(child, "setData"): + + if hasattr(child, 'setData'): child.setData(0, Qt.UserRole, UserData) - #child.setData(1, Qt.UserRole, otherData) - + # child.setData(1, Qt.UserRole, otherData) + # this is how readouts in your event loop event work, # given you have a sg.Tree('TREE') in your layout, # which is populated by treedata with keys and values via treedata.insert, @@ -4601,7 +4581,7 @@ def add_treeview_data(self, node=None, widget=None): # tree_name = node.data(0, Qt.DisplayRole) # UserData = (node.data(0, Qt.UserRole)) # UserData["key"], UserData["values"] - + if type(node.icon) is bytes: ba = QByteArray.fromBase64(node.icon) pixmap = QPixmap() @@ -4613,12 +4593,12 @@ def add_treeview_data(self, node=None, widget=None): child.setIcon(0, qicon) for node in node.children: self.add_treeview_data(node, child) - return # None + return # None def Update(self, values=None, visible=None, **kwargs): - """ Update the tree with new treedata - - for legacy compatibility, allow unused, unspecified kwargs + """Update the tree with new treedata + + for legacy compatibility, allow unused, unspecified kwargs """ if values is not None: self.TreeData = values @@ -4665,14 +4645,16 @@ def Insert(self, parent, key, text, values, icon=None): parent_node._Add(node) def delete(self, key): - """ delete individual node and all children + """delete individual node and all children - origin: https://github.com/PySimpleGUI/PySimpleGUI/issues/2514 by https://github.com/deajan + origin: https://github.com/PySimpleGUI/PySimpleGUI/issues/2514 by https://github.com/deajan """ if key == '': return False node = self.tree_dict[key] - key_list = [key, ] + key_list = [ + key, + ] parent_node = self.tree_dict[node.parent] parent_node.children.remove(node) while key_list != []: @@ -5408,7 +5390,7 @@ def _ReadNonBlocking(self): self.QTApplication.processEvents() # refresh the window if 0: # TODO add window closed with X logic self.TKrootDestroyed = True - #_my_windows.Decrement() # undefined + # _my_windows.Decrement() # undefined # print("read failed") # return None, None return BuildResults(self, False, self) @@ -9202,7 +9184,7 @@ def StartupTK(window): window.QT_QMainWindow.activateWindow() else: window.QTApplication.setActiveWindow(window.QT_QMainWindow) - + flags = Qt.WindowFlags() if window.NoTitleBar: flags |= Qt.FramelessWindowHint @@ -13451,24 +13433,7 @@ def PopupCancel( # --------------------------- PopupOK --------------------------- -def PopupOK( - *args, - title=None, - button_color=None, - background_color=None, - text_color=None, - auto_close=False, - auto_close_duration=None, - non_blocking=False, - icon=DEFAULT_WINDOW_ICON, - line_width=None, - font=None, - no_titlebar=False, - grab_anywhere=False, - keep_on_top=False, - location=(None, None), - image=None -): +def PopupOK(*args, title=None, button_color=None, background_color=None, text_color=None, auto_close=False, auto_close_duration=None, non_blocking=False, icon=DEFAULT_WINDOW_ICON, line_width=None, font=None, no_titlebar=False, grab_anywhere=False, keep_on_top=False, location=(None, None), image=None): """ Display Popup with OK button only :param *args: Variable number of your arguments. Load up the call with stuff to see!