简单的 PyQt 函数计算器

Simple PyQt Function Evaluator

我是 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 方法中输出它。

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_()