英文:
Need a way to exit a loop(something like a interrupt) for PySimpleGUI
问题
以下是翻译好的代码部分:
我正在尝试编写一个类似于包含的流程图的代码,但我在退出最后一个循环时遇到了问题。任何帮助都将不胜感激[项目流程图](https://i.stack.imgur.com/bxIbG.jpg)。
我们通过在PySimpleGui上定义的按钮“启动检测”进入最后一个循环。我希望能够通过按下定义为“停止检测”的按钮退出此循环,但如果不包括window.read()函数,我无法按下停止检测按钮,而且我们会进入无限循环。如果我包括window.read()函数,最后一部分代码将只运行一次,而不是所期望的循环。
最后一个循环的代码如下:
while(1):
event,values = window.read()
if event in (None,'Quit'):
break
elif event == 'Filter Settings':
changefitersettings()
## 在此处插入项目检测的图像
print('查看停车场')
elif event == 'Lot Settings':
sct_img = sct.grab(bounding_box)
getcountvalues = changeImage(x,np.array(sct_img))
Settings()
print('已按下停车场设置')
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
# 按 'q' 键退出
if k == ord('q'):
break
cv.destroyAllWindows()
希望这有所帮助!如果您需要进一步的翻译或解释,请告诉我。
英文:
I am trying to write a code that functions like the included flow chart, but I have having issues exiting the last loop. Any help is appreciatedProject Flowchart.
We enter the final loop by pressing the defined button defined as 'Start Detection' on PySimpleGui. I want to be able to exit this loop by pressing a button defined as 'Stop Detection' , but without the window.read() function I cannot press the stop detection button and we are in a endless loop. If i include the window.read function the last bit of code will only run once and not in a loop as desired.
Code for the last loop is here:
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()
答案1
得分: 1
以下是您要翻译的部分:
"It's better to use multithread if you have another job to do and it take long time."
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()
希望这对您有所帮助!
英文:
It's better to use multithread if you have another job to do and it take long time.
Demo code
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()
答案2
得分: 0
如果我们查看API,我们会看到以下内容:
read
- 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一个机会来读取“Stop Detection”按钮上的鼠标点击事件。
此外,请注意,还有一个名为 window.perform_long_operation()
的方法,可以进行后台处理,这可能是处理这个问题的更整洁的方式?
英文:
If we look at the API we see this:
> read
> * THE biggest deal method in the Window class! This is how you get all of your data from your Window. Pass in a timeout (in milliseconds) to wait for a maximum of timeout milliseconds. Will return timeout_key if no other GUI events happen first.
>
>
> read(timeout = None,
> timeout_key = "__TIMEOUT__",
> close = False)
>
Now, the default window.read()
means having an infinite timeout, so you see the program basically hanging waiting for the keypress. However, the timeout
is the number of milliseconds to wait before returning the timeout_key
to your event
variable, similar to later when you use cv.waitKey(1)
. So use something like this:
event,values = window.read(1)
This gives the GUI a chance to read mouse clicks on the "Stop Detection" button.
Also note that there is a method window.perform_long_operation()
that does background processing, which might be a neater way of tackling this?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论