在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()
答案 0 :(得分:1)
在MainWindow的db = photoDb(self)
方法中移动__init__()
。
答案 1 :(得分:0)
感谢@Gribouillis指出我正确的方向。这是有效的。
将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对象。
在db对象中,确保将主窗口的ID(在调用db对象时传递)分配给self。变量,因此self.
类之外的方法也可以访问它。
以下是有效的代码:
__init__()