This commit is contained in:
yumoqing 2020-08-01 21:24:22 +08:00
parent c9510fbdf5
commit 757c080f1c
2 changed files with 120 additions and 159 deletions

View File

@ -6,7 +6,7 @@ from functools import partial
from kivy.factory import Factory
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.graphics.texture import Texture
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty, StringProperty, ListProperty,\
@ -15,45 +15,7 @@ from kivy.lang import Builder
from kivy.clock import Clock
import qrcode
Builder.load_string('''
<QRCodeWidget>
on_parent: if args[1]: qrimage.source = self.loading_image
canvas.before:
# Draw white Rectangle
Color:
rgba: root.background_color
Rectangle:
size: self.size
pos: self.pos
canvas.after:
Color:
rgba: .5, .5, .5, 1 if root.show_border else 0
Line:
width: dp(1.333)
points:
dp(2), dp(2),\
self.width - dp(2), dp(2),\
self.width - dp(2), self.height - dp(2),\
dp(2), self.height - dp(2),\
dp(2), dp(2)
Image
id: qrimage
pos_hint: {'center_x': .5, 'center_y': .5}
allow_stretch: True
size_hint: None, None
size: root.width * .9, root.height * .9
''')
class QRCodeWidget(FloatLayout):
show_border = BooleanProperty(True)
'''Whether to show border around the widget.
:data:`show_border` is a :class:`~kivy.properties.BooleanProperty`,
defaulting to `True`.
'''
data = StringProperty(None, allow_none=True)
''' Data using which the qrcode is generated.
@ -61,14 +23,6 @@ class QRCodeWidget(FloatLayout):
`None`.
'''
background_color = ListProperty((1, 1, 1, 1))
''' Background color of the background of the widget to be displayed
behind the qrcode.
:data:`background_color` is a :class:`~kivy.properties.ListProperty`,
defaulting to `(1, 1, 1, 1)`.
'''
loading_image = StringProperty('data/images/image-loading.gif')
'''Intermediate image to be displayed while the widget ios being loaded.
@ -77,23 +31,27 @@ class QRCodeWidget(FloatLayout):
'''
def __init__(self, **kwargs):
super(QRCodeWidget, self).__init__(**kwargs)
self.qrimage = Image(allow_stretch=True)
self.addr = None
super(QRCodeWidget, self).__init__(**kwargs)
self.background_color = [1,1,1,1]
self.qr = None
self._qrtexture = None
self.qrimage.pos_hint = {'center_x':0.5, 'center_y':0.5}
self.add_widget(self.qrimage)
def on_size(self,o,s):
self.qrimage.width = self.width
self.qrimage.height = self.height
self.on_data(None,self.data)
def on_data(self, instance, value):
if not (self.canvas or value):
return
img = self.ids.get('qrimage', None)
if not img:
# if texture hasn't yet been created delay the texture updation
Clock.schedule_once(lambda dt: self.on_data(instance, value))
return
img = self.qrimage
img.anim_delay = .25
img.source = self.loading_image
Thread(target=partial(self.generate_qr, value)).start()
self.generate_qr(value)
def generate_qr(self, value):
self.set_addr(value)
@ -122,16 +80,17 @@ class QRCodeWidget(FloatLayout):
)
qr.add_data(addr)
qr.make(fit=True)
except Exception as e:
print(e)
self.qr=None
self.qr = qr
self.update_texture()
except Exception as e:
print('eeeee',e)
self.qr=None
def setMinimumSize(self, size):
# currently unused, do we need this?
self._texture_size = size
def _create_texture(self, k, dt):
def _create_texture(self, k):
self._qrtexture = texture = Texture.create(size=(k,k), colorfmt='rgb')
# don't interpolate texture
texture.min_filter = 'nearest'
@ -143,10 +102,7 @@ class QRCodeWidget(FloatLayout):
matrix = self.qr.get_matrix()
k = len(matrix)
# create the texture in main UI thread otherwise
# this will lead to memory corruption
Clock.schedule_once(partial(self._create_texture, k), -1)
self._create_texture(k)
cr, cg, cb, ca = self.background_color[:]
@ -161,7 +117,7 @@ class QRCodeWidget(FloatLayout):
# join not neccesarry when using a byte array
# buff =''.join(map(chr, buff))
# update texture in UI thread.
Clock.schedule_once(lambda dt: self._upd_texture(buff))
self._upd_texture(buff)
def _upd_texture(self, buff):
texture = self._qrtexture
@ -172,7 +128,7 @@ class QRCodeWidget(FloatLayout):
texture.blit_buffer(buff, colorfmt='rgb', bufferfmt='ubyte')
texture.flip_vertical()
img = self.ids.qrimage
img = self.qrimage
img.anim_delay = -1
img.texture = texture
img.canvas.ask_update()
@ -183,4 +139,8 @@ if __name__ == '__main__':
from kivy.app import runTouchApp
import sys
data = str(sys.argv[1:])
runTouchApp(QRCodeWidget(data=data))
data = """{
"host":"122.22.22.33",
"port":12345
}"""
runTouchApp(Factory.QRCodeWidget(data=data))

View File

@ -250,15 +250,16 @@ class OSC_VPlayer(BaseVPlayer):
self.map('/next',self.next)
self.map('/previous',self.previous)
t = threading.Thread(target=self.server.serve_forever)
t.daemon_threads = True
t.start()
self.fullscreen = True
label = Label(text='%s %d' % (self.ip,self.port), font_size=CSize(2))
label.x = self.width - label.width, 0
label.y = 0
self.add_widget(label)
def osc_server_quit(self):
self.server.shutdown()
self.server.server_close()
def __del__(self):
self.server.server_close()
print("*******************VPlayer deleted**********")
self.quit()
def map(self,p,f):
self.dispatcher.map(p,f,None)