【问题标题】:Accessing an object function from a parent widget's function从父窗口小部件的函数访问对象函数
【发布时间】:2017-06-07 02:59:07
【问题描述】:

我正在用 Python 编写一个大型程序,并使用 PyQt 作为 GUI。整个程序分为不同的模块,不同的人可以同时工作,不会干扰其他人的工作。

我现在正在研究 3 个不同的模块。 1 是处理基本 UI 并分配小部件的主程序窗口,因此是主窗口(这并不重要,只是让您知道为什么代码看起来不像一个完整的程序。)

首先是小部件:

import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from CustomButton import HoverButton  #just a custom button class
from CustomGif import LblLoadingGif  #where things go wrong

class Page1(QtGui.QWidget):    
    def __init__(self, parent=None):
        super(Page1, self).__init__(parent)

        self.lbl1GIF = LblLoadingGif(self)
        self.lbl1GIF.move(400, 45)

        self.btnStart = HoverButton(self)
        self.btnStart.setText('Start')
        self.btnStart.move(35, 400)
        self.btnStart.clicked.connect(self.actStartGif)
        #the code below works, but then I can only perform 1 action with each button
        #self.btnStart.clicked.connect(self.lbl1GIF.actStart)

    def actStartGif(self):
        self.lbl1GIF.actStart

自定义 GIF 的代码如下所示:

import sys
from PyQt4 import QtCore
from PyQt4 import QtGui

class LblLoadingGif(QtGui.QLabel):

    def __init__(self, parent=None):
        QtGui.QLabel.__init__(self, parent)
        self.setStyleSheet('background: url();')
        self.setScaledContents(True)
        self.resize(100, 100)
        self.movLoadGif = QtGui.QMovie('Resources_Images/Loading6.gif', QtCore.QByteArray())
        self.movLoadGif.setCacheMode(QtGui.QMovie.CacheAll)
        self.movLoadGif.setSpeed(100)
        self.setMovie(self.movLoadGif)
        self.hide()

    def actStart(self, event):
        #print('test1')
        self.show()
        self.movLoadGif.start()

    def actStop(self, event):
        #print('test1')
        self.hide()
        self.movLoadGif.stop()

所以问题是,当我直接从按钮单击调用它时,我可以很好地使用 actStart 函数,但当我通过另一个函数调用它时就不行了。在使用 actStartGif 函数调用自定义 gif 的 actStart 时,我使用了很多不同的括号、self、Page1 变体。

任何帮助将不胜感激。

【问题讨论】:

  • 所以在 actStartGif 中对 self.lbl1GIF.actStart 的调用失败了,对吧?你得到的实际错误是什么? 1) actStart 是一个函数,所以你应该添加括号:self.lbl1GIF.actStart()。 2)而且由于 actStart 似乎需要一个事件参数(显然没有使用),你也应该传递那个:self.lbl1GIF.actStart(None)
  • 完美!添加“(无)”括号解决了它。但是要回答您的问题,调用该函数没有得到任何响应。我认为这是因为我使用模块作为主程序的大纲,然后每次都将小部件加载到其中。当一些人想要处理不同的页面而不必担心重叠的程序或他们的代码相互冲突时,这会有所帮助。这就是为什么该类只命名为 Page1 并且没有给出 'if name == 'main':' 代码。谢谢你的帮助

标签: python pyqt pyqt4 qwidget


【解决方案1】:

当你使用 connect 时,必须传递函数的名称,因为它在内部负责调用它,在你的情况下,你必须直接调用它,所以你必须传递它的参数,在这种情况下 事件

self.lbl1GIF.actStart({your value for event})

我不明白你为什么使用事件来处理发生在你身上的事情 None:

def actStartGif(self):
    self.lbl1GIF.actStart(None)

【讨论】:

  • 这是我第一次不得不使用 PyQt,所以我不熟悉使用对象和对象相关功能。 '(None)' 括号完美地解决了这个问题,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2020-05-01
相关资源
最近更新 更多