LINUX.ORG.RU

Вызов функции из другого класса

 , , ,


1

1

Доброго времени. Есть два класса. Во втором классе вызываю функцию первого класса, которая использует переменные из других функций первого класса. Мне выдаёт ошибку что не видит таких переменных:

AttributeError: 'Ui_Dialog_cards' object has no attribute 'lol' 

Вот так вызываю в функции closeEvent во втором классе:

class second_window(QtGui.QWidget, Ui_Card_dialog):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.dialog_cards = Ui_Dialog_cards()
    def show_edit_window(self):
        self.show()
    def closeEvent(self, event):
        print "close"
        self.dialog_cards.test_print()

У тебя в __init__ не вызываются конструкторы QWidget и Ui_Card_dialog. Я бы ещё не стал называть классы как ты их назвал (и методы тоже — то верблюды, то '_'). Посмотри pep8.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Не очень понял про «У тебя в __init__ не вызываются конструкторы QWidget и Ui_Card_dialog» Можете привести пример или показать на моём коде как надо сделать?

wojaovlad ()
Ответ на: комментарий от wojaovlad
class second_window(QtGui.QWidget, Ui_Card_dialog):
    def __init__(self):
        # это вообще что?? У тебя нет такого класса в родителях
        QtGui.QMainWindow.__init__(self)
        # вот так надо
        QtGui.QWidget.__init__(self) 
        Ui_Card_dialog.__init__(self)
        # в третьем питоне, по-моему, можно тупо super().__init__() делать
        # вместо явного перечисления классов
        # я всех нюансов множественного наследования не помню, увы.
true_admin ★★★★★ ()
Ответ на: комментарий от wojaovlad
class second_window(QtGui.QWidget, Ui_Card_dialog):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        Ui_Card_dialog.__init__(self)
        QtGui.QMainWindow.__init__(self)

При наследовании класс получает все атрибуты и методы родительских классов (согласно MRO). Но поскольку ты переопределяешь __init__ в своем классе, он заменяет собой родительский инициализатор, и тот не вызывается. А в нем, скорее всего, как правило, определяются специфичные атрибуты инстансов класса. Поэтому экземпляры твоего класса не получают этих атрибутов, что и приводит к ошибке обращения к несуществующим атрибутам. Чтобы это поправить, нужно вызывать __init__ родительского класса ручками. И вообще-то для этого уже сто лет пользуются super, но раз ты предпочитаешь олдскул, как видно из кода, то и решение тебе я предлагаю такое же.

Virtuos86 ★★★★★ ()

А проблема собственно в том, что во втором классе у тебя такая же фигня с __init__.

ei-grad ★★★★★ ()
Ответ на: комментарий от true_admin

Вот попробовал сделать:

class second_window(QtGui.QWidget, Ui_Card_dialog, Ui_Dialog_cards):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        Ui_Card_dialog.__init__(self)
        Ui_Dialog_cards.__init__(self)
        self.setupUi(self)
        self.dialog_cards = Ui_Dialog_cards()
    def show_edit_window(self):
        self.show()
    def closeEvent(self, event):
        print "close"
        self.dialog_cards.test_print()

Ui_Dialog_cards - класс где мне надо вызвать функцию Ui_Card_dialog - класс второга окна

Сейчас тоже самое выводит( что не видит он переменную.

Traceback (most recent call last):
  File "/home/vlad/MEGAsync/own_programming/medilab/table_cards.py", line 166, in closeEvent
    self.dialog_cards.test_print()
  File "/home/vlad/MEGAsync/own_programming/medilab/table_cards.py", line 152, in test_print
    print self.lol
AttributeError: 'Ui_Dialog_cards' object has no attribute 'lol'

wojaovlad ()
Ответ на: комментарий от true_admin
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'table_cards.ui'
#
# Created: Sun Apr 12 21:42:36 2015
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

import os
import sys
import sqlite3 as db
from PyQt4 import QtCore, QtGui, QtSql
from PyQt4.QtCore import QStringList, QString
from PyQt4.QtGui  import QApplication, QMainWindow, QSizePolicy
from PyQt4.QtGui  import QTableWidget, QTableWidgetItem
import re
from edit_cards import Ui_Card_dialog
import config
id_number = config.id_number
db_filename = config.db_filename
lol = config.lol


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s


class Ui_Dialog_cards(object):
    def setupUi(self, Dialog_cards):
        global lol
        Dialog_cards.setObjectName(_fromUtf8("Dialog_cards"))
        Dialog_cards.resize(826, 518)
        self.gridLayout = QtGui.QGridLayout(Dialog_cards)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.tableWidget_cards = QtGui.QTableWidget(Dialog_cards)

        font = QtGui.QFont()
        font.setPointSize(12)
        self.tableWidget_cards.setFont(font)
        self.tableWidget_cards.setObjectName(_fromUtf8("tableWidget_cards"))
        self.tableWidget_cards.setColumnCount(0)
        self.tableWidget_cards.setRowCount(0)
        self.gridLayout.addWidget(self.tableWidget_cards, 0, 0, 1, 4)
        self.Change_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Change_Button.setFont(font)
        self.Change_Button.setObjectName(_fromUtf8("Change_Button"))
        self.gridLayout.addWidget(self.Change_Button, 2, 0, 1, 1)
        self.Delete_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Delete_Button.setFont(font)
        self.Delete_Button.setObjectName(_fromUtf8("Delete_Button"))
        self.gridLayout.addWidget(self.Delete_Button, 2, 2, 1, 1)
        self.Close_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Close_Button.setFont(font)
        self.Close_Button.setObjectName(_fromUtf8("Close_Button"))
        self.gridLayout.addWidget(self.Close_Button, 2, 3, 1, 1)
        self.Edit_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Edit_Button.setFont(font)
        self.Edit_Button.setObjectName(_fromUtf8("Edit_Button"))
        self.gridLayout.addWidget(self.Edit_Button, 2, 1, 1, 1)

        self.retranslateUi(Dialog_cards)
        QtCore.QMetaObject.connectSlotsByName(Dialog_cards)
        self.update()
#        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.app)
 #       QtCore.QObject.connect(self.Change_Button, QtCore.SIGNAL(_fromUtf8("clicked()")), self.edit)
        QtCore.QObject.connect(self.Delete_Button, QtCore.SIGNAL(_fromUtf8("clicked()")), self.delete)
        self.lol = 'oop0'
        self.test_print()

    def retranslateUi(self, Dialog_cards):
        self.edit_cards_show = second_window()
        Dialog_cards.setWindowTitle(QtGui.QApplication.translate("Dialog_cards", "Товары", None, QtGui.QApplication.UnicodeUTF8))
        self.Change_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Добавить товар", None, QtGui.QApplication.UnicodeUTF8))
        QtCore.QObject.connect(self.Change_Button, QtCore.SIGNAL('clicked()'), self.edit_cards_show.show_edit_window)
        self.Delete_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Удалить товар", None, QtGui.QApplication.UnicodeUTF8))
        self.Close_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Закрыть", None, QtGui.QApplication.UnicodeUTF8))
        self.Edit_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Редактировать", None, QtGui.QApplication.UnicodeUTF8))

#    @staticmethod
    def update(self):
        global db_filename
        self.tableWidget_cards.clear()
        self.tableWidget_cards.setColumnCount(6)
        self.tableWidget_cards.setRowCount(40)
        self.tableWidget_cards.setHorizontalHeaderLabels(
            [u'Производитель', u'Наименование', u'Ед. измерения', u'Ставка НДС', u'№РУ', u'Дата истечения'])
        print "Update run"
        conn = db.connect(db_filename)
        c = conn.cursor()
        db_is_new = not os.path.exists(db_filename)
        if db_is_new:
            print 'Need to create schema'
        else:
            print 'Database exists, assume schema does, too.'
        conn.execute(
            '''CREATE TABLE IF NOT EXISTS cards (id INTEGER PRIMARY KEY AUTOINCREMENT, manufacturer TEXT NOT NULL, name  TEXT NOT NULL, unit TEXT, nds TEXT NOT NULL, ru TEXT NOT NULL, date_end TEXT);''')
        print "Table created successfully";
        i = 0
        rowd = 0
        for row in c.execute("SELECT * FROM cards"):
            a = [row[5], row[2], row[4], row[6], row[1], row[3]]
            for i in range(6):
                name = unicode(a[i])
                self.tableWidget_cards.setItem(rowd, i, QtGui.QTableWidgetItem(name))
                i += 1
            rowd += 1
        conn.close()
        self.tableWidget_cards.resizeColumnsToContents()
        print "Update end"


    def delete(self):
        print "Delete RUN"
        global db_filename
        cell = self.getsamerowcell()
        print cell
        conn = db.connect(db_filename)
        c = conn.cursor()
        c.execute('DELETE FROM cards WHERE name=?', (cell,))
        conn.commit()
        conn.close
        self.update(self)
        print "Delete END"


    def getsamerowcell(self):
        matchcol = 0
        row = self.tableWidget_cards.currentItem().row()
        headercount = self.tableWidget_cards.columnCount()
        for x in range(0,headercount,1):
            headertext = self.tableWidget_cards.horizontalHeaderItem(x).text()
            if u'Наименование' == unicode(headertext):
                matchcol = x
                break
        cell = self.tableWidget_cards.item(row,matchcol).text()
        print unicode(cell)
        return unicode(cell)

    def test_print(self):
        print "lol, it's working!"
        print self.lol


class second_window(QtGui.QWidget, Ui_Card_dialog, Ui_Dialog_cards):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        Ui_Card_dialog.__init__(self)
        Ui_Dialog_cards.__init__(self)
        self.setupUi(self)
        self.dialog_cards = Ui_Dialog_cards()
    def show_edit_window(self):
        self.show()
    def closeEvent(self, event):
        print "close"
        self.dialog_cards.test_print()




if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ex = Ui_Dialog_cards()
    ex.setupUi(Form)
    Form.show()
    app.exec_()
wojaovlad ()
Ответ на: комментарий от true_admin

Откуда мне знать, зачем он там?) Я добавил то, что нужно, а рефакторингом пусть сам занимается.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от wojaovlad

ОМГ. Не, это так не работает. Тебе нужно сделать как минимум так:

В Ui_Dialog_cards.setupUi:
  global lol
  self.lol = lol

Но. Тут в коде очень много проблем. У тебя спагетти-код и, я подозреваю, second_window.dialog_cards.setupUi не вызывается.

Короче, реально рекомендую начать с pep8! Плюс юзай программы pyflakes и pep8 для проверки кода, удивишься как много проблем они у тебя найдут. Пожалуйста, используй их.

true_admin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.