Найти - Пользователи
Полная версия: Как получить доступ к переменной суперкласса(класса-предка)
Начало » Python для новичков » Как получить доступ к переменной суперкласса(класса-предка)
1
andreykyz
Как получить доступ к переменной суперкласса(класса-предка) из класса потомка?

Теперь предыстория:
я сделал интерфейс в 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'
rokki
andreykyz
Как получить доступ к переменной суперкласса(класса-предка) из класса потомка?
ошибка:
    self.uchenie_obrazovanie = spin_box(Ui_Form.layoutWidget)
AttributeError: type object 'Ui_Form' has no attribute 'layoutWidget'
если spin_box создан в родительском классе, при его вызове в дочернем тоже надо ставить ‘self’

self.uchenie_obrazovanie = self.spin_box(Ui_Form.layoutWidget)
andreykyz
rokki
если spin_box создан в родительском классе, при его вызове в дочернем тоже надо ставить ‘self’

self.uchenie_obrazovanie = self.spin_box(Ui_Form.layoutWidget)
Ага, идею понял только не у спинбокса селф нужен а у 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)
теперь ещё ворос по коду. Если я хочу изменить один из методов( мне нужен setupUi(self, Form)) я делаю так:
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)
rokki
self.ui = gui_bio()
self.ui.setupUi()
при вызове метода не надо указывать ‘self’ в скобках.

посмотри здесь [здесь] про ООП и обращение к классам и методам
andreykyz
rokki
self.ui = gui_bio()
self.ui.setupUi()
при вызове метода не надо указывать ‘self’ в скобках.
вызывать надо именно с self т.к. нужно передавать ссылку на главный виджет вержнему виджету. Вот так выглядит метод потомка (см. второй аргумент метода setupUi):
class gui_bio(Ui_Form):
def setupUi(self, Form):
Ui_Form.setupUi(Form)
.....
Кто кодил на PyQT как переопределять методы????
andreykyz
Проблему(вроди) решил посмотрев исходники других программ:
class gui_bio(Ui_Form):
def setupUi(self, Form):
Ui_Form.setupUi(self, Form) <----нужен был self
.....
rokki, не подскажешь где можно по подробней, с примерами, почитать про наследование? на http://www.younglinux.info/ как-то не все понятно, больно примеры простые
rokki
думал как раз там и будет понятно,а примеры можно бы и самому усложнить.
к сожалению ничего кроме книжек и документации не посоветую.и еще чужие программы как примеры.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB