【问题标题】:oop instantiation pythonic practicesoop 实例化 pythonic 实践
【发布时间】:2009-08-21 05:03:37
【问题描述】:

我有下面的代码,我打算在同一个“导入”中创建几个类。我希望实例化每个类并使用我正在制作的小部件获得返回值。

这根本不是一个真正的 PyQt 问题,更像是一个“良好实践”问题,因为我将为每个小部件设置一个类。

我应该创建返回已创建小部件的函数吗?如果可以,应该怎么做?如果这是我所追求的最佳方法,我如何确保很难直接实例化该类?

我希望能够做类似 ....

tabs = wqTabWidget( ['firstTab', 'Second', 'Last Tab'] )

或(哪个是更好的做法)

tabs = wqInstance.createTabs( ['firstTab', 'Second', 'Last Tab'] )

到目前为止,这是我的课......

from PyQt4 import QtCore as qc
from PyQt4 import QtGui as qg

class wqTabWidget(qg.QTabWidget):
    def __init__(self, *args):

        apply(qg.QTabWidget.__init__,(self, ))
        tabList = []
        tabNames = args[0] 

        for name in tabNames:
            tabWidget = qg.QWidget()
            self.addTab(tabWidget,  name)
            tabList.append( { name:tabWidget } )

    print 'hi'


if __name__ == '__main__':
    app = qg.QApplication(sys.argv)
    window = wqTabWidget(['hi',  'there',  'and',  'stuff'])
    window.show()
    app.exec_()

【问题讨论】:

    标签: oop pyqt python


    【解决方案1】:

    如果选项卡列表可以在运行时更改,则答案将决定。如果此小部件确实只支持添加一组选项卡,但从不更改或添加新选项卡,则选项卡列表应该来自初始化程序。否则,您还应该添加一个方法来完成这项工作。考虑QLabel 小部件,它可以在初始化程序中和通过setText 方法设置标签的文本。

    其他代码思路提示。

    你的初始化器的参数有点混乱,因为你接受任意数量的参数,但只对第一个做一些事情,并期望它是一个字符串列表。清晰的论据列表很重要。

    您没有必要使用apply 来调用基类初始化程序。将代码更改为简单的qg.QTabWidget.__init__(self)

    在创建 PyQt 小部件时,我几乎总是更喜欢允许“父”参数,即使我知道该小部件将成为顶级小部件。这就是所有内置 Pyqt 方法的作用,并且感觉是一种很好的做法。

    我也看不出存储选项卡列表的原因,每个选项卡都是一个元素字典。我怀疑您不需要保留自己的选项卡和选项卡名称列表。 QTabWidget 可以回答有关内容的所有问题。

    如果我要根据自己的喜好修改此示例代码,它会如下所示。

    from PyQt4 import QtCore as qc
    from PyQt4 import QtGui as qg
    
    
    class wqTabWidget(qg.QTabWidget):
        def __init__(self, parent, tabNames):
            qg.QTabWidget.__init__(self, parent)
            self.createTabs(tabNames)
    
        def createTabs(tabNames):
            for name in tabNames:
                tabWidget = qg.QWidget()
                self.addTab(tabWidget,  name)
    
    
    if __name__ == '__main__':
        app = qg.QApplication(sys.argv)
        window = wqTabWidget(None, ['hi',  'there',  'and',  'stuff'])
        window.show()
        app.exec_()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多