如何在PySide中将函数与gui类分开?

时间:2017-01-03 17:19:07

标签: python user-interface pyqt pyside

在我的PySide项目中,我有3个文件:

  • 包含从Qt Designer转换为python的所有gui内容的文件,

  • 另一个具有信号,所有逻辑和功能以及

  • 启动整个应用程序。

我认为最好将逻辑与功能分开。

以下是在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)

我的主要问题是如何在单独的模块中引用应用程序中的小部件。

2 个答案:

答案 0 :(得分:0)

假设my_functions.py是文件列表中的第二项,则看起来fill函数使用模块全局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的其余部分发生冲突,并且一旦你的应用程序通过原型设计阶段就不那么容易维护和调试了。所以我建议采用第二种方法。

答案 1 :(得分:0)

典型Qt应用程序中的对象在父/子关系中连接在一起。通常,有一个顶级主窗口作为根对象,所有其他对象(窗口小部件,布局等)排列在它下面的层次结构中。

鉴于此,将所有与gui相关的程序逻辑放在主窗口类中是很自然的,因为所有其他对象都可以通过self访问。但是如果将所有与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的工作方式,并将自动避免应用程序各个部分之间的大多数潜在通信问题。