【问题标题】:Can't connect function imported outside of class qt无法连接在 qt 类之外导入的函数
【发布时间】:2015-11-08 17:04:43
【问题描述】:

我有一个大型函数(600 多行),为了便于阅读,我不想从我的主代码中删除它,但是,我无法在我的主窗口类中引用该函数。如果我将 import 语句移到类内部,它可以无缝工作,但我计划在其他地方使用它,所以不想多次导入它。有没有一种简单的方法可以从窗口中引用导入的函数?

import sys
import cv2
from PySide import QtCore
from PySide import QtGui
import mainWindowUI
from videoFunctions import videoFeed

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

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.setup_camera()

    def setup_camera(self):
        self.capture = cv2.VideoCapture(0)      
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.videoFeed)
        self.timer.start(30)

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

追溯:

File "<stdin>", line 1, in <module>
File "C:\WinPython\python-2.7.10.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 790, in runfile
  execfile(filename, namespace)
File "C:\WinPython\python-2.7.10.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 77, in execfile
  exec(compile(scripttext, filename, 'exec'), glob, loc)
File "C:/Scanner.py", line 42, in <module>
form = MainWindow()
File "C:/Scanner.py", line 17, in __init__
self.setup_camera()
File "C:/Scanner.py", line 37, in setup_camera
self.timer.timeout.connect(self.videoFeed)
AttributeError: 'MainWindow' object has no attribute 'videoFeed'

【问题讨论】:

  • 没有函数应该是600行。甚至 60 也在推动它。
  • 所讨论的函数实际上要少得多(约 100 行),只有半打(过于简单化了)。底线是我有一大块代码我不想移动到单独的脚本中,并且在将导入保持在文件顶部时无法弄清楚如何这样做
  • 您指的是该函数,就好像它是一个方法一样,但事实并非如此(因为您已将其从类中取出)。它是否需要是一个方法 - 即它是否引用了该类中的其他数据?
  • 啊,是的。它需要是一种方法(它与 UI 元素交互),我对两者之间的区别不是很清楚,但我想我现在已经弄清楚了。我认为最好的解决方案是在主脚本中定义方法并尝试尽可能多地重写为可导入函数?

标签: python qt class python-import


【解决方案1】:

一种可能是将这些方法放入一个单独的类中,您可以在主类中用作混合:

class VideoFeedMixin(object):
    def videoFeed(self):
        ...

然后:

from videoFunctions import VideoFeedMixin

class MainWindow(VideoFeedMixin, QtGui.QMainWindow, mainWindowUI.Ui_MainWindow):
    ...

现在self.timer.timeout.connect(self.videoFeed) 将像以前一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多