问题描述
我正在使用 Python 编写一个带有 guizero(在 RaspBerry Pi 上运行)的程序,用户可以选择饮料并使用 RFID 芯片进行识别。然后将交易存储在远程设备上的 mariadb 中。
这个想法是,用户选择一种饮料,然后屏幕在 10 秒内变为提示,要求他使用他的 RFID 芯片进行身份验证。如果没有,则软件应返回主屏幕。
到目前为止,一切正常,但我在使用 GUI 时遇到了问题。 由于 10 Second-Scan-Period 是一个 while-Loop,它会冻结整个 gui 并且不显示提示,让用户不知道他必须做什么。
我尝试过的:
- 我使用线程对象来调用扫描函数,但这导致提示消失得非常快。
- 我尝试过回调,但这意味着无论如何都会冻结我的 gui
- 我尝试了应用程序对象的重复方法并删除了 while 循环,但这意味着系统正在不间断地扫描,这并非有意为之。
from guizero import App,Text,PushButton
explanation = "To scan your chip,please click on the button."
def scan():
text.value = "Scanning...."
#set the endtime to ten seconds from Now
endtime = time.time() + 10
#repeat for ten seconds
while time.time() < endtime:
print("Scanning for RFID")
print("End of scan")
text.value = explanation
app = App("Funny Title Here")
#initial welcome text
text = Text(app,text=explanation)
#if button is clicked,change the text and scan for ten seconds
button = PushButton(app,command=scan,text="Scan")
app.display()
我知道我尝试的方法之一是正确的,但我似乎缺乏所需的逻辑。 所以我的问题是:我怎样才能实现,用户按下按钮后gui更新,开始扫描RFID卡,10秒后停止并返回原始视图?
谢谢
解决方法
我找到了解决方案! 这是我解决它的方法: 这个想法是,每 100 毫秒调用一次扫描函数。当用户单击按钮时,布尔值设置为 true 并且扫描功能执行某些操作。如果布尔值为假,则什么也不会发生。
import time
from guizero import App,Text,PushButton
explanation = "To scan your chip,please click on the button."
isScan=False
counter = 0
endtime = 0
def scan():
global isScan
if isScan:
global endtime
global counter
#repeat for ten seconds
if time.time()<endtime:
print(f"{counter}")
counter += 1
else:
isScan=False
print("End of scan")
counter = 0
text.value = explanation
def scanScreen():
global isScan
global endtime
text.value = "Scanning...."
endtime = time.time()+10
isScan = True
app = App("Funny Title Here")
#initial welcome text
text = Text(app,text=explanation)
#if button is clicked,change the text and scan for ten seconds
button = PushButton(app,command=scanScreen,text="Scan")
app.repeat(100,scan)
app.display()