2016-04-13 1 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_()) 

私は間違っていますか?なぜ私はそれを開くとデータを表示するのでしょうか?

編集:

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

編集:これは

Student search

+0

に必要なコンストラクタの引数を養うために、あなたのMainWindowを更新する必要がありますことを意味ウィンドウが表示されていますか? – danidee

+1

Student_Searchはどのように更新されていますか?私はmysqlデータベースから情報を引き出すコードは見当たりませんか? Ui_Student_searchとは何ですか? '__init__'メソッドで更新していますか? 'Student_search .__ init__'から' Ui_Student_search .__ init__'を呼び出していないからです。 –

+0

Ui_Student_searchは、StudentSearch.py​​ファイルで作成されたクラスです。私は質問に追加したStudent_search.py​​のテーブルに値を設定するUpdateTree()関数を作成しました。 – 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__()メソッドが実行され、データベースユーティリティが作成され、GUIが作成され、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__()を実行してすべて実行できるようにすることです。 Ui_Student_search.__init__メソッドには、databasetablename引数を渡す必要があることにも気付きます。

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) 

これはまた、あなたが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 __() __init __(自己、親)。なぜ私にこのエラーが出るのですか? Ui_StudentSearchでtableNameが見つかりませんか?私はどこにどのようなtableNameの質問のコードを置く。私はそれがなぜtableNameを使用したり見つけることができないのか分かりません。 – DDVlad

+0

コメントに欠けていることの1つは、署名も変更する必要があるということです。だから '(self、database、tableName、parent = None)'のようなものが両方のクラスで必要です。 OPsの例では、 'Student_search'のインスタンスを作成するときに、関連するパラメータが渡されないことにも注意してください。 – ekhumoro

+0

両方のクラスでそれらが必要であると言うとき、メインファイルのStudent_searchクラスと、私が呼んでいる他の.pyファイルのUi_Student_searchの両方を意味しますか?また、パラメータが渡されていないと言ってもどういう意味ですか?そして私はそれをどのように変えることができますか? – DDVlad

関連する問題