Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 22, 2014 15:10:59

Cheryrg
Зарегистрирован: 2014-10-21
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование класса

Добрый день!

Возникла такая проблема. Есть авторизации:

#-*-coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, QtSql
import sys
import kinterbasdb
########################################################################### Окно авторизации
class LoginWindow(QtGui.QWidget):
    def __init__(self, parent = None):
        super(LoginWindow, self).__init__()
        QtGui.QWidget.__init__(self, parent)
        self.setWindowTitle('logwind')
        
        self.lineEditName = QtGui.QLineEdit()
        self.lineEditDbase = QtGui.QLineEdit()
        self.lineEditPass = QtGui.QLineEdit()
        self.lineEditIp = QtGui.QLineEdit()
        self.lineEditPass.setEchoMode(2)  
        self.buttonOk = QtGui.QPushButton("Ok")              
        self.hbox = QtGui.QHBoxLayout()
        self.hbox.addWidget(self.buttonOk)
        self.form =QtGui.QFormLayout()
        self.form.addRow("Login:", self.lineEditName)
        self.form.addRow("Pass:", self.lineEditPass)
        self.form.addRow("BD:", self.lineEditDbase)
        self.form.addRow("Ip:", self.lineEditIp)
        self.form.addRow(self.hbox)
        self.setLayout(self.form)
        self.lineEditPass.setFocus()
#Подтверждения ввода идентификационных данных.
        self.buttonOk.clicked.connect(self.on_Ok)
    def on_Ok(self):
        
        BDUSER = "sysdba"
        #str(self.lineEditName. text())
        BDPASSWORD = "*****"
        #str(self.lineEditPass. text())        
        host = "192.168.1.88:E:\BD\BD1.FDB"
        
#Подключение к БД и проверка
        try:
            con = kinterbasdb.connect(dsn=host,user=BDUSER,password=BDPASSWORD)
            cu = con.cursor()
        except kinterbasdb.DatabaseError:
            print "connect is not Ok!"    
        else:
            self.hide()
            self.window = MainWindow()
            self.window.show()


Есть главное окно:


########################################################################### Главное окно
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("mainwind")
        self.resize(1550, 850)
        self.windowMenu()        
    def windowMenu(self):
        ButNew = QtGui.QAction('New', self)
        self.connect(ButNew, QtCore.SIGNAL('triggered()'), (self.on_new))
        ButOpen = QtGui.QAction('Open', self)
        self.connect(ButOpen, QtCore.SIGNAL('triggered()'), (self.on_open))
      
        menubar = self.menuBar()
        PersMenu = menubar.addMenu('Personal')
        PersMenu.addAction(ButNew)
        PersMenu.addAction(ButOpen)
        
        
        
    def on_new(self):
        win = WindowNew(self)
        win.show()
        print cu
        
    def on_open(self):
          win = WindowOpen(self)
          win.show()




Как передать cu главному окну и далее в дочернии классы? Про метод super прочитал уже все что мог, но не работает.

Отредактировано Cheryrg (Ноя. 22, 2014 15:12:37)

Офлайн

#2 Ноя. 22, 2014 16:57:11

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Наследование класса

Cheryrg
Как передать cu главному окну и далее
вам надо в mainwindow вставить LoginWindow?

        super(LoginWindow, self).__init__()
        QtGui.QWidget.__init__(self, parent)
эти строки - одно и тоже
наверное

Отредактировано vrabey (Ноя. 22, 2014 17:01:52)

Офлайн

#3 Ноя. 23, 2014 18:48:18

Cheryrg
Зарегистрирован: 2014-10-21
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование класса

Нет, нужно что бы class MainWindow наследовал все переменные класса LoginWindow. В частности курсор. Сей час при обращении к курсору из MainWindow, пишет что это неизвестная переменная.

Офлайн

#4 Ноя. 23, 2014 21:53:27

Cheryrg
Зарегистрирован: 2014-10-21
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование класса

Или хотя бы как передать переменную из класса в класс. 3й день уже не могу из за этого двинутся дальше

Офлайн

#5 Ноя. 23, 2014 23:07:39

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Наследование класса

# -*- coding: utf-8 -*-
class A(object):
    def __init__(self):
        self.x = 'I\'m "x"'
    def foo(self, arg):
        y = arg # локальная переменная, за пределами foo не видна, как и ваша cu
        self.z = arg # а эта будет видна, ибо привязана к self
class B(A):
    def __init__(self):
        super(B, self).__init__()
        print self.x
    def foo2(self):
        self.foo('argument')
        print self.z
        print y # ошибка, хз что за y
    
b = B()
b.foo2()

Офлайн

#6 Ноя. 23, 2014 23:59:05

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

Наследование класса

Cheryrg
Нет, нужно что бы class MainWindow наследовал все переменные класса LoginWindow.

Вообще, это делается через наследование.

>>> class A:
...     i = 1
... 
>>> class B:
...     j = 2
... 
>>> class C(A, B):
...     k = 3
... 
>>> c = C()
>>> c.i, c.j, c.k
(1, 2, 3)
>>>

Но на первый взгляд, в данном случае это не является необходимым. По идее, должно быть главное окно, а к нему прилеплено окно авторизации. Мало ли какие там окна будут появляться ещё, они не должны заполнять главное окно своими внутренностями.

Cheryrg
Или хотя бы как передать переменную из класса в класс.
Если нужно передавать внутреннюю переменную, нужно сделать соответствующие методы.
А вообще, для этого существует понятие “свойство”. Это как бы методы, только упрощённые до переменной.

К главному окну прилепляется окно авторизации, а у окна авторизации есть свойство, которое можно читать/писать.



Отредактировано py.user.next (Ноя. 24, 2014 00:00:01)

Офлайн

#7 Ноя. 24, 2014 11:48:19

Cheryrg
Зарегистрирован: 2014-10-21
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование класса

Спасибо. Хотелось все таки через наследование сделать. То есть в моем случае должно быть:

   def on_Ok(self):
        
        BDUSER = "sysdba"
        #str(self.lineEditName. text())
        BDPASSWORD = "*****"
        #str(self.lineEditPass. text())        
        host = "192.168.1.88:E:\BD\BD1.FDB"
        
#Подключение к БД и проверка
        try:
            con = kinterbasdb.connect(dsn=host,user=BDUSER,password=BDPASSWORD)
            self.cu = con.cursor()


И
class MainWindow(QtGui.QMainWindow, LoginWindow):
    def __init__(self, parent=None):
        
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("mainwind")
        self.resize(1550, 850)
        self.windowMenu()      

Где можно больше прочитать про super(, self).__init__() и про @property (желательно с примерами)? В учебниках довольно скупо про это написано.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version