我从我制作的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()
答案 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 = []
您无需更改其余代码,这样就可以了。