2016-04-13 9 views
0

Ich habe eine Schaltfläche in einem Hauptfenster erstellt, die beim Klicken ein Suchfenster mit einem Baum-Widget mit Datenzeilen aus einer MySql-Datenbank öffnet. Wenn ich das Suchfenster über die .py-Datei selbst öffnen würde, zeigt es die Daten an, aber wenn ich es über die Schaltfläche, die ich programmiert habe, öffne, werden keine Daten angezeigt. Dies ist der Code für das Programm, das das Hauptfenster läuft und erstellt eine Schaltfläche Funktion das Suchfenster zu öffnen:Daten werden nicht in pyqt UI angezeigt

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_()) 

Was mache ich falsch? Und warum wird es die Daten anzeigen, wenn ich es selbst öffne, aber nicht, wenn ich es so öffne?

Edit:

Von 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

tut das Fenster zeigen bis zu füttern? – danidee

+1

Wie wird Student_Search aktualisiert? Ich sehe keinen Code, der Informationen aus einer MySQL-Datenbank abrufen würde? Was ist Ui_Student_search? Machst du das Update in der '__init__' Methode? Weil Sie nicht 'Ui_Student_search .__ init__' von' Student_search .__ init__' aufrufen –

+0

Ui_Student_search ist die Klasse, die in der Datei StudentSearch.py ​​erstellt wurde. Ich habe eine UpdateTree() - Funktion erstellt, die die Tabelle in Student_search.py, die ich der Frage hinzugefügt habe, auffüllt. – DDVlad

Antwort

1

Dies ist Ihre Basis-Widget-Klasse

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() 

Wenn Sie Ui_Student_search() instanziieren, wird die Ui_Student_search.__init__()-Methode ausgeführt, die ein Datenbank-Dienstprogramm erstellt, die GUI erstellt und UpdateTree() ausführt.

nun eine neue Klasse erstellen - Student_search -, die von der Ui_Student_search Klasse erbt

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

Aber wenn diese Klasse instanziiert und Student_search.__init__() ausgeführt wird, tut es nur die Hälfte der Dinge, die Ui_Student_search.__init__() war tun. Es erstellt den Datenbankmanager nicht oder aktualisiert die Struktur nicht.

Was Sie tun sollten, ruft die Elternklasse __init__ Methode, so dass Ui_Student_search.__init__() kann ausgeführt werden und all diese Dinge tun. Beachten Sie auch, dass Sie die Argumente database und tablename an die Methode Ui_Student_search.__init__ übergeben müssen.

Python hat eine noch einfachere Syntax zum Aufrufen von Methoden auf der Basisparentklasse.

class Student_search(Ui_Student_search): 

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

Dies bedeutet auch, dass Sie Ihre MainWindow zu aktualisieren brauchen die notwendigen contructor Argumente 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

Ich habe versucht, beide Methoden zu verwenden, aber wenn ich auf die Schaltfläche klicke, zeigt es den Fehler TypeError: __init __() fehlende 1 Positions Argument: 'Tabellenname' bei Super (Student_search, selbst) .__ Init __ (Eltern) oder Ui_Student_search. __init __ (Selbst, Eltern). Warum gibt es mir diesen Fehler? Kann es tabellenname in Ui_StudentSearch nicht finden? Ich lege den Code wo und was tabellenname in der Frage ist. Ich verstehe nicht, warum tabellenname nicht verwendet oder gefunden werden kann. – DDVlad

+0

Eine Sache, die in den Kommentaren verpasst wurde, ist, dass die Signaturen ebenfalls geändert werden müssen. So etwas wie '(self, database, tableName, parent = None)' ist für beide Klassen erforderlich. Beachten Sie auch, dass im OP-Beispiel die relevanten Parameter beim Anlegen der Instanz von 'Student_search' nicht übergeben werden. – ekhumoro

+0

Wenn Sie sagen, dass sie für beide Klassen erforderlich sind, meinen Sie sowohl die Klasse Student_search in der Hauptdatei als auch Ui_Student_search in der anderen .py-Datei, die ich anrufe? Was meinst du auch, wenn du sagst, dass die Parameter nicht übergeben werden? Und wie könnte ich das ändern? – DDVlad