我是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方法中输出它。
答案 0 :(得分:1)
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_()