简单PyQt函数Evalu

2024-03-29 11:36:19 发布

您现在位置:Python中文网/ 问答频道 /正文

对于python世界中的gui,我是一个初学者,我正在尝试为sin(x)、cos(x)、tan(x)编写一个简单的函数计算器。这是我的密码。你知道吗

import matplotlib.pyplot as plt
import numpy as np
import sys
from PyQt4 import QtGui, QtCore


class Form(QtGui.QWidget) :
    def __init__(self):
        super(Form, self).__init__()

        layout = QtGui.QVBoxLayout(self)
        combo = QtGui.QComboBox()
        combo.addItem("Sin")
        combo.addItem("Cos")
        combo.addItem("Tan")

        parameter = QtGui.QLineEdit("np.linspace(lower,upper,dx)")
        parameter.selectAll()
        output = QtGui.QLineEdit("Output (Press Enter)")
        output.selectAll()

        layout.addWidget(combo)
        layout.addWidget(parameter)
        layout.addWidget(output)

        self.setLayout(layout)
        combo.setFocus()
        self.connect(output, QtCore.SIGNAL("returnPressed()"), self.updateUI) 
        self.setWindowTitle("Function Evaluator")

    def updateUI(self) :
        x = float(self.parameter_edit.text())
        f = str(eval(str(self.function_edit.text())))
        self.output_edit.setText(f)


app = QtGui.QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

我该怎么做呢?我有一个特定函数的下拉列表,但不知道如何对特定的下拉列表函数进行评估。或者我如何用x输入实际计算函数本身,并在updateUI方法中输出它。你知道吗


Tags: 函数importselfformoutputparameterasnp
1条回答
网友
1楼 · 发布于 2024-03-29 11:36:19

QComboBox's项可以有名称和内容:

qCombo.addItem('Sin', 'np.sin')

以下是获取所选项目内容的方法:

content = qCombo.itemData(qCombo.currentIndex())

请记住,在python2中,返回的内容包装在QVariant;我们必须手动将其展开:

content = content.toString()

因此,您的代码可能如下所示:

import matplotlib.pyplot as plt
import numpy as np
import sys
from PyQt4 import QtGui, QtCore


class Form(QtGui.QWidget):
    def __init__(self):
        super(Form, self).__init__()

        self.func_selector = QtGui.QComboBox()
        self.func_selector.setFocus()
        self.func_selector.addItem("Sin", 'np.sin')
        self.func_selector.addItem("Cos", 'np.cos')
        self.func_selector.addItem("Tan", 'np.tan')

        self.parameter_edit = QtGui.QLineEdit("np.linspace(lower, upper, n)")

        self.output_edit = QtGui.QLineEdit("Output (Press Enter)")
        self.output_edit.returnPressed.connect(self.updateUI)

        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.func_selector)
        layout.addWidget(self.parameter_edit)
        layout.addWidget(self.output_edit)

        self.setLayout(layout)
        self.setWindowTitle("Function Evaluator")

    def updateUI(self):
        # A dictionary of local variables that can be used by eval()
        locs = {'lower': 0, 'upper': 2*np.pi, 'n': 10}

        x = self.parameter_edit.text()

        # Get a content of the selected QComboBox's item
        f = self.func_selector.itemData(self.func_selector.currentIndex())
        # In python2 a QComboBox item's content is wrapped in QVariant, so we must unwrap it:
        if sys.version_info.major == 2:
            f = f.toString()

        y = eval('{}({})'.format(f, x), None, locs)
        self.output_edit.setText(str(y))

        # if the function returns multiple values, show a plot
        if isinstance(y, np.ndarray):
            x_eval = eval(str(x), None, locs)
            plt.plot(x_eval, y)
            plt.show()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()

相关问题 更多 >