Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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

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 3.x 无法在kivy窗口中显示arduino数据_Python 3.x_Arduino_Kivy - Fatal编程技术网

Python 3.x 无法在kivy窗口中显示arduino数据

Python 3.x 无法在kivy窗口中显示arduino数据,python-3.x,arduino,kivy,Python 3.x,Arduino,Kivy,我试图在标签下的kivy窗口中显示我的arduino数据,但它显示错误“ValueError:label.text仅接受str”。有人能帮忙吗? 下面是我的python kivy文件 test.py文件 test.kv文件 WindowManager: MainWindow: <MainWindow>: Label: size: 75, 50 size_hint: None, None pos_hint: {'ri

我试图在标签下的kivy窗口中显示我的arduino数据,但它显示错误“ValueError:label.text仅接受str”。有人能帮忙吗?

下面是我的python kivy文件

test.py文件 test.kv文件

WindowManager:
    MainWindow:

<MainWindow>:

    Label:
        size: 75, 50
        size_hint: None, None
        pos_hint: {'right': 1, 'bottom': 1}
        background_color: (1.0, 0.0, 0.0, 1.0)
        text: root.x
WindowManager:
主窗口:
:
标签:
尺码:75,50
大小提示:无,无
位置提示:{'right':1,'bottom':1}
背景颜色:(1.0,0.0,0.0,1.0)
文本:root.x

我在您的示例中看到一些问题

  • 命名变量时要小心<例如,code>x几乎总是小部件的
    NumericProperty
  • 在python中引用属性时,请使用
    self
    ,否则在您的情况下,小部件
    x
    将不会更改
  • 当您在kivy中有一个循环时,您将阻止该应用程序。因此,您可以使用
    时钟
    线程
    。我建议在使用串行时使用
    threading
    而不是
    Clock
    ,因为
    readline()
    在等待输入时也会阻止应用程序
  • 您从未真正调用
    tm()
  • 下面是我将在
    MainWindow
    类中更改的内容,以及一些其他导入

    import serial
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import Screen, ScreenManager
    from kivy.uix.button import Button
    from kivy.properties import StringProperty
    from kivy.clock import mainthread
    import threading
    
    
    KV = """
    
    WindowManager:
        MainWindow:
    
    <MainWindow>:
    
        Label:
            size: 75, 50
            size_hint: None, None
            pos_hint: {'right': 1, 'bottom': 1}
            background_color: (1.0, 0.0, 0.0, 1.0)
            text: root.label_text
    
    """
    
    
    class MainWindow(Screen):
        label_text = StringProperty("")
    
        def __init__(self, **kwargs):
            super(MainWindow, self).__init__(**kwargs)
            threading.Thread(target=self.tm).start()
    
        def tm(self):
            while (1):
                with serial.Serial('COM4', 9600) as ser:
                    value = ser.readline()
                    ser.close()
                    self.update_label(value.decode("ascii").strip())
    
        @mainthread
        def update_label(self, value):
            self.label_text = value
    
    class WindowManager(ScreenManager):
        pass
    
    
    class MyMainApp(App):
        def build(self):
            return Builder.load_string(KV)
    
    if __name__ == "__main__":
        MyMainApp().run()
    
    导入序列号
    从kivy.app导入应用程序
    从kivy.lang导入生成器
    从kivy.uix.screenmanager导入屏幕,screenmanager
    从kivy.uix.button导入按钮
    从kivy.properties导入StringProperty
    从kivy.clock导入主线程
    导入线程
    KV=”“”
    WindowManager:
    主窗口:
    :
    标签:
    尺码:75,50
    大小提示:无,无
    位置提示:{'right':1,'bottom':1}
    背景颜色:(1.0,0.0,0.0,1.0)
    text:root.label\u text
    """
    类主窗口(屏幕):
    label\u text=StringProperty(“”)
    定义初始(自我,**kwargs):
    超级(主窗口,自我)。\uuuuu初始化(**kwargs)
    threading.Thread(target=self.tm).start()
    def tm(自我):
    而(一):
    使用serial.serial('COM4',9600)作为ser:
    value=ser.readline()
    塞尔克洛斯()
    self.update_标签(value.decode(“ascii”).strip())
    @主线
    def更新_标签(自身,值):
    self.label_text=值
    类WindowManager(屏幕管理器):
    通过
    类MyMainApp(应用程序):
    def生成(自):
    返回生成器。加载字符串(KV)
    如果名称=“\uuuuu main\uuuuuuuu”:
    MyMainApp().run()
    

    在另一个线程中更改任何ui元素时,请确保使用
    mainthread
    。在这种情况下,当您更改将更改显示的stringproperty时。

    感谢您的响应!但是我不能打开窗口,但是程序可以运行什么是KV=''for@Budaksesat2000哦,是的,对不起。让我举一个更完整的例子。我已经更改了它,现在您应该可以复制、粘贴并运行。KV只是一个字符串,而不是一个文件,
    Builder.load\u string
    。对我来说,在一个文件中做一个例子更容易。谢谢兄弟!但是,我得到了一个错误“ValueError:MainWindow.label\u text只接受str”,所以我将self.update\u label(value)更改为self.update\u label(str(value)),它就工作了!然而,显示是这样的b'26.90\n.@Budaksesat2000 Ah yea python3。decode()和strip()。我看你在新问题中已经解决了。
    import serial
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import Screen, ScreenManager
    from kivy.uix.button import Button
    from kivy.properties import StringProperty
    from kivy.clock import mainthread
    import threading
    
    
    KV = """
    
    WindowManager:
        MainWindow:
    
    <MainWindow>:
    
        Label:
            size: 75, 50
            size_hint: None, None
            pos_hint: {'right': 1, 'bottom': 1}
            background_color: (1.0, 0.0, 0.0, 1.0)
            text: root.label_text
    
    """
    
    
    class MainWindow(Screen):
        label_text = StringProperty("")
    
        def __init__(self, **kwargs):
            super(MainWindow, self).__init__(**kwargs)
            threading.Thread(target=self.tm).start()
    
        def tm(self):
            while (1):
                with serial.Serial('COM4', 9600) as ser:
                    value = ser.readline()
                    ser.close()
                    self.update_label(value.decode("ascii").strip())
    
        @mainthread
        def update_label(self, value):
            self.label_text = value
    
    class WindowManager(ScreenManager):
        pass
    
    
    class MyMainApp(App):
        def build(self):
            return Builder.load_string(KV)
    
    if __name__ == "__main__":
        MyMainApp().run()