Python模块NameError

时间:2017-03-20 14:28:14

标签: python python-3.x opencv tkinter

我从我制作的Tkinter GUI调用这个脚本,并且我的一个变量无法从我的一个函数调用,我无法理解它为什么会发生?

当我按下按键以触发我的某个标记功能时,我得到NameError 'framevalues'未定义。

提前致谢!

import cv2
import tkinter as tk
from tkinter.filedialog import askopenfilename


def main():
    framevalues = []
    count = 1
    selectedvideo = askopenfilename()
    selectedvideostring = str(selectedvideo)
    cap = cv2.VideoCapture(selectedvideo)
    length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    while (cap.isOpened()): 
        ret, frame = cap.read()

        # check if read frame was successful
        if ret == False:
                break
        # show frame first
        cv2.imshow('frame',frame)

        # then waitKey
        frameclick = cv2.waitKey(0) & 0xFF

        if frameclick == ord('a'):
            swingTag(cap)

        elif frameclick == ord('r'):
            rewindFrames(cap)

        elif frameclick == ord('s'):
            stanceTag(cap)

        elif frameclick == ord('d'):
            unsureTag(cap)

        elif frameclick == ord('q'):
            with open((selectedvideostring + '.txt'), 'w') as textfile:
                for item in framevalues:
                    textfile.write("{}\n".format(item))
            break

        else:
            continue

    cap.release()
    cv2.destroyAllWindows()

def stanceTag(cap):    
    framevalues.append('0' + ' ' + '|' + ' ' + str(int(cap.get(1))))
    print (str(int(cap.get(1))), '/', length) 
    print(framevalues)

def swingTag(cap):
    framevalues.append('1' + ' ' + '|' + ' ' + str(int(cap.get(1))))
    print (str(int(cap.get(1))), '/', length)
    print(framevalues) 

def unsureTag(cap):
    framevalues.append('-1' + ' ' + '|' + ' ' + str(int(cap.get(1))))
    print (str(int(cap.get(1))), '/', length) 
    print(framevalues)

def rewindFrames(cap):
    cap.set(1,((int(cap.get(1)) - 2)))
    print (int(cap.get(1)), '/', length) 
    framevalues.pop()
    print(framevalues)  






if __name__ == '__main__':
    # this is called if this code was not imported ... ie it was directly run
    # if this is called, that means there is no GUI already running, so we need to create a root
    root = tk.Tk()
    root.withdraw()
    main()

3 个答案:

答案 0 :(得分:3)

framevalues是在main()内定义的局部变量,因此在其他函数中不可见。您可以将其设为全局,即在main()之前定义它,或者您可以将其从main()传递给其他函数作为正常函数参数,例如

def main():
    ...
    if frameclick == ord('a'):
        swingTag(cap, framevalues)  # pass it as a parameter
    ...
...
def swingTag(cap, framevalues):
    framevalues.append(...)  # now you are using local framevalues passed as parameter

答案 1 :(得分:1)

framevalues是main()的本地变量。您需要将framevalues作为参数传递给所有需要它的函数,以便他们能够访问它。

请阅读变量范围。我在disable events

中建议了答案

答案 2 :(得分:1)

分配变量时,您将在当前范围中创建该变量,即当前函数的本地

因此,您可以做的是将framevalues变量定义为全局。 这可以通过以下方式实现:

替换

framevalues = [] 

global framevalues
framevalues = []

您无需更改其余代码,这样就可以了。