Ant*_*040 3 python class function pyqt
更新3:
这是新的代码,尝试做你告诉我的事情,没有结果......我开始认为我在我的程序中做过一些非常愚蠢的事情......有什么新想法吗?
program.py:
# -*- coding: utf-8 -*-
#imports:
import os
import platform
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import newchilddlg
from newchilddlg import *
#version:
__version__ = "1.0.0"
#Lists:
am = []
courtdate = []
board_number = []
namesurname = []
fathersname = []
mothersname = []
birthday = []
placeofbirth = []
nationality = []
address = []
tel = []
job = []
praxis = []
dayofdoing = []
placeofdoing = []
children = [am, courtdate, board_number, namesurname, fathersname, mothersname, birthday, placeofbirth, nationality, address, tel, job, praxis, dayofdoing, placeofdoing]
#Main Window Class:
class MainWindow(QMainWindow):
#__init__ function:
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
#Window size:
self.resize(800,600)
self.centralwidget = QtGui.QWidget(self)
self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
#Table Widget:
self.tableWidget = QtGui.QTableWidget(self.centralwidget)
self.vBar = self.tableWidget.verticalScrollBar()
self._vBar_lastVal = self.vBar.value()
self.horizontalLayout.addWidget(self.tableWidget)
self.vBar.valueChanged.connect(self.scrollbarChanged)
self.tableWidget.setGridStyle(QtCore.Qt.SolidLine)
self.tableWidget.setRowCount(100)
self.tableWidget.setColumnCount(15)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(10, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(11, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(12, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(13, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(14, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(140)
self.tableWidget.horizontalHeader().setHighlightSections(True)
self.tableWidget.horizontalHeader().setStretchLastSection(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(30)
self.tableWidget.verticalHeader().setStretchLastSection(False)
self.horizontalLayout.addWidget(self.tableWidget)
self.setCentralWidget(self.centralwidget)
#Window Title:
self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.tableWidget.setSortingEnabled(False)
#Collumns'names:
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(QtGui.QApplication.translate("MainWindow", "?.?.", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(QtGui.QApplication.translate("MainWindow", "?????????? ?????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(QtGui.QApplication.translate("MainWindow", "??????? ????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(QtGui.QApplication.translate("MainWindow", "?????????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(QtGui.QApplication.translate("MainWindow", "????? ??????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(QtGui.QApplication.translate("MainWindow", "????? ??????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(QtGui.QApplication.translate("MainWindow", "?????????? ????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(QtGui.QApplication.translate("MainWindow", "????? ????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(QtGui.QApplication.translate("MainWindow", "??????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(QtGui.QApplication.translate("MainWindow", "????????? ?????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(10)
item.setText(QtGui.QApplication.translate("MainWindow", "????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(11)
item.setText(QtGui.QApplication.translate("MainWindow", "?????????-????????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(12)
item.setText(QtGui.QApplication.translate("MainWindow", "?????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(13)
item.setText(QtGui.QApplication.translate("MainWindow", "?????????? ???????", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(14)
item.setText(QtGui.QApplication.translate("MainWindow", "????? ???????", None, QtGui.QApplication.UnicodeUTF8))
#menubar:
self.menubar = QtGui.QMenuBar(self)
self.menubar.setEnabled(True)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menuFile = self.menubar.addMenu("&File")
self.menuFile.setSizeIncrement(QtCore.QSize(0, 0))
self.menuEdit = self.menubar.addMenu("&Edit")
self.setMenuBar(self.menubar)
self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
self.menuEdit.setTitle(QtGui.QApplication.translate("MainWindow", "Edit", None, QtGui.QApplication.UnicodeUTF8))
#Creating Action filenewchild:
self.filenewchild = self.createAction("&???????? ????????", self.doupdate, "Ctrl+C", "" ,"???????? ???????? ????????")
self.menuFile.addAction(self.filenewchild)
self.filenewchild.setText(QtGui.QApplication.translate("MainWindow", "???????? ????????", None, QtGui.QApplication.UnicodeUTF8))
#Adding objects from lists to the Table Widget:
r=0
c=0
for x in children:
for i in x:
newItem = QtGui.QTableWidgetItem(i)
self.tableWidget.setItem(r, c, newItem)
r += 1
r = 0
c += 1
# Growing rows while scrolling down....
def scrollbarChanged(self, val):
bar = self.vBar
minVal, maxVal = bar.minimum(), bar.maximum()
avg = (minVal+maxVal)/2
rowCount = self.tableWidget.rowCount()
if val > self._vBar_lastVal and val >= avg:
self.tableWidget.insertRow(rowCount)
elif val < self._vBar_lastVal:
lastRow = rowCount-30
empty = True
for col in xrange(self.tableWidget.columnCount()):
item = self.tableWidget.item(lastRow, col)
if item and item.text():
empty=False
break
if empty:
self.tableWidget.removeRow(lastRow)
self._vBar_lastVal = val
#A function to help us create Actions faster:
def createAction(self,text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False, signal="triggered()"):
action = QAction(text, self)
if icon is not None:
action.setIcon(QIcon(":/%s.png" % icon))
if shortcut is not None:
action.setShortcut(shortcut)
if tip is not None:
action.setToolTip(tip)
if slot is not None:
self.connect(action, SIGNAL(signal), slot)
if checkable:
action.setCheckable(True)
return action
#A function that updates the table:
def updatetable(self):
self.tableWidget.clear()
r=0
c=0
for x in children:
for i in x:
newItem = QtGui.QTableWidgetItem(i)
self.tableWidget.setItem(r, c, newItem)
r += 1
r = 0
c += 1
#Handles NewChildDlg actions:
def doupdate(self):
newchilddlg.main()
d = NewChildDlg(self)
if d.accept():
text = NewChildDlg.text()
am.append(text)
self.updatetable()
#Main loop:
if __name__ == '__main__':
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
newchilddlg.py:
# -*- coding: utf-8 -*-
#imports:
from PyQt4 import QtCore, QtGui
import sys
from PyKDE4.kdeui import KDateComboBox
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import program
from program import *
#NewChildDialog Class:
class NewChildDlg(QDialog):
#__init__ function:
def __init__(self, parent=None):
super(NewChildDlg, self).__init__(parent)
self.resize(400, 600)
self.lineEdit = QtGui.QLineEdit(self)
self.lineEdit.setGeometry(QtCore.QRect(160, 20, 211, 23))
self.lineEdit.editingFinished.connect(self.amlist)
self.kdatecombobox = KDateComboBox(self)
self.kdatecombobox.setGeometry(QtCore.QRect(160, 50, 211, 23))
self.lineEdit2 = QtGui.QLineEdit(self)
self.lineEdit2.setGeometry(QtCore.QRect(160, 80, 211, 23))
self.lineEdit3 = QtGui.QLineEdit(self)
self.lineEdit3.setGeometry(QtCore.QRect(160, 110, 211, 23))
self.lineEdit4 = QtGui.QLineEdit(self)
self.lineEdit4.setGeometry(QtCore.QRect(160, 140, 211, 23))
self.lineEdit5 = QtGui.QLineEdit(self)
self.lineEdit5.setGeometry(QtCore.QRect(160, 170, 211, 23))
self.kdatecombobox2 = KDateComboBox(self)
self.kdatecombobox2.setGeometry(QtCore.QRect(160, 200, 211, 23))
self.lineEdit6 = QtGui.QLineEdit(self)
self.lineEdit6.setGeometry(QtCore.QRect(160, 230, 211, 23))
self.lineEdit7 = QtGui.QLineEdit(self)
self.lineEdit7.setGeometry(QtCore.QRect(160, 260, 211, 23))
self.lineEdit8 = QtGui.QLineEdit(self)
self.lineEdit8.setGeometry(QtCore.QRect(160, 290, 211, 23))
self.lineEdit9 = QtGui.QLineEdit(self)
self.lineEdit9.setGeometry(QtCore.QRect(160, 320, 211, 23))
self.lineEdit10 = QtGui.QLineEdit(self)
self.lineEdit10.setGeometry(QtCore.QRect(160, 350, 211, 23))
self.lineEdit11 = QtGui.QLineEdit(self)
self.lineEdit11.setGeometry(QtCore.QRect(160, 380, 211, 23))
self.kdatecombobox3 = KDateComboBox(self)
self.kdatecombobox3.setGeometry(QtCore.QRect(160, 410, 211, 23))
self.lineEdit12 = QtGui.QLineEdit(self)
self.lineEdit12.setGeometry(QtCore.QRect(160, 440, 211, 23))
self.pushButton = QtGui.QPushButton(self)
self.pushButton.setGeometry(QtCore.QRect(90, 530, 211, 40))
self.pushButton.clicked.connect(self.addtolists)
self.label = QtGui.QLabel(self)
self.label.setGeometry(QtCore.QRect(20, 20, 211, 23))
self.label2 = QtGui.QLabel(self)
self.label2.setGeometry(QtCore.QRect(20, 50, 211, 23))
self.label3 = QtGui.QLabel(self)
self.label3.setGeometry(QtCore.QRect(20, 80, 211, 23))
self.label4 = QtGui.QLabel(self)
self.label4.setGeometry(QtCore.QRect(20, 110, 211, 23))
self.label5 = QtGui.QLabel(self)
self.label5.setGeometry(QtCore.QRect(20, 140, 211, 23))
self.label6 = QtGui.QLabel(self)
self.label6.setGeometry(QtCore.QRect(20, 170, 211, 23))
self.label7 = QtGui.QLabel(self)
self.label7.setGeometry(QtCore.QRect(20, 200, 211, 23))
self.label8 = QtGui.QLabel(self)
self.label8.setGeometry(QtCore.QRect(20, 230, 211, 23))
self.label9 = QtGui.QLabel(self)
self.label9.setGeometry(QtCore.QRect(20, 260, 211, 23))
self.label10 = QtGui.QLabel(self)
self.label10.setGeometry(QtCore.QRect(20, 290, 211, 23))
self.label11 = QtGui.QLabel(self)
self.label11.setGeometry(QtCore.QRect(20, 320, 211, 23))
self.label12 = QtGui.QLabel(self)
self.label12.setGeometry(QtCore.QRect(20, 350, 211, 23))
self.label13 = QtGui.QLabel(self)
self.label13.setGeometry(QtCore.QRect(20, 380, 211, 23))
self.label14 = QtGui.QLabel(self)
self.label14.setGeometry(QtCore.QRect(20, 410, 211, 23))
self.label15 = QtGui.QLabel(self)
self.label15.setGeometry(QtCore.QRect(20, 440, 211, 23))
self.setWindowTitle(QtGui.QApplication.translate("Form", "???????? ????????", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("Form", "?.?.:", None, QtGui.QApplication.UnicodeUTF8))
self.label2.setText(QtGui.QApplication.translate("Form", "?????????? ?????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label3.setText(QtGui.QApplication.translate("Form", "??????? ????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label4.setText(QtGui.QApplication.translate("Form", "?????????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label5.setText(QtGui.QApplication.translate("Form", "????? ??????:", None, QtGui.QApplication.UnicodeUTF8))
self.label6.setText(QtGui.QApplication.translate("Form", "????? ??????:", None, QtGui.QApplication.UnicodeUTF8))
self.label7.setText(QtGui.QApplication.translate("Form", "?????????? ????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label8.setText(QtGui.QApplication.translate("Form", "????? ????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label9.setText(QtGui.QApplication.translate("Form", "??????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label10.setText(QtGui.QApplication.translate("Form", "????????? ?????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label11.setText(QtGui.QApplication.translate("Form", "????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label12.setText(QtGui.QApplication.translate("Form", "?????????-????????:", None, QtGui.QApplication.UnicodeUTF8))
self.label13.setText(QtGui.QApplication.translate("Form", "?????:", None, QtGui.QApplication.UnicodeUTF8))
self.label14.setText(QtGui.QApplication.translate("Form", "?????????? ???????:", None, QtGui.QApplication.UnicodeUTF8))
self.label15.setText(QtGui.QApplication.translate("Form", "????? ???????:", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Form", "????????", None, QtGui.QApplication.UnicodeUTF8))
def amlist(self):
self.text = str(self.lineEdit.text())
def addtolists(self):
dialog.accept()
#Main loop:
def main():
global dialog
dialog = NewChildDlg()
dialog.show()
dialog.exec_()
Run Code Online (Sandbox Code Playgroud)
具体错误相关问题
删除update2方法上的classmethod装饰器.它使"self"变成了类对象,并且你的类上没有tableWidget属性.只有你的小部件.这里的装饰器没用.
一般设计和基本问题
这段代码存在一些严重的基本问题.我意识到你是新人并且在学习,所以现在解决这些问题更为重要.这是一本很棒的书,用Python和Qt进行快速GUI编程,对于学习PyQt我不能称赞
你在这里做的是获取由Qt Designer生成的UI设计文件,并将其编辑为在逻辑中插入setupUi方法.您需要了解的关于此ui文件的内容是,它创建了包含要应用于您自己的类的窗口小部件设置代码的泛型类.您可以在底部创建新QMainWindow,然后调用setupUi它.你不应该做的是创建大量的全局变量或在这些UI设置类中添加额外的方法和逻辑.你也有一个错误的例子@classmethod.
PyQt中的对象关系通常像这样工作......父类可以有属性和子窗口小部件.子窗口小部件可以具有属性,并且通常不了解其父项.
如何正确设置此QMainWindow的一个示例是首先将UI自动生成代码保存在自己的文件中(myappUI.py或类似的东西).然后,您将为QMainWindow创建一个子类,它将具有您的自定义方法和数据属性:
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi(self)
# create instance attributes to store data
...
self.mothersname = []
self.birthday = []
self.placeofbirth = []
self.nationality = []
self.address = []
...
r=0
c=0
for x in children:
for i in x:
newItem = QtGui.QTableWidgetItem(i)
self.tableWidget.setItem(r, c, newItem)
r += 1
r = 0
c += 1
def newFile(self):
...
def openFile(self):
...
def Quit(self):
# Dont force the exit of the app like this.
# Just close the main window
# sys.exit(app.exec_())
# this was in no way a classmethod
# @classmethod
def update2(self):
...
def actionewchild(self):
...
# if you want to create a form dialog on the fly
# and kill it after you get results
form = Form(parent=self)
form.exec_()
def lists(self):
...
class Form(QtGui.QDialog, Ui_Form):
def __init__(self, *args, **kwargs):
super(Form, self).__init__(*args, **kwargs)
self.setupUi(self)
def amlist(self):
...
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
这只是一个粗略的概述,它将如何重组为两个类,每个类都继承自他们的UI设计.那些大量的全局变量可能会作为实例属性移动到你的MainWindow中.不要使用全局变量.
我之所以采取这种方法,建议你完全重组,是因为你正走向一条非常混乱且可能令人沮丧的道路.事情不会像你期望的那样发挥作用,你会发现自己经常在这里发布为什么会发生这种情况.如果您花时间查看我建议的那本书,您将获得更好的体验.
更新#1:匹配您的代码更新
主窗口和对话框之间的概念是向后的.您有一个主窗口将操作连接到对话框模块中的一个功能,以启动它并完成工作.真正应该发生的是你自己的方法的主窗口连接.此方法将启动对话框,获取结果并自行修改.
def addtolists(self):
program.am.append(text)
instance = MainWindow()
instance.updatetable()
dialog.close()
Run Code Online (Sandbox Code Playgroud)
您的对话框中有该代码.首先,像这样调用MainWindow不会让你获得实例.它将尝试创建第二个主窗口小部件.不要尝试获取对父项的引用并进行修改.孩子们应该不了解使用它的父母.尽管如此,您可以在不同的地方使用此对话框.
# this is just a pseudo example of the right direction.
# A method in your MainWindow, starting the child dialog,
# waiting on its results, and updating itself.
def showDialog(self):
d = MyDialog(self)
if d.exec_():
self.updateStuff(d.values)
myAction.triggered.connect(self.showDialog)
Run Code Online (Sandbox Code Playgroud)
对于全局变量......在应用程序设计中不应该只需要一个全局变量.它们适用于您知道需要它们的特殊情况.我想说的是,如果你现在正在使用全局权利,你可能会做错了.原因是您使用它们来传递不同方向的数据,而不是遵循父子关系,或通过信号/插槽传递数据.如果父级启动子窗口小部件,它将知道子级并能够调用方法或从中获取值.
更新#2:匹配您的代码更新
从主窗口创建对话框有点过时了.它应该是这样的:
def doupdate(self):
d = NewChildDlg(self)
# exec_ shows the dialog modally
if d.exec_():
# your dialog didn't have a pre-initialized
# `text` attribute so it was not safe to assume
text = d.lineEdit.text()
# stop using globals. use attributes
self.am.append(text)
self.updatetable()
Run Code Online (Sandbox Code Playgroud)
对于全球......再次停止使用它们.将它们移动到主窗口类中:
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.am = []
self.courtdate = []
self.board_number = []
Run Code Online (Sandbox Code Playgroud)
对话框类中的这部分是错误的:
def addtolists(self):
# why use a global here? dialog == self
# self.accept()
dialog.accept()
# you don't need a top level function that
# maintains a global instance and creates the dialog
# It should be the callers responsibility
def main():
global dialog
dialog = NewChildDlg()
dialog.show()
dialog.exec_()
Run Code Online (Sandbox Code Playgroud)
最后,只需对导入语句发表评论......您无需先导入模块即可导入该模块的成员:
# either you need the newchilddlg namespace
# or you only want the members...
# newchilddlg.NewChildDlg vs NewChildDlg
import newchilddlg
from newchilddlg import *
Run Code Online (Sandbox Code Playgroud)
为了帮助你更多,我在这里发布了一个清理版本的主窗口代码:http://pastebin.com/9b8gcGhU