当前位置:   article > 正文

python利用公式计算_python – 如何编辑列公式,以便自动计算?

python 公式手动变自动

您必须使用itemChanged信号来通知您某些项目的更改,然后您必须验证它是否是您想要的列,如果是,则进行相应的计算.

from PyQt5 import QtCore, QtGui, QtWidgets

# https://stackoverflow.com/a/55523206/6622587

class DoubleDelegate(QtWidgets.QStyledItemDelegate):

def createEditor(self, parent, option, index):

editor = QtWidgets.QDoubleSpinBox(parent)

editor.setFrame(False)

editor.setMinimum(-1.7976931348623157e308)

editor.setMaximum(1.7976931348623157e308)

editor.setSizePolicy(

QtWidgets.QSizePolicy.Ignored, editor.sizePolicy().verticalPolicy()

)

return editor

class EmptyDelegate(QtWidgets.QStyledItemDelegate):

def createEditor(self, parent, option, index):

return None

class MainWindow(QtWidgets.QMainWindow):

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

self.tablewidget = QtWidgets.QTableWidget(4, 7)

self.tablewidget.setHorizontalHeaderLabels(

["X", "Y", "f", "A", "IKS", "PGA", "GSS"]

)

self.tablewidget.itemChanged.connect(self.on_itemChanged)

for col in (0, 1):

delegate = DoubleDelegate(self.tablewidget)

self.tablewidget.setItemDelegateForColumn(col, delegate)

for col in (4,):

delegate = EmptyDelegate(self.tablewidget)

self.tablewidget.setItemDelegateForColumn(col, delegate)

self.setCentralWidget(self.tablewidget)

@QtCore.pyqtSlot("QTableWidgetItem*")

def on_itemChanged(self, item):

if item.column() in (0, 1):

self.calculate_iks(item.row())

def calculate_iks(self, row):

self.tablewidget.blockSignals(True)

for col in (0, 1):

it = self.tablewidget.item(row, col)

if it is None:

it = QtWidgets.QTableWidgetItem("0")

self.tablewidget.setItem(row, col, it)

self.tablewidget.blockSignals(False)

it_x = self.tablewidget.item(row, 0)

it_y = self.tablewidget.item(row, 1)

x = float(it_x.text())

y = float(it_y.text())

iks = x ** 2 + y ** 2

it_iks = self.tablewidget.item(row, 4)

if it_iks is None:

it_iks = QtWidgets.QTableWidgetItem()

self.tablewidget.setItem(row, 4, it_iks)

it_iks.setText(str(iks))

if __name__ == "__main__":

import sys

app = QtWidgets.QApplication(sys.argv)

w = MainWindow()

w.show()

sys.exit(app.exec_())

如果你想计算gss = iks * pga那么你应该做以下事情:

class MainWindow(QtWidgets.QMainWindow):

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

self.tablewidget = QtWidgets.QTableWidget(4, 7)

self.tablewidget.setHorizontalHeaderLabels(

["X", "Y", "f", "A", "IKS", "PGA", "GSS"]

)

self.tablewidget.itemChanged.connect(self.on_itemChanged)

for col in (0, 1, 5):

delegate = DoubleDelegate(self.tablewidget)

self.tablewidget.setItemDelegateForColumn(col, delegate)

for col in (4, 6,):

delegate = EmptyDelegate(self.tablewidget)

self.tablewidget.setItemDelegateForColumn(col, delegate)

self.setCentralWidget(self.tablewidget)

@QtCore.pyqtSlot("QTableWidgetItem*")

def on_itemChanged(self, item):

if item.column() in (0, 1):

self.calculate_iks(item.row())

elif item.column() in (4, 5):

self.calculate_gss(item.row())

# ...

def calculate_gss(self, row):

self.tablewidget.blockSignals(True)

for col in (4, 5, 6):

it = self.tablewidget.item(row, col)

if it is None:

it = QtWidgets.QTableWidgetItem("0")

self.tablewidget.setItem(row, col, it)

self.tablewidget.blockSignals(False)

it_iks = self.tablewidget.item(row, 4)

it_pga = self.tablewidget.item(row, 5)

iks = float(it_iks.text())

pga = float(it_pga.text())

gss = iks*pga

it_gss = self.tablewidget.item(row, 6)

it_gss.setText(str(gss))

我建议分析解决方案,不仅适用,因为这是SO的想法,如果在计算iks和gss的情况下完成,你可以看到有很多相似之处,这样你就可以重构代码来做其他的计算.一个简单的方法.

class MainWindow(QtWidgets.QMainWindow):

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

self.tablewidget = QtWidgets.QTableWidget(4, 7)

self.tablewidget.setHorizontalHeaderLabels(

["X", "Y", "f", "A", "IKS", "PGA", "GSS"]

)

self.tablewidget.itemChanged.connect(self.on_itemChanged)

for col in (0, 1, 5):

delegate = DoubleDelegate(self.tablewidget)

self.tablewidget.setItemDelegateForColumn(col, delegate)

for col in (4, 6):

delegate = EmptyDelegate(self.tablewidget)

self.tablewidget.setItemDelegateForColumn(col, delegate)

self.setCentralWidget(self.tablewidget)

self.calculates = [

{

"inputs": (0, 1), # X, Y

"output": 4, # IKS

"function": lambda X, Y: X ** 2 + Y ** 2,

},

{

"inputs": (4, 5), # IKS, PGA

"output": 6, # GSS

"function": lambda IKS, PGA: IKS * PGA,

},

]

@QtCore.pyqtSlot("QTableWidgetItem*")

def on_itemChanged(self, item):

for c in self.calculates:

inputs = c["inputs"]

output = c["output"]

function = c["function"]

if item.column() in inputs:

self.calculate(item.row(), inputs, output, function)

def calculate(self, row, inputs, output, function):

self.tablewidget.blockSignals(True)

for col in (*inputs, output):

it = self.tablewidget.item(row, col)

if it is None:

it = QtWidgets.QTableWidgetItem("0")

self.tablewidget.setItem(row, col, it)

self.tablewidget.blockSignals(False)

values = [float(self.tablewidget.item(row, i).text()) for i in inputs]

result = function(*values)

it_out = self.tablewidget.item(row, output)

it_out.setText(str(result))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/816794
推荐阅读
相关标签
  

闽ICP备14008679号