Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Kivy:添加屏幕后,我的标签文本没有更新_Python_Arduino_Kivy - Fatal编程技术网

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屏幕
    for
    main屏幕:
  • 删除
    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()