单击按钮时 kivy 加载相机(zbarscan)

2023-12-12

我刚刚开始我的第一个 kivy 应用程序。该应用程序旨在从“开始扫描”按钮启动,然后显示使用 ZBarCam 构建的 QR 扫描仪。

我正在使用 ScreensScreenManager要从按钮视图更改为相机视图(使用 zbarcam),问题是我意识到相机是从一开始就初始化的,因此在单击按钮之前相机已经打开(我知道这一点是因为从相机已打开)。

我不知道在这种情况下是否不应使用 Screen,或者是否有办法告诉应用程序不要初始化所有屏幕。

我正在使用的代码如下:

QrApp.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen


class QrReader(Screen):
    pass

class ScanButton(Screen):
    pass

class QrApp(App):
    pass

if __name__ == '__main__':
    QrApp().run()

qrapp.kv:

ScreenManager:
    id: screen_manager
    ScanButton:
        id: scan_btn
        name: 'scan_btn'
        manager: 'screen_manager'
    QrReader:
        id: qr_reader
        name: 'qr_reader'
        manager: 'screen_manager'


<ScanButton>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text:'Start Scan'
            font_size:"50sp"
            color: [0, 255, 255, .67]
            on_press: app.root.current = 'qr_reader'

<QrReader>:
    #:import ZBarCam kivy_garden.zbarcam.ZBarCam
    BoxLayout:
        orientation: 'vertical'
        ZBarCam:
            id:qrcodecam
        Label:
            size_hint: None, None
            size: self.texture_size[0], 50
            text: ' '.join([str(symbol.data) for symbol in qrcodecam.symbols])

Thanks!

====基于评论的替代方案(仍然失败)====

基于comment from n4321d我尝试将 ZBarCam 添加为小部件QrReader屏幕。虽然我现在可以在添加小部件时启动相机,但我不知道如何获取symbols也就是说,从 QR 中读取的文本。

这个替代代码如下:

QrApp.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen


class QrReader(Screen):
    def on_enter(self):
        from kivy_garden.zbarcam import ZBarCam
        zbarcam = ZBarCam()
        self.add_widget(zbarcam)
        self.add_widget(Label(
            text='PRINT SYMBOLS', #' '.join([str(symbol.data) for symbol in zbarcam.symbols] does not work
            size_hint=(None,None),
            size=(Window.width*0.1, Window.height*0.1),
            center=(Window.width*0.3, Window.height*0.5)))

class ScanButton(Screen):
    pass

class QrApp(App):
    pass

if __name__ == '__main__':
    QrApp().run()

qrapp.kv

ScreenManager:
    id: screen_manager
    ScanButton:
        id: scan_btn
        name: 'scan_btn'
        manager: 'screen_manager'
    QrReader:
        id: qr_reader
        name: 'qr_reader'
        manager: 'screen_manager'

<ScanButton>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text:'Start Scan'
            font_size:"50sp"
            color: [0, 255, 255, .67]
            on_press:
                app.root.current = 'qr_reader'


<QrReader>:
    BoxLayout:
        orientation: 'vertical'

======解决方案========

我的解决方法已发布作为此问题的答案here


第一的: 我还会添加一个 on_leave 函数,您可以在其中删除凸轮小部件,否则每次加载时都会不断添加新的小部件。

我现在没有可用的摄像头,所以我无法测试你的代码。看看你的代码,我认为你必须使用以下函数将 Label 中的文本绑定到 zbarcam.symbols 中的文本: self.label = Label(....); zbarcam.bind(symbols=lambda *x: setattr(self.label, "text", str(x[1]))) 或类似的东西。

这是一个使用随机文本生成器而不是 ZBarCam 的示例(因为我无法运行它)。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ListProperty
import random
from kivy.clock import Clock


kv_str = """
ScreenManager:
    id: screen_manager
    ScanButton:
        id: scan_btn
        name: 'scan_btn'
        manager: 'screen_manager'
    QrReader:
        id: qr_reader
        name: 'qr_reader'
        manager: 'screen_manager'

<ScanButton>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text:'Start Scan'
            font_size:"50sp"
            color: [0, 255, 255, .67]
            on_press:
                app.root.current = 'qr_reader'


<QrReader>:
    BoxLayout:
        orientation: 'vertical'
"""

class ZBarCam(Label):
    symbols = ListProperty([])
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_interval(self.gen_rand_text, 1)

    def gen_rand_text(self, *args):
        self.text = random.choice(['aaaaa', 'bbbbb', 'ccccc'])
        self.symbols.append(self.text)
        if len(self.symbols) > 3:
            del self.symbols[0]


class QrReader(Screen):
    def on_enter(self):
        self.zbarcam = ZBarCam()
        self.add_widget(self.zbarcam)
        self.label = Label(
            text='PRINT SYMBOLS', #' '.join([str(symbol.data) for symbol in zbarcam.symbols] does not work
            size_hint=(None,None),
            size=(Window.width*0.1, Window.height*0.1),
            center=(Window.width*0.3, Window.height*0.5))
        self.add_widget(self.label)
        self.zbarcam.bind(symbols = lambda *x: setattr(self.label, "text", str(x[1])))
    
    def on_leave(self, *args):
        self.remove_widget(self.zbarcam)
        self.remove_widget(self.label)

class ScanButton(Screen):
    pass

class QrApp(App):
    def build(self):
        return Builder.load_string(kv_str)

if __name__ == '__main__':
    QrApp().run()

如果它仍然不起作用,您可能还需要在添加后在 on_enter 方法中调用 self.zbarcam.start()

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击按钮时 kivy 加载相机(zbarscan) 的相关文章

随机推荐

  • QML:GridView 在 C++ 中更改模型后不更新

    我的起点是以下 QML 源 其 中 GridView 显示 ListModel 以及项目交换的漂亮动画 import QtQuick 1 1 GridView id mainGrid width 825 height 400 cellWid
  • 使用 xpath 从背景图像样式属性中提取值

    ii 具有以下结构 div class xGh style background image none div 我需要那个输出 name file jpg 我尝试用它answer 但不适合我 img xpath gt query subst
  • 比较 shell 脚本中的两个版本号

    我有一个文件file1如下所示 包含当前版本号和预期版本号 CurrV 1 5 2 ExpecV 1 8 1 我想编写一个 bash 脚本来比较这两个值 如果ExpecV gt CurrV那我应该echo SUCCESS 否则我应该echo
  • Numpy 数组索引和/或添加似乎很慢

    我正在对 numpy 数组进行基准测试 因为当我尝试在脚本中用 numpy 数组替换 python 数组时 结果比预期的要慢 我知道我错过了一些东西 我希望有人能澄清我的无知 我创建了两个函数并为它们计时 NUM ITERATIONS 10
  • 仅在 tumblr 博客主页上显示 div?

    我对 CSS 和 HTML 的理解相当新手 我正在尝试做一些我认为应该相对简单的事情 在我正在创建的自定义 tumblr 主题中 但我找不到简单的答案 我有一种感觉 可能有一种超级简单的方法可以在 JavaScript 中完成我想要的事情
  • 将 .cpp 文件编译为程序内部的 EXE(EXE 文件)[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想做一个程序 EXE文件 它将采用用户定义的设置并在前面提到的程序 EXE 内为用户创
  • 具有任意数量集合的 Python itertools.product

    我希望执行以下代码 temp temp append 1 2 temp append 3 4 temp append 5 6 print list itertools product temp 0 temp 1 temp 2 但是 我想以任
  • Python 替换 PHP 的标头

    如何在 python 中发送原始 http 标头 就像 PHP 中的 header 一样 在 Django 中 你会像 def someview request etc out HttpResponse outputstring mimet
  • 在 C++ 服务和用户模式应用程序崩溃后收集崩溃 .dmp 和 .hdmp 文件

    我正在使用 WinAPI 在 C MFC 中进行编码 我的软件由本地服务和用户模式应用程序组成 该应用程序为登录的 Windows 用户提供用户界面 我正在寻找一种方法来收集 dmp 和 hdmp 文件 以防这些模块中的任何一个发生崩溃 我
  • Android:下载文件并保存在 SD 卡上

    正在尝试创建一个应用程序来下载 SD 卡上的文件 这是我的代码 public class MainActivity extends Activity Override protected void onCreate Bundle saved
  • 如何使用 frexp 实现双变量的模运算符?

    我正在关注Kernighan Pike UNIX 编程环境 书中的一个练习 练习 8 2 第 241 页 要求实现模运算符 double变量在C So 4 6 2 1 0 4 4 0 3 0 1 0 因此基本上是在实施dmod using
  • 为什么具有elasticsearch状态的docker镜像总是重新启动?

    ubuntu 16 04 ram 1gb 在 aws 实例上 我必须运行旧的elasticsearch实例 所以我想使用elasticsearch 5 3 3版本的docker镜像 通过查看 stackoverflow 上多个具有相同标题的
  • 如何使 Pandas DataFrame (Python) 以二维 (2-D) 矩阵格式显示每个单元格

    我正在尝试使用 Python 中导入的 Matlab 结构创建二维 2 D 数据结构 当我使用 pandas DataFrame 时 每个单元格都包含一个矩阵 但是它们以列表格式显示 我正在尝试将其更改为矩阵格式 使用以下代码 Python
  • WebClient 与 HttpWebRequest/HttpWebResponse

    在我看来 大部分事情都可以通过HttpWebRequest Response也可以通过以下方式完成WebClient班级 我在某处读到WebClient是一个高级包装器WebRequest Response 到目前为止 我看不到任何可以完成
  • 禁用 tkinter 键盘快捷键 (2)

    我建议继续讨论禁用 tkinter 键盘快捷键 我有一个 Tkinter 也使用的事件的事件处理程序 因此我的 prog 和 Tkinter 交互很差 由于这是一个我无法解决的问题 我在这里重新提出 我尝试将其归结为以下代码中最简单的形式
  • 在 Android 中的 Horizo​​ntalScrollView 中动态插入视图

    我正在为 Android 平板电脑 3 0 开发一个应用程序 该应用程序有一个应可在水平轴上滚动的活动 如电子书 为此 我在布局上的 Horizo ntalScrollView 内使用relativelayout 这是 XML
  • Android指纹扫描仪应用程序[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我在浏览网页时看到一个应用程序声称可以扫描用户的指纹 所以我想我应该尝试一下 该应用程序运行良好 我很惊讶 有谁知道这个应用程序如何读取用户的指纹
  • 为什么即使对象创建失败,Postgres 序列项也会上升?

    我有一个 Postgres 项目 其中我的模型之一是Client只需通过其主键进行索引 我在创建客户端时遇到了问题 因为有人创建了一个客户端 同时显式设置了我读过的主键 这不会影响 Postgres 的客户端序列表 该序列表负责在任何时候自
  • Airflow:高效地执行等待(睡眠)任务

    我需要在Airflow中实现等待任务 等待时间大约需要几个小时 第一的 TimeDeltaSensor 无法正常工作 SLEEP MINUTES 1ST 11 sleep task 1 TimeDeltaSensor task id sle
  • 单击按钮时 kivy 加载相机(zbarscan)

    我刚刚开始我的第一个 kivy 应用程序 该应用程序旨在从 开始扫描 按钮启动 然后显示使用 ZBarCam 构建的 QR 扫描仪 我正在使用 ScreensScreenManager要从按钮视图更改为相机视图 使用 zbarcam 问题是