我在一个主窗口中创建了一个按钮,单击该按钮将调出带有树小部件的搜索窗口,该树小部件包含来自MySql数据库的数据行。如果要通过.py文件自己打开搜索窗口,它将显示数据,但是当我通过编程的按钮打开搜索窗口时,则不会显示任何数据。这是运行主窗口并创建按钮功能以打开搜索窗口的程序的代码:
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]))
编辑:
最佳答案
这是您的基本小部件类
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__()
可以运行并执行所有这些操作。还要意识到,您需要将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()