Python和PyQt:从另一个类运行函数
更新3: 这是新的代码,尝试按照你告诉我的去做,但没有结果。。。 我开始觉得我在程序中做了一些非常愚蠢的事情。。。 有什么新想法吗 program.py:Python和PyQt:从另一个类运行函数,python,class,function,pyqt,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 newchildd
# -*- 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_())
特定错误相关问题 删除update2方法上的类方法装饰器。它使“self”变成类对象,并且类上没有tableWidget属性。只有你的小部件。这里的装修工没有用 一般设计和基本问题 此代码存在一些严重的基本问题。我意识到你是新来的,正在学习,所以现在解决这些问题更重要。对于学习PyQt,这是一个我赞不绝口的问题 这里要做的是获取Qt Designer生成的UI设计文件,并对其进行编辑,将其插入逻辑中的
setupUi
方法中。关于此ui文件,您需要了解的是,它创建了包含要应用于您自己的类的小部件设置代码的通用类。概念的底部有一部分,您可以在其中创建一个新的QMainWindow,然后在其上调用setupUi
。您不应该在这些UI设置类中创建大量全局变量或添加额外的方法和逻辑。这里还有一个错误的@classmethod
示例
PyQt中的对象关系通常是这样工作的。。。父类可以有属性和子窗口小部件。子部件可以有属性,通常不知道它们的父部件
如何正确设置此QMainWindow的一个示例是,首先将UI自动生成代码保存在自己的文件中(myappUI.py
或类似文件)。然后,您将为QMainWindow创建一个子类,该子类将具有您的自定义方法和数据属性:
class主窗口(QtGui.QMainWindow,Ui\u主窗口):
定义初始化(self,*args,**kwargs):
超级(主窗口,自我)。\uuuuu初始化(*args,**kwargs)
self.setupUi(self)
#创建实例属性以存储数据
...
self.mothersname=[]
self.birth=[]
self.placeofbirth=[]
self.national=[]
self.address=[]
...
r=0
c=0
对于儿童中的x:
对于x中的i:
newItem=QtGui.QTableWidgetItem(i)
self.tableWidget.setItem(r、c、newItem)
r+=1
r=0
c+=1
def新文件(自身):
...
def openFile(self):
...
def退出(自我):
#不要像这样强制退出应用程序。
#只要关上主窗口
#sys.exit(app.exec_())
#这绝不是一个类方法
#@classmethod
def更新2(自我):
...
def actionewchild(自我):
...
#如果要动态创建窗体对话框
#在你得到结果后杀了它
形式=形式(父母=自己)
form.exec()
def列表(自我):
...
课堂形式(QtGui.QDialog,Ui_形式):
定义初始化(self,*args,**kwargs):
super(Form,self)。\uuuuuu init\uuuuuuuu(*args,**kwargs)
self.setupUi(self)
def amlist(自我):
...
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QtGui.QApplication(sys.argv)
窗口=主窗口()
window.show()
sys.exit(app.exec_())
这只是一个粗略的概述,说明了如何将其重组为两个类,每个类都继承了它们的UI设计。这些大量的全局变量可能会作为实例属性移动到主窗口中。不要使用globals
我之所以采取这种方法,建议你完全重组,是因为你正走在一条非常混乱且可能令人沮丧的道路上。事情不会像你期望的那样进行,你会发现自己经常在这里发布关于为什么会发生这种情况的帖子。如果你花点时间复习我推荐的那本书,你会有更好的体验
更新#1:匹配您的代码更新
主窗口和对话框之间的概念是向后的。主窗口将操作连接到对话框模块中的函数,以启动它并执行工作。真正应该发生的是你的主窗口连接到它自己的方法。此方法将启动对话框,获取结果并修改自身
def addtolists(self):
program.am.append(text)
instance = MainWindow()
instance.updatetable()
dialog.close()
您的对话框中有该代码。首先,这样调用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)
至于全球。。。在应用程序设计中不应该需要一个全局变量。它们适用于你知道你需要它们的特殊情况。我想说的是,如果你现在使用的是一个全球定位系统,那么你可能做错了。原因是您正在使用它们以不同的方向传递数据,而不是遵循父子关系,或通过信号/插槽传递数据。如果父部件启动子部件,它将了解子部件,并能够调用方法或从中获取值
更新#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()
为了全球。。。再次停止使用它们。将它们移动到主窗口类中:
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.am = []
self.courtdate = []
self.board_number = []
对话类中的这一部分是错误的:
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_()
最后,请对您的导入语句发表评论。。。您无需首先导入模块即可导入该模块的成员:
# either you need the newchilddlg namespace
# or you only want the members...
# newchilddlg.NewChildDlg vs NewChildDlg
import newchilddlg
from newchilddlg import *
为了给你更多的帮助,我发布了你的主窗口公司的一个清理版本
# either you need the newchilddlg namespace
# or you only want the members...
# newchilddlg.NewChildDlg vs NewChildDlg
import newchilddlg
from newchilddlg import *