2017-01-03 1 views
0

は、私は3つのファイルがあります:すべてのGUIのものは、Qtのデザイナーからのpythonに変換含まれていPySideのGUIクラスから関数をどのように分けるのですか?私のPySideプロジェクトで

  • 1を、

  • 信号、すべてのロジックと機能と

    を持っている別の
  • もう1つはアプリケーション全体を開始します。

論理と機能を分ける方が良いと思います。

次はtablewidgetにアイテムを挿入する簡単な関数である:

# my_functions.py 
def fill_table(): 
    for row in range(10): 
     for col in range(10): 
     item_value = "...." 
     item = QtGui.QTableWidgetItem() 
     item.setText(str(item_value)) 
     table_widget.setItem(row, col, item) 

私の主な問題は、別のモジュールでは、アプリケーションからウィジェットを参照する方法をです。

+1

必要に応じて関数を新しいファイルに書き換えて、メインスクリプトから呼び出すことができます。 –

答えて

0

my_functions.pyがファイルリストの2番目の項目であるとすると、fill関数はモジュールglobal table_widgetを使用しているようです。私はそれをお勧めしませんが、それが本当にあなたが望むものならば、それにアクセスしてください。だから、

# my_functions.py 
table_widget = ... # somewhere in that file, not shown in your post 
def fill_table(): 
    ...populate table_widget... 

とその後:

# main.py 
import my_functions 
... 
... somewhere, use my_functions.table_widget... 

ベターは、my_functions.pyでカスタムクラスを定義main.pyでインスタンス化、およびカスタムクラスにfill_table()メソッドを作るために次のようになります。

あり
# my_functions.py 
class MyTableWidget(QTableWidget): 
    ... 
    def fill(self): 
     for row in range(10): 
      for col in range(10): 
       item_value = "...." 
       item = QtGui.QTableWidgetItem() 
       item.setText(str(item_value)) 
       self.setItem(row, col, item) 

# main.py 
from my_functions import MyTableWidget 
table = MyTableWidget() 
table.fill() 

多くの方法がありますが、基本的には、現在のデザインはオブジェクト指向ではなく手続き型であるようです。間違ってはいませんが、しばらく後にPyQtやPythonの残りの部分と衝突することになります。アプリがプロトタイピングの段階を過ぎると、維持してデバッグするのは簡単ではありません。だから私は2番目のアプローチをお勧めします。

+0

どのように参照すると、func1.pyのテーブルウィジェットを言うことができますか? – GiannisIordanou

+0

あなたの投稿を更新したようですので、あなたの状況に合わせて具体的に答えを更新しました。 – Schollii

+0

my_functions.pyは、リスト内の2番目のファイルにメインクラスに含まれるすべての関数を含む4番目のファイルです。 – GiannisIordanou

0

一般的なQtアプリケーションのオブジェクトは、親子関係で一緒に接続されています。多くの場合、ルートオブジェクトとして機能するトップレベルのメインウィンドウがあり、他のすべてのオブジェクト(ウィジェット、レイアウトなど)はその下の階層に配置されています。

この場合、他のすべてのオブジェクトはselfでアクセスできるので、すべてのGUI関連のプログラムロジックをメインウィンドウクラスに入れるのは非常に自然です。しかし、すべてのGUI関連のロジックを別々のモジュールの関数に入れると、selfは利用できません。その欠けている機能を提供することはあなた次第です。

これを行うための最も明白な方法は、他のモジュールがそれをインポートできるように、アプリケーションを起動するモジュール内のトップレベルウィンドウへの参照を保持するために、次のようになります。また

from app_module import main_window 

# my_functions.py 
def fill_table(): 
    for row in range(10): 
     for col in range(10): 
      item_value = "...." 
      item = QtGui.QTableWidgetItem() 
      item.setText(str(item_value)) 
      main_window.table_widget.setItem(row, col, item) 

、あなたは彼らは1つのオブジェクトのみ(またはオブジェクトのクラス)で動作するように、すべての機能を再設計し、その後、明示的にインスタンスに渡すことができます。しかし

# my_functions.py 
def fill_table(table_widget): 
    ... 

、あなたがそれを行うどのような方法、それは難しい方法を確認しますこれはコードを構造化するための「最良の」方法である可能性があります。

ほとんどのGUIアプリケーションは、すべてを1つの機能ユニットにまとめる中央コントローラ/マネージャとともに、より多くの独立した機能を果たすいくつかの大きなサブコンポーネントで構成されています。サブコンポーネントは通常ウィジェットサブクラス(おそらく別々のモジュールにあります)であり、コントローラ/マネージャとしても機能するメインウィンドウの子になります。これらの行に沿ってコードを整理することは、Qtが動作するように設計されている方法に沿ったものであり、アプリケーションのさまざまな部分間の潜在的な通信問題の大部分を自動的に回避します。

関連する問題