2016-04-13 3 views
0

Я создал кнопку в главном окне, которая при нажатии вызывает окно поиска с виджетами дерева, содержащим строки данных из базы данных MySql. Если я открою окно поиска через .py-файл самостоятельно, он отобразит данные, но когда я открою его через запрограммированную кнопку, данные не будут показаны. Это код программы, который запускает основное окно и создает функцию кнопки, чтобы открыть окно поиска:Данные не отображаются в pyqt UI

from PyQt4 import QtGui 
from MainMenu import Ui_MainWindow 
from StudentSearch import Ui_Student_search 
import DB_manager_students 

class MainWindow(Ui_MainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 
     self.pushButton_3.clicked.connect(self.handleButton) 
     self.window2 = None 

    def handleButton(self): 
     if self.window2 is None: 
      self.window2 = Student_search() 
      self.window2.show() 

class Student_search(Ui_Student_search): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

Что я делаю неправильно? И почему он отображает данные, если я открою его сам по себе, но не тогда, когда я его открою так?

Edit:

От Student_search.py ​​

class Ui_Student_search(QtGui.QWidget): 
    def __init__(self, database, tableName): 
     QtGui.QWidget.__init__(self) 
     self.dbu = DB_manager_students.DatabaseUtility(database, tableName) 
     self.setupUi(self) 
     self.UpdateTree() 

(...) 

def UpdateTree(self): 
    col = self.dbu.GetColumns() 
    table = self.dbu.GetTable() 

    for c in range(len(col)): 
     self.StudentTreeWidget.headerItem().setText(c, col[c][0]) 

    self.StudentTreeWidget.clear() 

    for item in range(len(table)): 
     QtGui.QTreeWidgetItem(self.StudentTreeWidget) 
     for value in range(len(table[item])): 
      self.StudentTreeWidget.topLevelItem(item).setText(value, str(table[item][value])) 

Edit:

Student search

+0

делает окно отображается? – danidee

+1

Как обновляется Student_Search? Я не вижу никакого кода, который выводит информацию из базы данных mysql? Что такое Ui_Student_search? Вы делаете обновление в методе '__init__'? Поскольку вы не вызываете 'Ui_Student_search .__ init__' из' Student_search .__ init__' –

+0

Ui_Student_search - это класс, созданный в файле StudentSearch.py. Я создал функцию UpdateTree(), которая заполнит таблицу в Student_search.py, которую я добавил в вопрос. – DDVlad

ответ

1

Это ваш базовый класс виджета

class Ui_Student_search(QtGui.QWidget): 
    def __init__(self, database, tableName): 
     QtGui.QWidget.__init__(self) 
     self.dbu = DB_manager_students.DatabaseUtility(database, tableName) 
     self.setupUi(self) 
     self.UpdateTree() 

Когда вы создаете экземпляр Ui_Student_search(), запускается метод Ui_Student_search.__init__(), который создает служебную программу базы данных, создает графический интерфейс и запускает UpdateTree().

Теперь вы создаете новый класс - Student_search - который наследуется от класса Ui_Student_search

class Student_search(Ui_Student_search): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

Но когда этот класс конкретизируется и Student_search.__init__() запускается, он делает только половину того, что было Ui_Student_search.__init__() делает. Он не создает менеджера баз данных или не обновляет дерево.

Что вы должны делать, это вызвать метод родительского класса __init__, чтобы Ui_Student_search.__init__() мог запускать и выполнять все эти действия. Также поймите, что вам необходимо передать database и tablename аргументам в метод Ui_Student_search.__init__.

class Student_search(Ui_Student_search): 

    def __init__(self, database, tablename, parent=None): 
     Ui_Student_search.__init__(self, parent, database, tablename) 

Python имеет еще более простой синтаксис для вызова методов в базовом родительском классе.

class Student_search(Ui_Student_search): 

    def __init__(self, database, tablename, parent=None): 
     super(Student_search, self).__init__(parent, database, tablename) 

Это также означает, что вам необходимо обновить MainWindow кормить необходимые аргументы, чтобы застройщик Student_search

def handleButton(self): 
    if self.window2 is None: 
     database = '???' 
     tablename = 'xxx' 
     self.window2 = Student_search(database, tablename, parent=self) 
     self.window2.show() 
+0

Я попытался использовать оба метода, однако, когда я нажимаю на кнопку, появляется ошибка TypeError: __init __() отсутствует 1 обязательный позиционный аргумент: 'tableName' в super (Student_search, self) .__ init __ (parent) или Ui_Student_search. __init __ (self, parent). Почему это дает мне эту ошибку? Может ли он не найти имя таблицы в Ui_StudentSearch? Я помещаю код для того, где и что имя таблицы в вопросе. Я не понимаю, почему он не может использовать или находить имя таблицы. – DDVlad

+0

Одна вещь, которая была пропущена в комментариях, заключается в том, что подписи также необходимо изменить. Поэтому для обоих классов требуется нечто вроде '(self, database, tableName, parent = None)'. Также обратите внимание, что в примере OPs соответствующие параметры не передаются при создании экземпляра 'Student_search'. – ekhumoro

+0

Говоря, что они требуются для обоих классов, вы имеете в виду как класс Student_search в основном файле, так и Ui_Student_search в другом .py-файле, который я вызываю? Кроме того, что вы имеете в виду, когда говорите, что параметры не передаются? И как мне это изменить? – DDVlad