在 guizero 中运行一个函数一段时间而不冻结 GUI

如何解决在 guizero 中运行一个函数一段时间而不冻结 GUI

我正在使用 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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?