Python:对象如何调用创建它的对象?

时间:2016-12-16 00:08:57

标签: python qt oop pyqt

在Python 3.5中,对象如何在实例化它的对象中调用函数?

我创建了一个PyQt应用程序来实例化一个简单的数据库对象db。我希望db对象能够更新主窗口对象中的进度条,但我无法弄清楚要传递给db对象的内容以使其成为可能。

我花了几个小时在线阅读,但无法弄清楚这一点。我以为我可以将self作为MainWindow对象的标识符传递给db对象,但是db =photoDb(self)的NameError会失败:“name'self'未定义”。很明显,尽管已阅读过有关它的网页或网页,但我并不完全理解self

我怀疑这必须是构造函数中的简单信息传递,但我无法理解。 (而且我花了好几个小时阅读可能与此相关的StackOverflow条目。对不起,如果这应该是显而易见的,或者已经在我找不到的条目中已经回答了。)我使用的是Python 3.5,PyQt4和Ubuntu 16.10。

我的代码的要点:

class photoDb(self, mainwindow):

    def __init__(self):
        self.db = []

    def addPhotosToDb(self, filenames):
        i = 0
        for f in filenames:
        (do a bunch of stuff here with f)
        self.db.append(f)
        mainwindow.updateProgressBar(int(100*i/len(filenames))


class MainWindow(QtGui.QMainWindow, photoOrg_MainWindow.Ui_MainWindow):

    db =photoDb(self)

    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)
        (lots more GUI widget connection code here)

    def updateProgressBar(self, percentage):
        self.progressBar.setValue(percentage)

    def addPhotosToDb(self):
        self.db.addPhotosToDb(listOfFiles) #the list is gotten from a dialog box generated elsewhere in the mainwindow class code


def main():
    app = QtGui.QApplication(sys.argv)
    form = MainWindow()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:1)

在MainWindow的db = photoDb(self)方法中移动__init__()

答案 1 :(得分:0)

感谢@Gribouillis指出我正确的方向。这是有效的。

  1. 将db对象的实例化放入主窗口的 Akshays-MacBook-Pro-2:~ akshaydashrath$ flutter doctor Downloading Dart SDK 1.21.0... #################################################################100.0% Building flutter tool... vm-service: Error: Unhandled exception: Unsupported operation: Cannot extract a non-Windows file path from a file URI with an authority #0 _SimpleUri._toFilePath (dart:core/uri.dart:4423) #1 _SimpleUri.toFilePath (dart:core/uri.dart:4417) #2 _loadFile (loader.dart:407:26) #3 _handleResourceRequest (loader.dart:510:5) #4 _processLoadRequest (loader.dart:941:7) #5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148) 方法中,确保__init__()在db对象的名称前面,以便主窗口中的其他方法class可以访问db对象。

  2. 在db对象中,确保将主窗口的ID(在调用db对象时传递)分配给self。变量,因此self.类之外的方法也可以访问它。

  3. 以下是有效的代码:

    __init__()