2015-11-08 4 views
1

У меня есть большая функция (ы) (600+ строк), которую я не хочу удалить из моего основного кода для удобства чтения, однако я не могу ссылаться на функцию внутри мой класс главного окна. Если я перемещаю оператор import внутри класса, он работает без сбоев, но я планирую использовать его в другом месте, поэтому не хочу импортировать его несколько раз. Есть ли простой способ ссылаться на импортированную функцию из окна?Невозможно подключить функцию, импортированную за пределами класса qt

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_() 

Traceback:

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' 
+0

Никакой функции не должно быть 600 строк. Даже 60 его подталкивает. –

+0

Эта функция на самом деле существенно меньше (~ 100 строк), их всего полтора десятка (это было грубое упрощение). Итог: у меня есть большой кусок кода. Я не перехожу к отдельному скрипту и не могу понять, как это сделать, сохраняя импорт в верхней части файла. – blakebjorn

+0

. Вы имеете в виду функцию, как будто это был метод, которого нет (потому что вы вывели его из класса). Должен ли быть метод - то есть он ссылается на другие данные в этом классе? –

ответ

0

Одним из возможных вариантов может быть, чтобы положить эти методы в отдельный класс, который используется как примесь в вашем главном классе:

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

, а затем:

from videoFunctions import VideoFeedMixin 

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

self.timer.timeout.connect(self.videoFeed) будет работать так же, как раньше.

+0

работает отлично! благодаря! – blakebjorn

Смежные вопросы