Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非常基本的OO:更改方法的属性_Python_Pyqt - Fatal编程技术网

Python 非常基本的OO:更改方法的属性

Python 非常基本的OO:更改方法的属性,python,pyqt,Python,Pyqt,我敢肯定这已经被问过无数次了,但如果你不知道正确的术语,就很难去搜索:( 我试图(再一次…我从来没有理解过OO,因为我在8年前被教得很糟糕,并且尽可能地避免它,让我认识的所有其他程序员都感到恐惧——我的头脑似乎根本不想理解它)同时教我自己OO和PyQt 我甚至不知道这在逻辑上是否可行,但我有一个PyQt操作,它由两个不同的东西引用;该操作的一个参数是图标。当其中一个东西调用该操作时,我想更改图标;代码段: self.menu() self.toolbar() self.actions() de

我敢肯定这已经被问过无数次了,但如果你不知道正确的术语,就很难去搜索:(

我试图(再一次…我从来没有理解过OO,因为我在8年前被教得很糟糕,并且尽可能地避免它,让我认识的所有其他程序员都感到恐惧——我的头脑似乎根本不想理解它)同时教我自己OO和PyQt

我甚至不知道这在逻辑上是否可行,但我有一个PyQt操作,它由两个不同的东西引用;该操作的一个参数是图标。当其中一个东西调用该操作时,我想更改图标;代码段:

self.menu()
self.toolbar()
self.actions()

def menu(self):
  self.fileMenu = QtGui.QMenu("&File", self)
  self.fileMenu.addAction(self.exitAct)

def toolbar(self):
  self.toolbar = self.addToolBar("Exit")
  self.toolbar.addAction(self.exitAct)

def actions(self):
  self.exitIcon = QtGui.QIcon('exit.png')
  self.exitAct = QtGui.QAction(self.exitIcon, "&Exit", self, triggered=self.close)
在工具栏中,我想要一个不同的图标(
exitdoor.png

self.toolbar.addAction(self.exitAct)
self.exitIcon.addFile("exitdoor.png")
但这不起作用,出现错误(“'QToolBar'对象没有属性'addFile'”),并且

由于错误'QAction'对象没有属性'addFile'(我确实理解为什么这不起作用以及错误的含义)


我不熟悉PYQT,只是初学者有Python,但我对其他OO语言(主要是C++和Java)有相当的经验。。看起来您需要确定字段
exitIcon
exitAct
中存储了什么类型的对象。从那里,您需要了解这些对象具有哪些属性,并找到可以更改以获得所需行为的属性

更多想法:

执行
self.exitIcon=QtGui.QIcon('exit.png')
self.exitIcon.addFile(“exitdoor.png”)之间的某个位置
self.exitIcon
已更改为引用
QToolBar
。我建议您开始使用
print
语句喷洒代码,以便跟踪代码的执行情况并了解此变量是如何更改的

“QToolBar”对象没有属性“addFile”

嗯,由于您在self.exitIcon上调用了addFile,因此self.exitIcon变量中的对象类型似乎不正确。您似乎希望它是QtGui.QIcon类型,但实际上它是QToolBar类型

你应该看看你在哪里给self.exitIcon分配任务


在这种情况下,尝试通过Python学习面向对象编程并不是最简单的方法。Python是一种优秀的面向对象语言,但它不会像其他语言那样立即捕获错误。当您遇到如上所述的错误时,错误不在那行代码中,而是在刚才运行的一行代码中。其他语言甚至在你运行程序之前就会发现错误,并直接指出你需要修复的地方。在你进入Python领域之前,你可能值得先练习一点基本的Java,由一位严格的老师对其进行面向对象的培训。

在与一些比我聪明得多的人交谈后,简短的回答是至少,我试图做的似乎是不可能的。一旦定义了
操作
,就不可能更改它的任何属性

目前,我对python的了解还不足以确切理解为什么会这样(或者我是如何从文档中意识到这一点的),但似乎当定义一个动作时,它实际上是一个存储在内存中的黑盒,其他对象只能使用而不能修改黑盒


欢迎更多评论!

如果可以,我建议您尝试PySide。我在这两方面的经验使我更喜欢PySide,尽管PyQt4可以通过使用用于QString、Slot等的v2 API进行改进。(他们拥有基本相同的API,但PySide的许可证更为宽松,而PyQt4必须保持各种向后兼容,这使得PySide在其开发中更加灵活。)您可以将内容拆分为方法(
菜单
工具栏
操作
)没有意义。它们需要一起运行并且只运行一次,所以它们应该在一个方法中。@ChrisMorgan-hmm..这是一个有趣的评论;我一直在使用一个在线找到的图像查看器来帮助我:-这就是它们如何分解事物的,所以只需遵循它们的示例
“QToolBar”对象没有属性“addFile”
,因此在你的代码你有
self.toolbar.addFile
而不是
self.exitIcon.addFile
,或者你给
exitIcon
分配了一个工具栏对象,而不是
QIcon
。下次请提供一个最小的工作示例(即可以复制粘贴并获得你看到的结果)再加上对错误的完整回溯。@Bakuriu-对不起,我没有真正按照你的建议去做。我认为
self.toolbar
的类型是错误的,这就是为什么我尝试
self.exitIcon.addFile
这与OOP无关。你指出了静态和动态类型语言之间的区别s、 我还认为,学习OOP与学习一门语言无关,人们可以很容易地用Java编写非OOP或糟糕的OOP代码(你经常看到这样的代码)。“实施OOP设计”的教育优势在语言中是非常有争议的。不,这与OOP无关。它与理解任何编程错误的根本原因有关,在静态类型语言中更容易出现错误(尽管我有过使用C编译器的经验,这些编译器即使在编译时出错时也会给出难以置信的无用消息).一般来说,教育优势可能是很有争议的,但苦苦挣扎的学生不太可能费心遵循这些论点。他们要么接受建议,要么放弃建议,要么成功地遵循建议。YMMV是的-你说的有道理!我不明白
self.exitIcon
怎么可能是
QToolBarself.exitAct.addFile("exitdoor.png")