【问题标题】:does setMouseCallback method not work with tkinter?setMouseCallback 方法不能与 tkinter 一起使用吗?
【发布时间】:2021-02-27 07:58:39
【问题描述】:

我正在开发幻灯片应用程序。 基本上这会每隔5秒显示某个目录中的所有图片,如果点击图片会发生变化。 在我将它与tkinter 混合之前,它一直运行良好。 看来我的setMouseCallback 方法不再起作用了... 有什么帮助吗?

import os
import cv2
import random
import tkinter as tk



root = tk.Tk()

mouseClickChecker=1

def func():
    
    def clickevent(event,x,y,flags,param):
        if event == cv2.EVENT_LBUTTONDOWN:
            global mouseClickChecker
            mouseClickChecker=2
    
    path = "./"

    file_list = os.listdir(path)

    file_list_jpg = [file for file in file_list if file.endswith('.jpg')]
    file_list_JPG = [file for file in file_list if file.endswith('.JPG')]
    file_list_jpeg = [file for file in file_list if file.endswith('.jpeg')]
    file_list_PNG= [file for file in file_list if file.endswith('.PNG')]
    file_list_png=[file for file in file_list if file.endswith('.png')]

    list_in_list = [file_list_jpg, file_list_PNG, file_list_JPG, file_list_jpeg,file_list_png]
    final_list = sum(list_in_list,[])

    logoPlayChecker=1

    while(True):

        random.shuffle(final_list)

        final_list[0]='logo.jpg'

        real_final_list=[]
    
        for v in final_list:
            if v not in real_final_list:
                real_final_list.append(v)
            
        print(real_final_list)
    
        for i in real_final_list:
            mouseClickChecker=1
            img = cv2.imread(i)
            
            winname = "slidshow"
            
            cv2.namedWindow(winname, cv2.WND_PROP_FULLSCREEN) ##WINDOW_NORMAL
            cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
            cv2.imshow(winname, img)

            if logoPlayChecker == 1:
                cv2.waitKey(3500)
                logoPlayChecker=2
            else:
                cv2.waitKey(100)

                for i in range(50):
                    
                    cv2.setMouseCallback(winname, clickevent)

                    if mouseClickChecker==2:
                        print(mouseClickChecker)
                        break
                    else:
                        mouseClickChecker=1
                        print(mouseClickChecker)
                        cv2.waitKey(100)

        logoPlayChecker=1


label = tk.Label(root, text='push button')

label.pack()

button = tk.Button(root, text = 'push!', command = func)

button.pack()

root.mainloop()

【问题讨论】:

    标签: python opencv tkinter


    【解决方案1】:

    Tkinter 有自己的捕获按钮按下的方法,它可能会阻止 cv2 回调。

    您可以使用 tkinter 注册回调以在 tkinter 中按下按钮

    root.bind("<Button-1>", nameOfCallbackFunction)
    

    值得注意的是,tkinter 不适用于您在 func 中定义的无限 while 循环

    要解决此问题,我建议将代码从循环中移至单击时调用的新函数。

    您还应该删除/替换任何waitKey 调用。这些将阻止 tkinter 并阻止它响应按钮按下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2011-10-26
      • 2013-05-31
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多