2017-01-03 1 views
0

나는 3 개 개의 파일이 있습니다 모든 GUI 물건 Qt는 디자이너에서 파이썬으로 전환 포함PySide에서 gui 클래스의 함수를 어떻게 분리합니까? 내 PySide 프로젝트에서

  • 하나를

  • 신호 모든 로직 및 기능과

    이있는 다른
  • 한 번 더 전체 응용 프로그램을 시작합니다.

논리와 함수를 분리하는 것이 더 좋습니다.

다음은 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이 두 번째 항목이라고 가정하면 채우기 기능은 모듈 글로벌 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의 다른 부분과 충돌한다는 것을 알 수 있습니다. 앱이 프로토 타이핑 단계를 통과하면 유지 관리 및 디버그하기가 쉽지 않습니다. 그래서 나는 두 번째 접근법을 추천한다.

+0

어떻게 참조하겠습니까, func1.py에서 tablewidget을 말할 수 있습니까? – GiannisIordanou

+0

게시물을 업데이트 한 것처럼 보이므로 내 답변을 업데이트하여 상황에 맞게 수정하십시오. – Schollii

+0

my_functions.py는 현재 내 목록의 두 번째 파일에있는 주 클래스에 포함 된 모든 함수를 포함하는 네 번째 파일입니다. – 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) 

을 다른 방법으로, 그들은 단지 하나의 객체 (또는 객체의 클래스)에서 작동하도록 모든 기능을 재 설계하고 명시 적으로 인스턴스에 전달할 수 : 그러나

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

, 당신이 그것을 할 어떤 방법이 어렵다 방식을 볼 수 있습니다 이것은 코드를 구조화하는 "최상의"방법 일 수 있습니다.

대부분의 GUI 응용 프로그램은 하나의 기능 단위로 모두 구성되는 중앙 컨트롤러/관리자와 함께 다소간 독립적으로 작동하는 몇 가지 큰 하위 구성 요소로 구성됩니다. 하위 구성 요소는 대개 하위 모듈로 구성되며 하위 모듈은 컨트롤러/관리자로 작동 할 수있는 하위 창의 하위 노드가됩니다. 이 라인을 따라 코드를 구성하는 것은 Qt가 작동하도록 설계된 방식에 훨씬 더 가깝고 응용 프로그램의 다양한 부분간에 발생할 수있는 대부분의 통신 문제를 자동으로 피할 수 있습니다.

관련 문제