无法让 Widget 更新其大小
Cannot get Widget to Update its Size
我对 kivy 和一般编程还很陌生,我的代码有问题。我简化了很多以试图找到根本问题,但它似乎仍然没有用。基本上这个 kivy 文件应该生成一个橙色正方形,然后将正方形的大小更改为由 COM7 上的传感器生成的整数值。到目前为止,在启动时生成了一个正方形,并且传感器确实成功地将整数值传递给 python。我尝试更改 NumericProperty "first_rect," 的值,但无论我如何尝试重新定义 first_rect,它的值都不会改变,矩形的大小也不会改变。我感觉少了一些非常小而直接的东西,但我不确定是什么。
如有任何帮助,我们将不胜感激!
.py 文件
import serial
import time
from functools import partial
from kivy.uix.widget import Widget
from kivy.app import App
#kivy.require("1.10.0")
from kivy.clock import *
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivy.properties import ObjectProperty, NumericProperty
from kivy.properties import StringProperty
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.graphics import *
from kivy.core.window import Window
from kivy.uix.slider import Slider
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.config import Config
from kivy.lang import Builder
from functools import partial
import time
i = 10
class Bar(Widget):
pass
class Trial(Screen):
rect1 = ObjectProperty(None)
# Clock.schedule_interval(Trial().update, 1.0/60.0)
def update(self):
ser = serial.Serial('COM7', 9600, timeout=0)
thing = [0,0]
a = 1
while a==1:
Byte = ser.readline()
Byte = Byte.decode('utf-8')
Byte = Byte.strip()
Byte_proc = Byte.split(',')
if Byte_proc[0] != '':
try:
if Byte_proc[1] != '':
Byte_proc[0] = int(Byte_proc[0])
Byte_proc[1] = int(Byte_proc[1])
TestTrial_SmallApp().first_rect = Byte_proc[0]
print(TestTrial_SmallApp().first_rect)
dummy_var = int(Byte_proc[0])
print(dummy_var)
a = 0
return dummy_var
except:
pass
time.sleep(.02)
class TestTrial_SmallApp(App):
first_rect = NumericProperty(100)
def build(self):
#Builder.load_file('TestTrial.kv')
Trial().add_widget(Bar())
Clock.schedule_interval(lambda dt: Trial().update(), 1.0/60.0)
# Trial().rect1.bind(pos = (200,200))
Trial().update()
return Trial()
TestTrial_SmallApp().run()
.kv 文件
#:import utils kivy.utils
#:import Window kivy.core.window
#:import Widget kivy.uix.widget
<Trial>:
id: "trial"
rect1: bar_left
canvas.before:
Color:
rgb: 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
#Rectangle orange bars
Bar:
id: bar_left
pos: 0.25*self.center_x, 0.02*self.height
<Bar>:
canvas:
Color:
rgb: utils.get_color_from_hex('#F68C43')
Rectangle:
pos: 300, 300
size: 300, app.first_rect
在你下面的陈述中
TestTrial_SmallApp().first_rect = Byte_proc[0]
print(TestTrial_SmallApp().first_rect)
每个 TestTrial_SmallApp()
正在创建 TestTrial_SmallApp
的新实例 class.I 认为这不是您想要的。创建一个您分配给引用的实例,然后使用该引用来使用实例
app = TestTrial_SmallApp()
app.first_rect = ...
print(app.first_rect)
我对 kivy 和一般编程还很陌生,我的代码有问题。我简化了很多以试图找到根本问题,但它似乎仍然没有用。基本上这个 kivy 文件应该生成一个橙色正方形,然后将正方形的大小更改为由 COM7 上的传感器生成的整数值。到目前为止,在启动时生成了一个正方形,并且传感器确实成功地将整数值传递给 python。我尝试更改 NumericProperty "first_rect," 的值,但无论我如何尝试重新定义 first_rect,它的值都不会改变,矩形的大小也不会改变。我感觉少了一些非常小而直接的东西,但我不确定是什么。
如有任何帮助,我们将不胜感激!
.py 文件
import serial
import time
from functools import partial
from kivy.uix.widget import Widget
from kivy.app import App
#kivy.require("1.10.0")
from kivy.clock import *
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivy.properties import ObjectProperty, NumericProperty
from kivy.properties import StringProperty
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.graphics import *
from kivy.core.window import Window
from kivy.uix.slider import Slider
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.config import Config
from kivy.lang import Builder
from functools import partial
import time
i = 10
class Bar(Widget):
pass
class Trial(Screen):
rect1 = ObjectProperty(None)
# Clock.schedule_interval(Trial().update, 1.0/60.0)
def update(self):
ser = serial.Serial('COM7', 9600, timeout=0)
thing = [0,0]
a = 1
while a==1:
Byte = ser.readline()
Byte = Byte.decode('utf-8')
Byte = Byte.strip()
Byte_proc = Byte.split(',')
if Byte_proc[0] != '':
try:
if Byte_proc[1] != '':
Byte_proc[0] = int(Byte_proc[0])
Byte_proc[1] = int(Byte_proc[1])
TestTrial_SmallApp().first_rect = Byte_proc[0]
print(TestTrial_SmallApp().first_rect)
dummy_var = int(Byte_proc[0])
print(dummy_var)
a = 0
return dummy_var
except:
pass
time.sleep(.02)
class TestTrial_SmallApp(App):
first_rect = NumericProperty(100)
def build(self):
#Builder.load_file('TestTrial.kv')
Trial().add_widget(Bar())
Clock.schedule_interval(lambda dt: Trial().update(), 1.0/60.0)
# Trial().rect1.bind(pos = (200,200))
Trial().update()
return Trial()
TestTrial_SmallApp().run()
.kv 文件
#:import utils kivy.utils
#:import Window kivy.core.window
#:import Widget kivy.uix.widget
<Trial>:
id: "trial"
rect1: bar_left
canvas.before:
Color:
rgb: 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
#Rectangle orange bars
Bar:
id: bar_left
pos: 0.25*self.center_x, 0.02*self.height
<Bar>:
canvas:
Color:
rgb: utils.get_color_from_hex('#F68C43')
Rectangle:
pos: 300, 300
size: 300, app.first_rect
在你下面的陈述中
TestTrial_SmallApp().first_rect = Byte_proc[0]
print(TestTrial_SmallApp().first_rect)
每个 TestTrial_SmallApp()
正在创建 TestTrial_SmallApp
的新实例 class.I 认为这不是您想要的。创建一个您分配给引用的实例,然后使用该引用来使用实例
app = TestTrial_SmallApp()
app.first_rect = ...
print(app.first_rect)