Python 3.x 无法在kivy窗口中显示arduino数据
我试图在标签下的kivy窗口中显示我的arduino数据,但它显示错误“ValueError:label.text仅接受str”。有人能帮忙吗? 下面是我的python kivy文件 test.py文件 test.kv文件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
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
我在您的示例中看到一些问题
NumericProperty
self
,否则在您的情况下,小部件x
将不会更改时钟
或线程
。我建议在使用串行时使用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()