Форум сайта python.su
Как получить доступ к переменной суперкласса(класса-предка) из класса потомка?
Теперь предыстория:
я сделал интерфейс в QtDesigner, но меня не устроил стандартный QSpinBox я сделал свой и теперь пытаюсь наследовать то что выдал QtDesigner и вставить туда свой спинбокс. вот код:
from ui_bio import Ui_Form # Загружаем модуль интерфейса который нам выдал QtDesigner(без спинбоксов)
from spin_box import spin_box #здесь загружаем модуль со спинбоксом
class gui_bio(Ui_Form):
"""Класс с модифицированным интерфейсом(добавлены модифицированные спинбоксы)"""
def spinbox_load(self):
self.uchenie_obrazovanie = spin_box(Ui_Form.layoutWidget) <------ сдесь выдаёт ошибку
self.uchenie_obrazovanie.setObjectName("uchenie_obrazovanie")
self.Ui_Form.grid_center_top.addWidget(self.uchenie_obrazovanie, 1, 1, 1, 1)
self.uchelie_nauka = spin_box(Ui_Form.layoutWidget)
self.uchelie_nauka.setObjectName("uchelie_nauka")
self.Ui_Form.grid_center_top.addWidget(self.uchelie_nauka, 1, 2, 1, 1)
self.uchenie_prosveshenie = spin_box(Ui_Form.layoutWidget)
self.uchenie_prosveshenie.setObjectName("uchenie_prosveshenie")
self.Ui_Form.grid_center_top.addWidget(self.uchenie_prosveshenie, 1, 3, 1, 1)
self.uchenie_obrazovanie = spin_box(Ui_Form.layoutWidget)
AttributeError: type object 'Ui_Form' has no attribute 'layoutWidget'
Офлайн
andreykyzесли spin_box создан в родительском классе, при его вызове в дочернем тоже надо ставить ‘self’
Как получить доступ к переменной суперкласса(класса-предка) из класса потомка?
ошибка:self.uchenie_obrazovanie = spin_box(Ui_Form.layoutWidget)
AttributeError: type object 'Ui_Form' has no attribute 'layoutWidget'
self.uchenie_obrazovanie = self.spin_box(Ui_Form.layoutWidget)
Офлайн
rokkiАга, идею понял только не у спинбокса селф нужен а у layoutWidget. Вот так работает:
если spin_box создан в родительском классе, при его вызове в дочернем тоже надо ставить ‘self’self.uchenie_obrazovanie = self.spin_box(Ui_Form.layoutWidget)
from ui_bio import Ui_Form # Загружаем модуль интерфейса который нам выдал QtDesigner(без спинбоксов)
from spin_box import spin_box #здесь загружаем модуль со спинбоксом
class gui_bio(Ui_Form):
"""Класс с модифицированным интерфейсом(добавлены модифицированные спинбоксы)"""
def spinbox_load(self):
self.uchenie_obrazovanie = spin_box(self.layoutWidget) <-----Ui_Form заменил на self
self.uchenie_obrazovanie.setObjectName("uchenie_obrazovanie")
self.grid_center_top.addWidget(self.uchenie_obrazovanie, 1, 1, 1, 1) <------ Убрал Ui_Form
self.uchelie_nauka = spin_box(self.layoutWidget)
self.uchelie_nauka.setObjectName("uchelie_nauka")
self.grid_center_top.addWidget(self.uchelie_nauka, 1, 2, 1, 1)
self.uchenie_prosveshenie = spin_box(self.layoutWidget)
self.uchenie_prosveshenie.setObjectName("uchenie_prosveshenie")
self.grid_center_top.addWidget(self.uchenie_prosveshenie, 1, 3, 1, 1)
from ui_bio import Ui_Form
from spin_box import spin_box
class gui_bio(Ui_Form):
def setupUi(self, Form): <-------переопределяю уже существующий метод
Ui_Form.setupUi(Form) <----вызываю метод из суперкласса(сдесь происходит ошибка, код ошибки ниже)
self.uchenie_obrazovanie = spin_box(self.layoutWidget) <----потом дописываю недостающие элементы интерфейса
self.uchenie_obrazovanie.setObjectName("uchenie_obrazovanie")
self.grid_center_top.addWidget(self.uchenie_obrazovanie, 1, 1, 1, 1)
...
from PyQt4 import QtCore, QtGui
from gui_bio import gui_bio
import math
class StartQt(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = gui_bio() <----создаю экземпляр класса
self.ui.setupUi(self) <------ вызываю метод
....
......
Ui_Form.setupUi(Form)
TypeError: unbound method setupUi() must be called with Ui_Form instance as first argument (got StartQt instance instead)
Офлайн
self.ui = gui_bio()
self.ui.setupUi()
Офлайн
rokkiвызывать надо именно с self т.к. нужно передавать ссылку на главный виджет вержнему виджету. Вот так выглядит метод потомка (см. второй аргумент метода setupUi):при вызове метода не надо указывать ‘self’ в скобках.self.ui = gui_bio()
self.ui.setupUi()
class gui_bio(Ui_Form):
def setupUi(self, Form):
Ui_Form.setupUi(Form)
.....
Отредактировано (Май 8, 2010 10:58:55)
Офлайн
Проблему(вроди) решил посмотрев исходники других программ:
class gui_bio(Ui_Form):
def setupUi(self, Form):
Ui_Form.setupUi(self, Form) <----нужен был self
.....
Офлайн
думал как раз там и будет понятно,а примеры можно бы и самому усложнить.
к сожалению ничего кроме книжек и документации не посоветую.и еще чужие программы как примеры.
Офлайн