在QrCodeScanner App中修复相机和刷新屏幕

时间:2019-05-30 09:10:45

标签: python kivy qr-code

我正在尝试创建QrCode Scanner App。扫描和解码过程正常进行。我的问题是我想以奇特形象显示此应用程序。因此,有CameraScreen显示摄像机。当方法扫描和解码结束时,应用程序切换屏幕,并显示带有Resoult标签的ResoultsScreen和返回扫描按钮。问题是,即使在第一个屏幕上,相机也只是白色,什么也没显示。第二个问题是,当有结果时,我不知道如何刷新第二屏。

我已经尝试使用Clock.schedule_interval()刷新第二个屏幕,但是我不知道该在哪里放置它以及如何使用它。

from __future__ import print_function
import kivy
import pyzbar.pyzbar as pyzbar
import numpy as np
import threading
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.properties import StringProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import *
from kivy.uix.button import *
from kivy.uix.camera import Camera
from cv2 import *
from PIL import Image
from pyzbar.pyzbar import decode
from time import *
from kivy.clock import Clock
kivy.require("1.10.1")

results = []
cam = VideoCapture(0)

def decode(im) :
  # Find barcodes and QR codes
  decodedObjects = pyzbar.decode(im)

  # Print results
  for obj in decodedObjects:
      print('Type : ', obj.type)
      print('Data : ', obj.data.decode('utf-8'),'\n')
      wynik_data.append(obj.data.decode('utf-8'))
  return decodedObjects

def skan():
    while True:
        jug = 0
        s, img = cam.read()
        if s:    # frame captured without any errors
            #namedWindow("cam-test")
            #imshow("cam-test",img)
            waitKey(66)
            #destroyWindow("cam-test")
            imwrite("/home/michal/filename.jpg",img) #save image
        data = decode(Image.open('/home/michal/filename.jpg'))
        print(data)
        # Read image
        im = imread("/home/michal/filename.jpg")

        decodedObjects = decode(im)
        if decodedObjects != []:
            jug = 1
        if jug > 0 :
            break

tlo = threading.Thread(name = 'skan', target = skan)

class CameraScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        kamera = Camera()
        kamera.play = True
#       kamera = Label(text = 'kamera',
#       size_hint=(0.5, .25),
#       pos_hint={'left':0,'top':1}
#       )
        self.add_widget(kamera)
        przycisk1 = Button(text = 'do wyniku',
        size_hint=(1, .25),
        pos_hint={'right':1, 'bottom':0}
        )
        przycisk1.bind(on_press = self.przelaczenie)
        self.add_widget(przycisk1)
    def przelaczenie(self,*args):
        self.manager.current = 'screen2'

class WynikScreen(Screen):
    scan_results = StringProperty('Nothing')
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        lbl = Label(text = self.wynik_skanu,
        size_hint=(0.5, .25),
        pos_hint={'left':0,'top':1}
        )
        back = Button(text = 'to scan',
        size_hint=(.5, .25),
        pos_hint={'right':1, 'bottom':0}
        )
        back.bind(on_press = self.backf)
        self.add_widget(lbl)
        self.add_widget(back)
    def backf(self, *args):
        self.manager.current = 'screen1'
    def change(self):
        while True:
            if jug == 1:
                self.scan_results = str(results[0])

class Aplikacja(App):
    def build(self):
        #tlo.start()
        sm = ScreenManager()
        sc1 = CameraScreen(name='screen1')
        sc2 = WynikScreen(name='screen2')
        sm.add_widget(sc1)
        sm.add_widget(sc2)
        return sm

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

0 个答案:

没有答案