opencv 需要一种方法来退出PySimpleGUI的循环(类似于中断)

pnwntuvh  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(176)

我试图写一个代码,功能像包括流程图,但我有问题退出最后一个循环。任何帮助是赞赏Project Flowchart
我们通过在PySimpleGui上按下定义为“Start Detection”的按钮进入最后一个循环。我希望能够通过按下定义为“Stop Detection”的按钮退出此循环,但没有window.read()函数,我无法按下停止检测按钮,我们处于无限循环中。如果我包含窗口。read函数,代码的最后一位将只运行一次,而不是按照期望的循环。
最后一个循环的代码如下:
while(1):

event,values = window.read()
    if event in (None,'Quit'):
        break
    elif event == 'Filter Settings':
        changefitersettings()
    ## Put in an image for the item detection in here
        print('View the Parking Lot')
    elif event == 'Lot Settings':
        sct_img = sct.grab(bounding_box)
        getcountvalues = changeImage(x,np.array(sct_img))
        Settings()
        print('Lot Settings has been pressed')
        window.close
    elif event =='Start Detection':
        while(1):
            event,values = window.read()
            if event == 'Stop Detection':
                break
            else:
                sct_img = sct.grab(bounding_box)
                videoimage = changeImage(x,np.array(sct_img))
                #cv.imshow('hello1',videoimage[0])
                ServerUpdate = UpdateServer(videoimage[1],videoimage[2],videoimage[3],videoimage[4],videoimage[5],videoimage[6],videoimage[7],videoimage[8],videoimage[9],videoimage[10],videoimage[11],videoimage[12])
                k = cv.waitKey(1) & 0xFF
                # press 'q' to exit
                if k == ord('q'):
                    break
            cv.destroyAllWindows()
kse8i1jr

kse8i1jr1#

我们可以做一个whileelseloop,它依赖于eventnot'Stop Detection'

while window.read()[0] != 'Start Detection':
    event,values = window.read()
    ...
else:
    cv.destroyAllWindows()
    ...

虽然window.read()必须在每个loop中调用两次(有点蹩脚)。

webghufk

webghufk2#

如果我们查看API,我们会看到:

阅读

  • Window类中最大的处理方法!这是你从Window中获取所有数据的方法。传入一个超时(以毫秒为单位)以等待最大超时毫秒。如果没有其他GUI事件首先发生,将返回timeout_key。
read(timeout = None,
     timeout_key = "__TIMEOUT__",
     close = False)

现在,默认的window.read()意味着有一个无限的超时,所以你可以看到程序基本上挂起等待按键。然而,timeout是在将timeout_key返回到event变量之前等待的毫秒数,类似于稍后使用cv.waitKey(1)时的情况。所以使用如下内容:

event,values = window.read(1)

这使GUI有机会读取“停止检测”按钮上的鼠标点击。
还要注意,有一个方法window.perform_long_operation()可以进行后台处理,这可能是解决这个问题的更简洁的方法。

bjp0bcyl

bjp0bcyl3#

如果你有另一项工作要做,而且需要很长时间,最好使用多线程。
演示代码

import time
import datetime
import threading
import PySimpleGUI as sg

def job(window):
    global running
    while running:
        window.write_event_value('Event', datetime.datetime.now().strftime("%H:%M:%S"))
        time.sleep(0.1)

layout = [[sg.Button('Start'), sg.Button('Stop')]]
window = sg.Window('Threading', layout)
running, old = False, None

while True:

    event, values = window.read()

    if event == sg.WIN_CLOSED:
        running = False
        time.sleep(0.5)
        break

    elif event == 'Start' and not running:
        running = True
        window['Start'].update(disabled=True)
        threading.Thread(target=job, args=(window, ), daemon=True).start()

    elif event == 'Stop':
        running = False
        window['Start'].update(disabled=False)

    elif event == 'Event':
        now = values[event]
        if now != old:
            print(now)
            old = now

window.close()

相关问题