ой инстанцирование питонических практик - PullRequest
1 голос
/ 21 августа 2009

У меня есть код ниже, и я планировал создать несколько классов в одном «импорте». Я надеялся создать экземпляр каждого класса и получить возвращаемое значение с виджетами, которые я делаю.

Это на самом деле не вопрос 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_()

1 Ответ

4 голосов
/ 21 августа 2009

Ответ будет решен, если список вкладок можно изменить во время выполнения. Если этот виджет действительно поддерживает только добавление набора вкладок, но не изменение или добавление новых, список вкладок должен исходить из инициализатора. В противном случае вы также должны добавить метод для выполнения этой работы. Рассмотрим виджет 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_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...