Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 避免垃圾收集的PyQt程序结构_Python_Oop_Pyqt_Pep - Fatal编程技术网

Python 避免垃圾收集的PyQt程序结构

Python 避免垃圾收集的PyQt程序结构,python,oop,pyqt,pep,Python,Oop,Pyqt,Pep,我有一个相当大的项目。我有一个主应用程序类Pierre,它包含程序的所有其他主要功能,并从其他脚本导入函数和类 我现在的主要问题是,我有一个小部件,分为两类,从主应用程序内部启动。启动实用程序窗口的按钮工作正常,但是实用程序中的按钮大约有50%的时间工作 以下是代码结构: 在pierre.py中: from src.capsuleswindow import Ui_Capsules from src import capsulecalc class Pierre(Ui_PierreMainWi

我有一个相当大的项目。我有一个主应用程序类Pierre,它包含程序的所有其他主要功能,并从其他脚本导入函数和类

我现在的主要问题是,我有一个小部件,分为两类,从主应用程序内部启动。启动实用程序窗口的按钮工作正常,但是实用程序中的按钮大约有50%的时间工作

以下是代码结构:

在pierre.py中:

from src.capsuleswindow import Ui_Capsules
from src import capsulecalc

class Pierre(Ui_PierreMainWindow):
    def __init__(self):
        super(Pierre, self).__init__()
        ...
        # additional initialization
        ...
        self.capsule.clicked.connect(self.open_capsules_utility)

     ...
     # additional functions of main program
     ...
    def open_capsules_utility(self):
        self.capsules_utility = CapsulesWindow()


class CapsulesWindow(QWidget):

    def __init__(self):
        super(CapsulesWindow, self).__init__()
        self.capsuleswindow = Ui_Capsules()
        self.capsuleswindow.setupUi(self)
        self.capsuleswindow.capsuleSize.setDisabled(True)
        capsule = capsulecalc.CapsuleFormula(self.capsuleswindow)
        self.capsuleswindow.calculate.clicked.connect(capsule.
                                                     validate_fields)
        self.show()
在capsulecalc.py中:

class CapsuleFormula:
     def __init__(self, capsules_window):
          self.capsules_window = capsules_window
          ...
          # additional initialization
          ...

     def validate_fields(self):
         # validation of user input text fields
         # this function is connected in pierre.py to its button
         # but only works half the time
这种从脚本调用另一个类以防止主脚本过于庞大的结构本身似乎很笨拙。根据我的其他研究,这似乎会导致垃圾收集器破坏对按钮的引用


这应该如何构造以防止垃圾收集,同时保持此程序的源代码整洁可读?

更改
capsule=capsulecalc.CapsuleFormula(self.capsuleWindow)self.capsuleWindow.calculate.clicked.connect(capsule.validate\u字段)
to
self.capsule=capsulecalc.CapsuleFormula(self.capsuleWindow)self.capsuleWindow.calculate.clicked.connect(self.capsule.validate_字段)
也就是说,类中有一个capsule成员分解类和模块(与函数和方法相反)纯粹以尺寸为依据似乎是武断和错误的。代码应该划分为有意义的单元(在应用程序的上下文中)。对于一个类或模块有多少行代码“太多”,许多程序员有强烈的意见。但并没有一个神奇的数字可以定义“可读性”的阈值(无论您选择如何定义它)。我的建议是让您的测试套件决定有意义的单元是什么,而忘记计算代码行数。