0

我敢肯定这已经被问了一百万次了,但是当你不知道正确的术语时很难搜索到一些东西:(

我正在尝试(再次......我从来没有理解过面向对象,因为我在 8 年前被教得很糟糕,并且尽可能地避免它,这让我认识的所有其他程序员都感到恐惧——我的想法并不似乎完全可以得到它)同时自学OO和PyQt。

我什至不知道这在逻辑上是否可行,但我有一个 PyQt动作,它被 2 个不同的东西引用;动作的参数之一是图标。当其中一件事调用的动作时,我想更改图标;代码片段:

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)。的文档QtIcon有一个addFile方法,所以我尝试了:

self.toolbar.addAction(self.exitAct)
self.exitIcon.addFile("exitdoor.png")

但这不起作用,出现错误(“'QToolBar'对象没有属性'addFile'”),并且

self.exitAct.addFile("exitdoor.png")

错误“QAction”对象没有属性“addFile”(我明白为什么这不起作用以及错误意味着什么)。

我的愚蠢错误是什么?!(除了让自己经历继续尝试和学习OO的痛苦的错误......)

4

3 回答 3

1

'QToolBar' 对象没有属性 'addFile'

嗯,因为你在 self.exitIcon 上调用了 addFile,看起来你在 self.exitIcon 变量中有错误类型的对象。您似乎希望它是 QtGui.QIcon 类型,但它是 QToolBar 类型。

你应该看看你在哪里给 self.exitIcon 赋值。

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

于 2013-06-14T16:59:36.263 回答
0

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

更多想法:

self.exitIcon = QtGui.QIcon('exit.png')在和的执行之间的某处self.exitIcon.addFile("exitdoor.png") self.exitIcon被更改为引用 a QToolBar。我建议您开始在代码中添加print语句,这样您就可以跟踪代码的执行并找出该变量是如何更改的。

于 2013-06-14T16:54:58.677 回答
0

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

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

仍然欢迎进一步的评论!

于 2013-07-09T14:08:09.780 回答