首页 > 解决方案 > Python - 添加小部件将在使用 threading.timer 时在新窗口中创建它们

问题描述

我实际上在使用 threading.Timer() 函数时遇到问题,以便每 X 分钟重复一次分析。

所以这个想法是计算一个接口的操作次数,并对同一个接口的每个类别进行计数。在代码的每次重复过程中,类别的旧值将从布局(QGridLayout)中删除,并添加新值。

当我单击一次按钮时,它完美无缺。但是当我激活 threading.Timer() 选项以自动重复操作时,在添加新的 QLabel 时,它会将它们添加为新窗口“pythonw”。

我无法理解发生了什么,因为代码可以完全识别布局,删除旧的小部件就可以了,但是当需要插入新的小部件时,它会将它们作为新窗口插入......

我读到您最终需要在使用线程时更新自我窗口?不太清楚,能不能帮帮我??

def Configuracion(self,ListBox):
    
    ScrollingArea = self.findChildren(QScrollArea)
    LayoutFrame = ScrollingArea[0].widget().layout()
    
    ColumnaListBox = LayoutFrame.getItemPosition(LayoutFrame.indexOf(ListBox))[1]
    DictValores = {}

    #Quitamos eventuales valores creados antes

    i = 0

    while True:
        try:
            LayoutFrame.itemAtPosition(6 + i, ColumnaListBox).widget().setParent(None) #.deleteLater()
            i += 1
        except:
            break

    for i in range(0,ListBox.count()):
        if not ListBox.item(i).text().split('|')[-1].strip() in DictValores:
            DictValores[ListBox.item(i).text().split('|')[-1].strip()] = 1
        else:
            DictValores[ListBox.item(i).text().split('|')[-1].strip()] += 1

    i = 0
    ListaValor = []

    for clave in sorted(DictValores.keys()):
        Valor = QLabel(clave + ': ' + str(DictValores[clave]) + ' / ' + str(ListBox.count()))
        Valor.setAlignment(Qt.AlignCenter)
        
        if 'Error' in clave:
            Valor.setStyleSheet("font: bold;color : red")
        else:
            Valor.setStyleSheet("font: bold;color : green")
            
        LayoutFrame.addWidget(Valor, 6 + i, ColumnaListBox)

    if ListBox.count() == 0:
        Item = QtWidgets.QListWidgetItem()
        Item.setText('Sin Operaciones por el momento')
        Item.setTextAlignment(Qt.AlignHCenter)
        font = QtGui.QFont()
        font.setBold(True)
        Item.setFont(font)
        ListBox.addItem(Item)
        
    ListBox.sortItems()
    ListBox.scrollToBottom()
    ListBox.setMinimumWidth(ListBox.sizeHintForColumn(0) + 20)

在“LayoutFrame.addWidget(Valor, 6 + i, ColumnaListBox)”行上添加小部件时,使用 threading.Timer() 在 X 分钟后安排执行时,它会失败,但在执行代码一次时不会。我已经检查了 ScrollingArea/Frame/Layout 的定义,它们被正确识别,并且具有相同的地址,所以这里会出现什么问题???

谢谢您的帮助 !:)

标签: python-3.x

解决方案


没关系,使用一个简单的 QTimer() 对象解决了它......仍然对使用线程时出了什么问题感到好奇,所以如果想以某种方式分享一些关于它的观点,那就太好了:)


推荐阅读