按下按钮(使用Tkinter),执行命令有问题。
我定义了这样的功能:
refPt = []
cropping = False
def main(image_dir):
def click_and_crop(event, x, y, flags, param):
global refPt, cropping
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
elif event == cv2.EVENT_LBUTTONUP:
refPt.append((x, y))
cropping = False
cv2.rectangle(image, refPt[0], refPt[1], (0, 255, 0), 2)
cv2.imshow("image", image)
image=cv2.imread(image_dir)
print (image.dtype)
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
while True:
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
if key == ord("r"):
image = clone.copy()
elif key == ord("c"):
break
if len(refPt) == 2:
roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
cv2.imshow("ROI", roi)
cv2.waitKey(0)
cv2.imwrite('template.tif',roi)
cv2.destroyAllWindows()
当我单独测试时,它工作正常。
这是我的GUI代码的一小部分:
window = tkinter.Tk() window.title("Analog2Digital Transform")
b2 = tkinter.Button(window, text="Start", command=main('7_7026_polowa.tif'), width=10, heigh=10)
现在,当我运行我的脚本时,在显示GUI窗口之前执行功能main()
。另外,它使用了函数的参数 - main('7_7026_polowa.tif')
,它包含在GUI代码中。是函数定义还是GUI代码问题?
答案 0 :(得分:2)
如果要使用命令参数将函数绑定到窗口小部件,则不能使用括号。
command = main
因为有了它们而不是调用函数。如果要绑定函数并传入值,则应该查看lambda
command = lambda : main('7_7026_polowa.tif')
如果使用bind方法而不是命令参数将函数绑定到窗口小部件,则需要lambda来获取事件对象。
mywidget.bind("<ButtonRelease-1>", lambda e : function(e, value) )
如果您没有使用事件对象,则无需将其传递给函数。
mywidget.bind("<ButtonRelease-1>", lambda e : function(value) )
答案 1 :(得分:0)
b2 =tkinter.Button(window, text="Start", command=main('7_7026_polowa.tif'), width=10, heigh=10)
由于parens&#34;()&#34;和command =返回值,在创建按钮时执行main。高度拼写错误。使用partial将值传递给函数,command = function - &gt;如果你想在没有传递值的情况下调用函数,就没有parens。
from functools import partial
...
b2=tkinter.Button(window, text="Start", command=partial(main, '7_7026_polowa.tif'),
width=10, height=10)