Python Can';在类qt之外导入的t connect函数

Python Can';在类qt之外导入的t connect函数,python,qt,class,python-import,Python,Qt,Class,Python Import,我有一个大函数(600多行),为了可读性,我不想从主代码中删除它,但是,我无法在主窗口类中引用该函数。如果我将import语句移动到类内部,它将无缝工作,但我计划在其他地方使用它,因此不想多次导入它。是否有一种简单的方法从窗口中引用导入的函数 import sys import cv2 from PySide import QtCore from PySide import QtGui import mainWindowUI from videoFunctions import videoFee

我有一个大函数(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'
文件“”,第1行,在
文件“C:\WinPython\python-2.7.10.amd64\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第790行,在runfile中
execfile(文件名、命名空间)
文件“C:\WinPython\python-2.7.10.amd64\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第77行,在execfile中
exec(编译(脚本文本,文件名,'exec'),glob,loc)
文件“C:/Scanner.py”,第42行,在
窗体=主窗口()
文件“C:/Scanner.py”,第17行,在初始化中__
self.setup\u摄像机()
文件“C:/Scanner.py”,第37行,在设置\u摄像头中
self.timer.timeout.connect(self.videoFeed)
AttributeError:“MainWindow”对象没有属性“videoFeed”

一种可能是将这些方法放入一个单独的类中,作为主类中的mixin使用:

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

from videoFunctions import VideoFeedMixin

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

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

一种可能是将这些方法放在一个单独的类中,作为主类中的混音:

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

from videoFunctions import VideoFeedMixin

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

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

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