Python Kivy:添加屏幕后,我的标签文本没有更新
因此,我想通过Python Kivy:添加屏幕后,我的标签文本没有更新,python,arduino,kivy,Python,Arduino,Kivy,因此,我想通过串行端口从我的Arduino读取数据,并将读取的数据更新为标签文本以显示。当我只有简单的代码可以读取和更新时,它就工作了,但是当我添加屏幕管理器和屏幕时,它停止更新文本 最终,我将需要有不同的动画根据我收到的数据,这是更多的测试,如果这个功能的工作 提前谢谢 这是我的全部代码 import os os.environ['KIVY_GL_BACKEND'] ='gl' from kivy.app import App from kivy.lang import Builder fr
串行端口
从我的Arduino
读取数据,并将读取的数据更新为标签文本以显示。当我只有简单的代码可以读取和更新时,它就工作了,但是当我添加屏幕管理器
和屏幕
时,它停止更新文本
最终,我将需要有不同的动画根据我收到的数据,这是更多的测试,如果这个功能的工作
提前谢谢
这是我的全部代码
import os
os.environ['KIVY_GL_BACKEND'] ='gl'
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import (NumericProperty, StringProperty, ReferenceListProperty, ObjectProperty, ListProperty)
from kivy.clock import Clock
from kivy.vector import Vector
from kivy.core.text import LabelBase
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
LabelBase.register(name='Sans',fn_regular="Sansation-Regular.ttf")
import serial
kivy = Builder.load_string("""
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
<MyManager>:
transition: FadeTransition()
MainScreen:
OperationScreen:
<MainScreen>:
name: 'main'
Label:
text: 'Welcome'
font_size: 40
on_touch_up : app.root.current = 'operation'
Label:
text: 'dafault'
font_size: 20
pos: -200,-100
id: data_label
<OperationScreen>:
name: 'operation'
Label:
text: 'Youre in'
font_size: 40
""")
class OperationScreen(Screen):
pass
class MainScreen(Screen):
def __init__(self,**kwargs):
super(MainScreen,self).__init__(**kwargs)
def Read(self,dt):
Clock.unschedule(self.Read)
data = arduino.readline()
if data != '':
self.ids.data_label.text = data
Clock.schedule_once(self.Read)
pass
class MyManager(ScreenManager):
pass
class mainApp(App):
Main = MainScreen()
def build(self):
Clock.schedule_once(self.Main.Read)
return MyManager()
if __name__ == '__main__':
try:
arduino = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
except:
print("failed to connect")
mainApp().run()
导入操作系统
os.environ['KIVY\u GL\u BACKEND']='GL'
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.widget导入widget
从kivy.properties导入(NumericProperty、StringProperty、ReferenceListProperty、ObjectProperty、ListProperty)
从kivy.clock导入时钟
从kivy.vector导入向量
从kivy.core.text导入LabelBase
从kivy.uix.screenmanager导入screenmanager、Screen、FadeTransition
LabelBase.register(name='Sans',fn_regular=“Sansation regular.ttf”)
导入序列号
kivy=Builder.load_字符串(“”)
#:导入FadeTransition kivy.uix.screenmanager.FadeTransition
:
转换:FadeTransition()
主屏幕:
操作屏幕:
:
名称:'main'
标签:
文字:“欢迎”
字体大小:40
触摸时:app.root.current='operation'
标签:
文字:“dafault”
字体大小:20
位置:-200,-100
id:数据标签
:
名称:“操作”
标签:
短信:“你在”
字体大小:40
""")
类操作屏幕(屏幕):
通过
类主屏幕(屏幕):
定义初始(自我,**kwargs):
超级(主屏幕,自我)。\uuuuu初始化(**kwargs)
def读取(自身,dt):
非计划时钟(自读)
data=arduino.readline()
如果数据!='':
self.ids.data\u label.text=数据
时钟。计划一次(自读)
通过
类MyManager(屏幕管理器):
通过
类主应用程序(应用程序):
Main=MainScreen()
def生成(自):
Clock.schedule_一次(self.Main.Read)
返回MyManager()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
arduino=serial.serial('/dev/ttyACM0',9600,超时=1)
除:
打印(“连接失败”)
mainApp().run()
我希望带有文本“default”的标签会相应地更改,但它只是因为“default”问题而冻结了
当你的应用程序运行时,有两个类主屏幕的实例。一个是在kv文件中实例化的。另一个是在class mainApp
中手动实例化的,Main=MainScreen()
方法Read()
的调度在手动创建的实例中,Main=MainScreen()
没有与此方法关联的模式视图
解决方案
- 在kv文件中,添加
id:main\u屏幕formain屏幕:
- 删除
class mainApp中的Main=MainScreen()
- 为类MyManager()实现构造函数
- 将调度从
class mainApp
移动到class MyManager()的构造函数中
- 在您的情况下,最好使用
Clock.create\u trigger()
而不是Clock.schedule\u once()
- 取消时钟事件的正确方法是
event.cancel()
或Clock.unschedule(event)
例子
main.py
导入操作系统
os.environ['KIVY\u GL\u BACKEND']=“GL”
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.widget导入widget
从kivy.properties导入(NumericProperty、StringProperty、ReferenceListProperty、ObjectProperty、ListProperty)
从kivy.clock导入时钟
从kivy.vector导入向量
从kivy.core.text导入LabelBase
从kivy.uix.screenmanager导入screenmanager、Screen、FadeTransition
#LabelBase.register(name='Sans',fn_regular=“Sansation regular.ttf”)
导入序列号
kivy=Builder.load_字符串(“”)
#:导入FadeTransition kivy.uix.screenmanager.FadeTransition
:
转换:FadeTransition()
主屏幕:
id:主屏幕
操作屏幕:
:
名称:'main'
标签:
文字:“欢迎”
字体大小:40
触摸时:app.root.current='operation'
标签:
文字:“dafault”
字体大小:20
位置:-200,-100
id:数据标签
:
名称:“操作”
标签:
短信:“你在”
字体大小:40
""")
类操作屏幕(屏幕):
通过
类主屏幕(屏幕):
def读取(自身,dt):
数据=str(dt)
#data=arduino.readline()
如果数据!='':
self.ids.data\u label.text=数据
self.manager.event_触发器()
其他:
self.manager.event_trigger.cancel()
类MyManager(屏幕管理器):
事件\触发器=对象属性(无)
定义初始(自我,**kwargs):
超级(我的经理,自我)。\uuuuu初始化(**kwargs)
self.event\u trigger=Clock.create\u trigger(self.ids.main\u screen.Read)
self.event_触发器()
类主应用程序(应用程序):
def生成(自):
返回MyManager()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#尝试:
#arduino=serial.serial('/dev/ttyACM0',9600,超时=1)
#除:
#打印(“连接失败”)
mainApp().run()
输出
谢谢你的回答!你能告诉我什么时候我们应该使用def\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuself,**kwargs:
和super(MyManager,self)。\uuuuu init\uuuuuuuuuuuugs(**kwargs)
实现一个构造函数\uuuuuu init\uuuuuuuuuuuuuuuurgs()
。例如,初始化类属性、接收调用方传递的参数、创建事件触发器等。请记住接受和/或向上投票。非常感谢。
import os
os.environ['KIVY_GL_BACKEND'] = 'gl'
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import (NumericProperty, StringProperty, ReferenceListProperty, ObjectProperty, ListProperty)
from kivy.clock import Clock
from kivy.vector import Vector
from kivy.core.text import LabelBase
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
# LabelBase.register(name='Sans', fn_regular="Sansation-Regular.ttf")
import serial
kivy = Builder.load_string("""
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
<MyManager>:
transition: FadeTransition()
MainScreen:
id: main_screen
OperationScreen:
<MainScreen>:
name: 'main'
Label:
text: 'Welcome'
font_size: 40
on_touch_up : app.root.current = 'operation'
Label:
text: 'dafault'
font_size: 20
pos: -200,-100
id: data_label
<OperationScreen>:
name: 'operation'
Label:
text: 'Youre in'
font_size: 40
""")
class OperationScreen(Screen):
pass
class MainScreen(Screen):
def Read(self, dt):
data = str(dt)
# data = arduino.readline()
if data != '':
self.ids.data_label.text = data
self.manager.event_trigger()
else:
self.manager.event_trigger.cancel()
class MyManager(ScreenManager):
event_trigger = ObjectProperty(None)
def __init__(self, **kwargs):
super(MyManager, self).__init__(**kwargs)
self.event_trigger = Clock.create_trigger(self.ids.main_screen.Read)
self.event_trigger()
class mainApp(App):
def build(self):
return MyManager()
if __name__ == '__main__':
# try:
# arduino = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
# except:
# print("failed to connect")
mainApp().run()