2017-10-10 7 views
1

変数がQtDesignerのuiファイルに既に割り当てられているPyQt環境で、さまざまな変数に値を割り当てて計算する最良の方法を理解したいと思います。PyQt - コードで変数名と値を管理する

変数はさまざまなグループに基づいて名前が付けられます。また、各グループには複数の変数を含めることができるため、順序が反映された2次的な名前が付けられます。

たとえば、私は持っています。

{group_name}_range_{number}_start

{group_name}_range_{number}_end

私はこのコードを複数回コピーするとエラーにそれを開くことが、よりPython的な方法で割り当てて、これらの変数の数で動作する方法を知っていただきたいと思います。

これは私のQt uiファイルです(スペースを節約するために1行です)。

<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>390</width><height>261</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QLineEdit" name="a_range_1_start"><property name="geometry"><rect><x>30</x><y>30</y><width>113</width><height>41</height></rect></property></widget><widget class="QLineEdit" name="a_range_1_end"><property name="geometry"><rect><x>150</x><y>30</y><width>113</width><height>41</height></rect></property></widget><widget class="QLineEdit" name="a_range_2_start"><property name="geometry"><rect><x>30</x><y>80</y><width>113</width><height>41</height></rect></property></widget><widget class="QLineEdit" name="a_range_2_end"><property name="geometry"><rect><x>150</x><y>80</y><width>113</width><height>41</height></rect></property></widget><widget class="QLineEdit" name="b_range_1_start"><property name="geometry"><rect><x>30</x><y>190</y><width>113</width><height>41</height></rect></property></widget><widget class="QLineEdit" name="b_range_1_end"><property name="geometry"><rect><x>150</x><y>190</y><width>113</width><height>41</height></rect></property></widget><widget class="QLabel" name="a_range_1_sum"><property name="geometry"><rect><x>280</x><y>40</y><width>71</width><height>21</height></rect></property><property name="font"><font><family>Arial</family><pointsize>12</pointsize></font></property><property name="text"><string>TextLabel</string></property></widget><widget class="QLabel" name="a_range_2_sum"><property name="geometry"><rect><x>280</x><y>90</y><width>71</width><height>21</height></rect></property><property name="font"><font><family>Arial</family><pointsize>12</pointsize></font></property><property name="text"><string>TextLabel</string></property></widget><widget class="QLabel" name="b_range_1_sum"><property name="geometry"><rect><x>280</x><y>200</y><width>71</width><height>21</height></rect></property><property name="font"><font><family>Arial</family><pointsize>12</pointsize></font></property><property name="text"><string>TextLabel</string></property></widget></widget></widget><resources/><connections/></ui> 

私は、次の変数を持ってa_range_1_starta_range_1_enda_range_2_start、私は上記の形式に分類さa_range_2_endb_range_1_startb_range_1_end。問題を再現するためのPythonコードは次のとおりです。

import sys 
import pandas as pd 
from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 
from PyQt5.uic import loadUiType 

qtCreatorFile = r'test.ui' 
Ui_MainWindow, QtBaseClass = loadUiType(qtCreatorFile) 

class MainApp(QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None, *args): 
     super().__init__() 
     self.initUI() 

    def initUI(self, parent=None, *args): 
     QMainWindow.__init__(self, None) 
     Ui_MainWindow.__init__(self) 
     self.df1 = pd.DataFrame({'mynumbers': range(10)}, 
           index=['a','b','c','d','e','f','g','h','i','j']) 
     self.df2 = pd.DataFrame({'values': range(10, 40)}) 
     self.setupUi(self) 
     self.show() 

     self.a_range_1_start.textChanged.connect(self.a_range_1_start_function) 
     self.a_range_1_end.textChanged.connect(self.a_range_1_end_function) 

    def a_range_1_start_function(self): 
     # Print replaces other text functions here for example... 
     print('start - ' + self.a_range_1_start.text()) 
     self.calc_a_range_1() 

    def a_range_1_end_function(self): 
     print('end - ' + self.a_range_1_end.text()) 
     self.calc_a_range_1() 

    def calc_a_range_1(self): 
     myvalue = self.df1.loc[self.a_range_1_start.text():self.a_range_1_end.text(),:].mynumbers.sum() 
     if myvalue > 0: 
      self.a_range_1_sum.setText('{:,.2f}'.format(myvalue)) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    w = MainApp() 
    w.show() 
    sys.exit(app.exec_()) 

これは、機能とプロセスがまさに私が使用しているものではない問題の迅速なレクリエーションです。最後に

、Iは(a_range1_starta_range_1_enddf1にCALCSを実行する方法に類似)UIのa_range_2_end変数が再びdf1に取り付けられるように、a_range_2_startで持っていると思いますが、ディスプレイがa_range_2_sum QLabelに取り付けられています。

また、私はb_range_1_startb_range_1_enddf2とそれぞれのQLabelに付けたいと思っています。

これで問題を十分に説明できます。どうもありがとう!

答えて

1

この種の問題を解決するには多分さまざまな方法がありますが、私は1つだけを提案します。このアイデアは、複数のオブジェクトを1つにグループ化し、そのオブジェクトにシンプルで統一されたAPIを提供することです。これは、オブジェクトがどのようにグループ化されているか、既存の機能がどれくらい重複しているかによって、コードの再利用の機会を提供します。

このアプローチには、確かに確立されたDesign Patternという名前があります。Facade Pattern、おそらくMediator Pattern - わかりません。とにかく

- ここでそれはあなたの例で使用することができる方法である。また、それは親のメイン・ウィンドウにアクセスするためparent()方法を提供するように私はRangeGropupクラスQObjectをした

class RangeGroup(QObject): 
    def __init__(self, parent, df, r_start, r_end, r_sum): 
     super(RangeGroup, self).__init__(parent) 
     self.df = df 
     self.range_start = r_start 
     self.range_end = r_end 
     self.range_sum = r_sum 
     self.range_start.textChanged.connect(self.range_start_function) 
     self.range_end.textChanged.connect(self.range_end_function) 

    def range_start_function(self): 
     print('start - ' + self.range_start.text()) 
     self.calc_range() 

    def range_end_function(self): 
     print('end - ' + self.range_end.text()) 
     self.calc_range() 

    def calc_range(self): 
     myvalue = self.df.loc[self.range_start.text():self.range_end.text(),:].mynumbers.sum() 
     if myvalue > 0: 
      self.range_sum.setText('{:,.2f}'.format(myvalue)) 

class MainApp(QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None, *args): 
     super().__init__() 
     self.initUI() 

    def initUI(self, parent=None, *args): 
     QMainWindow.__init__(self, None) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 

     df1 = pd.DataFrame({'mynumbers': range(10)}, 
           index=['a','b','c','d','e','f','g','h','i','j']) 
     df2 = pd.DataFrame({'values': range(10, 40)}) 

     self.range_A1 = RangeGroup(
      self, df1, self.a_range_1_start, 
      self.a_range_1_end, self.a_range_1_sum) 
     self.range_A2 = RangeGroup(
      self, df1, self.a_range_2_start, 
      self.a_range_2_end, self.a_range_2_sum) 
     self.range_B1 = RangeGroup(
      self, df2, self.b_range_1_start, 
      self.b_range_1_end, self.b_range_1_sum) 

     self.show() 

、および必要に応じてカスタム信号を定義することができます。

+0

すごくありがとう、ありがとう。私はこれらの方法とパターンを勉強しています。私はあなたの助けと参考にも非常に感謝しています。乾杯! –

関連する問題