Python Can';在类qt之外导入的t connect函数
我有一个大函数(600多行),为了可读性,我不想从主代码中删除它,但是,我无法在主窗口类中引用该函数。如果我将import语句移动到类内部,它将无缝工作,但我计划在其他地方使用它,因此不想多次导入它。是否有一种简单的方法从窗口中引用导入的函数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
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元素交互),我不太清楚两者之间的区别,但我想我现在已经弄明白了。我认为最好的解决方案是在主脚本中定义方法,并尝试重写尽可能多的可导入函数?