代码之家  ›  专栏  ›  技术社区  ›  Mersper

这个Python代码是怎么回事?

  •  0
  • Mersper  · 技术社区  · 8 年前

    我正在使用PyQt 4编写一个单元转换器。在这里,我面临一个问题。

    class UnitConverter(QtGui.QComboBox):
        def __init__(self, parent=None):
            super(UnitConverter, self).__init__(parent)
            self.unitsdict = {
                "mass": {"g": 1, "kg": 1000, "t": 1000000, "oz": 28.3495231, "lb": 453.59237},
                "pressure": {"pa": 1, "kpa": 1000, "mpa": 1000000, "bar": 100000, "atm": 101325,
                            "tor": 133.3223684, "psi": 6894.757, "at": 98066.5}
            }
    
        def combo(self, measurement):
            for key in self.unitsdict[measurement]:
                self.addItem(self.tr(key), self.unitsdict[measurement][key])
    
        def comboConnect(self, table, row, column):
            self.names = locals()
            #tablevar = "self.table_" + str(row) + "_" + str(column)
            self.rowvar = "self.row_" + str(row) + "_" + str(column)
            self.columnvar = "self.column_" + str(row) + "_" + str(column)
            self.names[self.rowvar] = row
            self.names[self.columnvar] = column
            self.table = table
            self.base = self.itemData(self.currentIndex())
            self.currentIndexChanged.connect(self.change)
    
        def change(self):
            tobase = self.itemData(self.currentIndex())
            try:
                self.value = float(self.table.item(self.names[self.rowvar], self.names[self.columnvar]).text())
                tovalue = '%f' % (self.value * self.base / tobase)
                changeitem = QtGui.QTableWidgetItem(str(tovalue))
                self.table.setItem(self.names[self.rowvar], self.names[self.columnvar], changeitem)
            except:
                pass
            self.base = tobase
    

    我希望当我更改组合框的索引时,它可以自动计算结果。 enter image description here

    当只有一个QTableWidgetItem连接到它时,它工作。

    table = QTableWidget(10, 3)
    combo = Unit converter()
    combo.combo("pressure")
    table.setCellWidget(5, 0, combo)
    combo.comboConnect(table, 5, 1)
    

    但是当我连接另一个QTableWidgetItem时,第一个意外地不再工作。

    table = QTableWidget(10, 3)
    combo = Unit converter()
    combo.combo("pressure")
    table.setCellWidget(5, 0, combo)
    combo.comboConnect(table, 5, 1)
    combo.comboConnect(table, 5, 2)
    

    1 回复  |  直到 8 年前
        1
  •  1
  •   eyllanesc    8 年前

    主要问题是您正在覆盖许多变量,因此只能看到最后保存的数据,例如self。罗瓦尔和赛尔夫。columnvar保存最后一行和最后一列,而不是更新,您必须将其添加到列表或类似的内容中。

    class UnitConverter(QtGui.QComboBox):
        def __init__(self, table, parent=None):
            super(UnitConverter, self).__init__(parent)
            self.unitsdict = {
                "mass": {"g": 1, "kg": 1000, "t": 1000000, "oz": 28.3495231, "lb": 453.59237},
                "pressure": {"pa": 1, "kpa": 1000, "mpa": 1000000, "bar": 100000, "atm": 101325,
                             "tor": 133.3223684, "psi": 6894.757, "at": 98066.5}
            }
            self.table = table
            self.base = -1
            self.items = []
            self.currentIndexChanged.connect(self.change)
    
        def combo(self, measurement):
            for key in self.unitsdict[measurement]:
                self.addItem(self.tr(key), self.unitsdict[measurement][key])
            self.base = self.itemData(self.currentIndex())
    
        def comboConnect(self, row, column):
            self.items.append((row, column))
    
        def change(self, ix,):
            tobase = self.itemData(ix)
            factor = self.base / tobase
            self.base = tobase
    
            for r, c in self.items:
                it = self.table.item(r, c)
                try:
                    value = float(it.text())
                    tovalue = '%f' % (value * factor)
                    it.setText(tovalue)
                except:
                    pass
    
    
    if __name__ == '__main__':
        import sys
    
        app = QtGui.QApplication(sys.argv)
        table = QtGui.QTableWidget(10, 3)
        combo = UnitConverter(table)
        combo.combo("pressure")
        table.setCellWidget(5, 0, combo)
        combo.comboConnect(5, 1)
        combo.comboConnect(5, 2)
        table.show()
        sys.exit(app.exec_())