Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 23, 2015 21:14:49

paulchertov
Зарегистрирован: 2014-06-17
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с дескрипторами

Почему при доступе к аттрибутам lt и gt объектов классов BothCheck и GtCheck не вызывается __get__?

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QVBoxLayout, QRadioButton, QGroupBox, QLineEdit, QCheckBox, QGridLayout, QLabel, QFrame, QPushButton
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIntValidator
from PyQt5.QtWidgets import QMainWindow
class LineDescriptor:
    def __init__(self, row=1, label=None):
        self.label = label
        self.row = row
        self.__name = None
    def __get__(self, instance, owner=None):
        print('get_called')
        if instance is None:
            print('is none')
            return self
        else:
            private_name = '_{0}__{1}'.format(type(instance).__name__,
                                              self.__name)
            check_name = '_{0}__{1}'.format(type(instance).__name__,
                                            self.__name)
            if getattr(instance, check_name).isChecked():
                return getattr(instance, private_name).text()
            else:
                return None
class CheckSelector(QGroupBox):
    def __init__(self, name):
        self.__dictionary = []
        super(CheckSelector, self).__init__()
        layout = QGridLayout()
        layout.setAlignment(Qt.AlignTop)
        name = QLabel(name)
        layout.addWidget(name, 0, 0, 1, 1)
        self.__check = QCheckBox()
        layout.addWidget(self.__check, 0, 1, 1, 1)
        self.setLayout(layout)
        for name, attribute in type(self).__dict__.items():
            if isinstance(attribute, LineDescriptor):
                row = attribute.row
                if attribute.label is not None:
                    label = QLabel(attribute.label)
                    self.layout().addWidget(label, row, 0, 1, 1)
                int_validator = QIntValidator()
                field = QLineEdit()
                field.setValidator(int_validator)
                layout.addWidget(field, row, 1, 1, 1)
                private_name = '_{0}__{1}'.format(type(self).__name__, name)
                setattr(attribute, '_LineDescriptor__name', name)
                setattr(self, name, attribute)
                setattr(self, private_name, field)
                print(attribute)
                print(attribute.__dict__)
class GtCheck(CheckSelector):
    gt = LineDescriptor(1, '>')
class BothCheck(CheckSelector):
    gt = LineDescriptor(1, '>')
    lt = LineDescriptor(2, '<')

Офлайн

#2 Янв. 24, 2015 01:57:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Проблема с дескрипторами

paulchertov
Почему при доступе к аттрибутам lt и gt объектов классов BothCheck и GtCheck не вызывается __get__?
А где там объекты классов создаются?



Офлайн

#3 Янв. 24, 2015 10:27:53

paulchertov
Зарегистрирован: 2014-06-17
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с дескрипторами

ну например так

app = QApplication(sys.argv)
win = QMainWindow()
wid = QFrame()
lay = QVBoxLayout()
test = BothCheck(name='слов')
lay.addWidget(test)
but = QPushButton()
but.clicked.connect(checker)
lay.addWidget(but)
wid.setLayout(lay)
win.setCentralWidget(wid)
win.show()
sys.exit(app.exec_())

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version