Python和PyQt:从另一个类运行函数

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

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

特定错误相关问题

删除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 *