2016-08-05 7 views
2

私はPyQtプログラムを持っています。このプロジェクトでは、以前の設定に基づいた計算がいくつかあります。ウィジェットからの情報の入手方法

example_run_vars.py

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(324, 332) 
     self.gridLayout = QtWidgets.QGridLayout(Dialog) 
     self.gridLayout.setObjectName("gridLayout") 
     self.B = QtWidgets.QLabel(Dialog) 
     self.B.setObjectName("B") 
     self.gridLayout.addWidget(self.B, 0, 0, 1, 1) 
     self.A_val = QtWidgets.QLineEdit(Dialog) 
     self.A_val.setObjectName("A_val") 
     self.gridLayout.addWidget(self.A_val, 0, 1, 1, 1) 
     self.A = QtWidgets.QLabel(Dialog) 
     self.A.setObjectName("A") 
     self.gridLayout.addWidget(self.A, 1, 0, 1, 1) 
     self.B_val = QtWidgets.QLineEdit(Dialog) 
     self.B_val.setObjectName("B_val") 
     self.gridLayout.addWidget(self.B_val, 1, 1, 1, 1) 
     self.Zerocheck = QtWidgets.QCheckBox(Dialog) 
     self.Zerocheck.setObjectName("Zerocheck") 
     self.gridLayout.addWidget(self.Zerocheck, 1, 2, 1, 1) 
     self.math = QtWidgets.QComboBox(Dialog) 
     self.math.setObjectName("math") 
     self.gridLayout.addWidget(self.math, 2, 1, 1, 1) 
     self.math_else = QtWidgets.QComboBox(Dialog) 
     self.math_else.setObjectName("math_else") 
     self.gridLayout.addWidget(self.math_else, 3, 1, 1, 1) 
     self.Run = QtWidgets.QPushButton(Dialog) 
     self.Run.setObjectName("Run") 
     self.gridLayout.addWidget(self.Run, 4, 1, 1, 1) 
     self.Answer = QtWidgets.QLineEdit(Dialog) 
     self.Answer.setReadOnly(False) 
     self.Answer.setObjectName("Answer") 
     self.gridLayout.addWidget(self.Answer, 5, 1, 1, 1) 

     self.retranslateUi(Dialog) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

    def retranslateUi(self, Dialog): 
     _translate = QtCore.QCoreApplication.translate 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 
     self.B.setText(_translate("Dialog", "A: ")) 
     self.A.setText(_translate("Dialog", "B: ")) 
     self.Zerocheck.setText(_translate("Dialog", "ZeroCheck")) 
     self.Run.setText(_translate("Dialog", "Run")) 

がexample.py

import sys, os 
from PyQt5 import QtCore, QtGui, QtWidgets 
from example_run_vars import Ui_Dialog 

class example(QtWidgets.QDialog): 
    def __init__(self, parent=None): 
     # QtGui.QWidget.__init__(self, parent) # PyQt4 
     super(example, self).__init__(parent) # pyQt5 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 
     self.ui.retranslateUi(self) 


     self.ui.math.addItem('Add') 
     self.ui.math.addItem('Substract') 
     self.ui.math.addItem('Multiply') 
     self.ui.math.addItem('Divide') 
     self.ui.math.addItem('Power') 
     self.ui.math.addItem('Sqrt') 
     self.ui.math.activated[str].connect(self.dosomething) 

     self.ui.math_else.addItem('math function x') 
     self.ui.math_else.activated[str].connect(self.dosomething) 

     self.ui.Zerocheck.setChecked(False) 
     self.ui.Zerocheck.clicked.connect(self.dosomething) 

     self.ui.Run.clicked.connect(self.calculate) 

    def a_changed(self): 
     pass 

    def b_changed(self): 
     pass 

    def calculate(self): 
     # return value in Answer text box 
     pass 

    def dosomething(self): 
     # arbritary thing i realy don't know if i need it... 
     pass 

if __name__ == "__main__": 
    import sys 
app = QtWidgets.QApplication(sys.argv) 
exampleDialog = QtWidgets.QDialog() 
examplepanel = example() 
examplepanel.show() 
sys.exit(app.exec_()) 

一例として、私は以下のファイルが含まれている小型の電卓を作成しましたアイデアは、スクリプトの実行ボタンを押すと、テキストボックスに答えが表示されます。要点は、答えを返す最も簡単な方法(またはプログラム的に最良の方法)が何であるか分かりません。

私はアイデアを持っている2つのまたはツリーのオプションがあります。

  1. すべてのチェックボックス/コンボボックス/テキストボックスが何かを行い、このどこかを置くと、計算ボタンがこれを読み出します。
  2. 計算するときは、すべてのチェックボックス/コンボボックス/テキストボックスを読み取り、これを関数に追加します。
  3. これらの2つの組み合わせ。

状況の種類を処理する最も良い方法は何ですか?その理由は何ですか?

答えて

2

データはです。すでにがウィジェットに格納されているため、効率が悪く、別のコピーを作成します。また、個々のウィジェットごとにハンドラを設定する必要がありますが、これは不必要に複雑です。一般に、計算が行われる時点でウィジェットからすべての情報を収集することが最善です。

あなたの例では、calculateスロットを実行ボタンに接続しておき、他のすべての信号/スロットを取り除くことをお勧めします。次に、必要なすべての数学演算のための関数を作成する必要があります。これらの関数のそれぞれは、行編集からA/B値を取る2つの引数を持っていなければなりません。には2つの引数が必要です。このためoperator moduleから機能の一部を使用するか、単に書くことができ、あなた自身:

self.ui.math.addItem('Add', add_func) 
    self.ui.math.addItem('Substract', sub_func) 
    self.ui.math.addItem('Multiply', mult_func) 

付:あなたは、このようなコンボボックスの項目にこれらの関数を直接リンクすることができ

def add_func(a, b): 
    return a + b 

それは場所で、calculateスロットは次のようになります:この方法で物事を行う

def calculate(self): 
     a = float(self.ui.A_val.text()) 
     b = float(self.ui.B_val.text()) 
     # get the linked function from the combo-box 
     func = self.ui.math.currentData() 
     # calculate the answer 
     answer = func(a, b) 
     # show the new answer 
     self.ui.Answer.setText(str(answer)) 

がFUNCTを追加することが非常に容易になり、削除または再オーダーコンボボックス内のイオン(すなわち、 calculateスロットを変更する必要はありません)。

関連する問題