I'm using kivy 1.11.0 with python 2.7.15.
#-*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.image import Image
from kivy.lang import Builder
Builder.load_string("""
<InitScreen>:
AnchorLayout:
anchor_x:"center"
anchor_y:"center"
Label:
text:"init"
<WaitScreen>:
Image:
id:charactor
pos_hint:{'center_x':.5,'y':0 }
size_hint:1,1
source:'./wait1.png'
""")
class Charactor(Image):
pass
class InitScreen(Screen):
pass
class WaitScreen(Screen):
def __init__(self, **kwargs):
super(WaitScreen, self).__init__(**kwargs)
class View(App):
sm = ScreenManager()
cli = mqtt.Client(protocol=mqtt.MQTTv311)
def __init__(self, **kwargs):
super(View, self).__init__(**kwargs)
def build(self):
self.sm.add_widget(InitScreen(name='init'))
self.sm.current='init'
return self.sm
def on_start(self):
self.cli.on_connect = self.on_connect
self.cli.on_message = self.on_message
self.cli.connect('localhost', port=1883, keepalive=60)
self.cli.loop_start()
def on_connect(self,client, userdata, flags, respons_code):
print('status {0}'.format(respons_code))
client.subscribe('get/test')
def on_message(self,client, userdata, msg):
self.changeScreen()
def changeScreen(self,**kwargs):
self.sm.add_widget(WaitScreen(name='wait'))
self.sm.current='wait'
if __name__ == '__main__':
View().run()
if get message(on_message), change screen
but error happed
Fatal Python error: (pygame parachute) Segmentation Fault
i think detected the cause of error have Image. When on_message load Image source, error happened I think paho.mqtt callback(on_message,on_connect) is doubtful
because When self.changeScreen() is in def on_start,def build, error not happened
below code is error has not happened
class View(App):
sm = ScreenManager()
cli = mqtt.Client(protocol=mqtt.MQTTv311)
waitflag = False
def __init__(self, **kwargs):
super(View, self).__init__(**kwargs)
def build(self):
self.sm.add_widget(InitScreen(name='init'))
self.sm.current='init'
return self.sm
def on_start(self):
self.cli.on_connect = self.on_connect
self.cli.on_message = self.on_message
self.cli.connect('localhost', port=1883, keepalive=60)
self.cli.loop_start()
Clock.schedule_interval(self.changeScreen, 1)
def on_connect(self,client, userdata, flags, respons_code):
print('status {0}'.format(respons_code))
client.subscribe('get/test')
def on_message(self,client, userdata, msg):
self.waitflag = True
def changeScreen(self,dt):
if self.waitflag:
self.sm.add_widget(WaitScreen(name='wait'))
self.sm.current='wait'
self.waitflag = False
but this code feel bad.because if WaitScreen don't use Image source, error not happened
Please tell me how to avoid errors. i want to use upper code