PyQT 使用循环将 data/information 添加到选项卡

PyQT adding data/information to Tabs using a Loop

我目前正在努力弄清楚如何为我的程序更正执行几个循环,以使其按我想要的方式运行。

该程序的背景知识很少,我有一个姓名列表、一个词典列表和一个词典。目标是将字典列表与字典进行比较以获得正确的值。我的意思是假设我有一组动物(这是名称列表,我们称之为 setNames)并且这些动物中的每一个(setNames)都有不同的房子,食物、水和床。 (这是字典列表,我们称之为 setData)。最后,我们对这些字典中的每一个都有正确的值 (setData)。我们称之为 correct_parameters

由于每只动物都有自己的字典,因此他必须确保自己的字典参数正确。

程序执行以下操作。

  1. 首先,它将 "fix" 我们的词典列表 (setData) 以便我们稍后将其与 correct_parameters
  2. 然后,一旦我们的 setData 是 split/striped,它就会开始一个循环过程来遍历我们 setNames 列表中的每只动物。
  3. 最后,一旦完成循环,它将为每只动物创建一个选项卡,其中包含我们在比较时不正确的参数。

视觉示例:

为了进一步解释图像,我们有 setNamessetDataCorrect_parameters 如我们所见,setDatacorrect_parameters,任何不正确或不匹配的内容都会打印到标签上。

问题:

我的问题是为错误数据中的每个参数创建了一个选项卡:

我是 python 的新手,我仍在尝试弄清楚如何更正循环此功能。有什么想法吗?

代码:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self, parent = None):
        super(Window, self).__init__(parent)

        # Create a QTabWidget where all the tabs will be held
        self.myTabs = QtGui.QTabWidget()


        # Loop through our animal names
        setNames = ['Cat', 'Dog', 'Bird']
        setData = [{'House=15': 'House=15', 'Food=2': 'Food=2', 'Water=4': 'Water=4', 'Bed=6': 'Bed=6'}, {'House=14': 'House=14', 'Food=2': 'Food=2', 'Water=5': 'Water=5', 'Bed=6': 'Bed=6'}, {'House=15': 'House=15', 'Food=8': 'Food=8', 'Water=4': 'Water=4', 'Bed=9': 'Bed=9'}]
        lst = setData
        for idx, val in enumerate(lst):
            o = {}
            for k,v in val.iteritems():
                if '=' in k:
                    k = k.split('=')[0]
                if '=' in v:
                    v = v.split('=')[1]
                    v = v.replace('"','')
                    v = v.strip()
                o[k] = v
            lst[idx] = o
        count = 0
        print lst
        correct_parameter = {'House': '15', 'Food': '12', 'Water': '4', 'Bed': '4'}
        while count < len(setNames):
            for number, item in enumerate(lst,0):
                for tabName in setNames:
                    for param, correct in correct_parameter.items():
                        tabLabel = QtGui.QTextEdit()
                        tabWidget = QtGui.QWidget()
                        self.myTabs.addTab(tabWidget, tabName)
                        if item.get(param) != correct:
                            tabLabel.append('{} = {}'.format(param, item.get(param)))
                            # Set the tab widget's layout
                            tabLayout = QtGui.QVBoxLayout()
                            tabLayout.addWidget(tabLabel)
                            tabWidget.setLayout(tabLayout)
                        QtGui.QApplication.processEvents()
                        count += 1


        # Set the main layout
        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.myTabs)
        self.setLayout(mainLayout)

        # Resize our window and show it
        self.resize(300, 300)
        self.show()


import sys
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    main_window = Window()
    QtGui.QApplication.processEvents()
    main_window.show()
    sys.exit(app.exec_())

我对您为填充 tabWidget 所做的所有循环感到相当困惑。您遍历 setNames 两次(while count < len(setNames) and for tabName in setNames),这会导致大量重复。我认为,如果您想保留您的方法,您可能想用某种逻辑替换 tabWidget=QtGui.QWidget() 以检查 self.myTabs 是否具有您要填充的当前 tabName并添加到它。

相反,我认为通过先循环选项卡然后检查字典是否有意义来考虑问题会更容易。以下循环应替换整个 while 循环:

for index, tabName in enumerate(setNames):
    tabWidget = QtGui.QWidget()
    tabLabel = QtGui.QTextEdit()
    nameData = lst[index]
    for k in nameData:
        if nameData[k] != correct_parameter[k]:
            tabLabel.append('{} = {}'.format(k, nameData[k]))
    tabLayout = QtGui.QVBoxLayout()
    tabLayout.addWidget(tabLabel)
    tabWidget.setLayout(tabLayout)
    self.myTabs.addTab(tabWidget, tabName)

注意:您的代码列出了 ['Cat'、'Dog'、'Bird'] 并且您的所有图像交换了 'Bird' 和 'Dog' 的顺序。