2015-10-29 3 views
0

Я начинающий, когда речь заходит о графических интерфейсах в юниверсе python, и я пытаюсь закодировать простой оценщик функций для sin (x), cos (x), tan (x). Вот мой код.Simple PyQt Function Evaluator

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.

ответ

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_() 
Смежные вопросы