Я пытаюсь создать приложение сканера QrCode.Процесс сканирования и декодирования работает корректно.Моя проблема в том, что я хочу визуализировать это приложение в киве.Так что есть CameraScreen, который показывает камеру.Когда методы сканирования и декодирования заканчиваются, приложение переключает экран и показывает ResoultsScreen с меткой Resoult и кнопкой возврата к сканированию.Проблема в том, что камера, даже если она находится на первом экране, просто белая и ничего не показывает.Вторая проблема заключается в том, что я не знаю, как обновить 2-й экран при наличии каких-либо результатов.
Я уже пытался обновить 2-й экран с помощью 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()