使用 pure Python 在 Kivy 中更改标签
Changing a label in Kivy using pure Python
我正在编写一个多子系统项目,其中涉及 3 个 Raspberry Pi 使用套接字通过本地网络相互聊天。在其中一个 Pis 上,我正在为 Kivy 编程 app.I 我试图在 Kivy 中获取一个标签,以便在另一个 Pis 中的一个通过套接字验证其正常时更改其文本。
.kv 文件中标签的定义:
Label:
id: distance_label
markup:True
text:"[size=40]Distance:[/size]\n\n[size=60][color=ff0000]NO[/color][/size]"
halign:"center"
valign:"top"
color:black
然后有一个完全独立的 Python 线程,我用它来操纵套接字。这会 ping 子系统,然后在成功回复时尝试更改标签:
def test_socket(self, connection):
Communication.server.send_data(connection,"VERIFY?")
data_back = Communication.server.receive_data(connection)
print data_back
if data_back == "DISTANCE!":
# set distance to OK
print "Distance is OK"
InitScreen().distance_on()
这将依次尝试触发 InitScreen class 的 distance_on() 方法。该方法似乎已被触发(如果将其放入其中,它会打印出一条小的调试消息),但令人讨厌的是,标签文本并没有改变其原始值。
class InitScreen(Screen):
........
def distance_on(self, *args):
distance_label = self.ids['distance_label']
distance_label.text = "[size=40]Distance:[/size]\n\n[size=60][color=008000]OK[/color][/size]"
print distance_label.text
在代码的另一部分中,我使用 Kivy 中的 on_event 函数来使用滑块更改标签的值。这非常有效。我试图让我的代码看起来尽可能与这个工作实例相似,唯一的区别是我没有试图从 Kivy 事件中触发,只是在 Python.
中
任何人都可以阐明一下吗?与调用另一个 class' 方法有关吗? ID 问题?
这不是一个重复的问题。建议的重复涉及从 Kivy 事件触发功能。我想从 Python 本身触发 Kivy 标签更改 - 而不是像触摸按钮这样的 Kivy 事件。
这里是所有有问题的代码。我认为这个问题与我使用 ScreenManager 的事实混淆了,但我不能不这样做!
计划:
class Communication(threading.Thread):
server = serv.Server()
def run(self):
self.setup()
while distance == False:
(connection, address) = self.awaiting_socket()
self.test_socket(connection)
def setup(self):
Communication.server.setup_server()
print "SUCCESS ON BIND"
def awaiting_socket(self):
print "AWAITING"
(connection, address) = Communication.server.socket_reception()
return (connection, address)
def test_socket(self, connection):
Communication.server.send_data(connection,"VERIFY?")
data_back = Communication.server.receive_data(connection)
print data_back
if data_back == "DISTANCE!":
# set distance to OK
print "Distance is OK"
application.InitScreen.distance_on()
#global distance
#distance = True
if data_back == "STEPPER!":
# set stepper to OK
print "Stepper is OK"
..............
class InitScreen(Screen):
def power_off(self, *args):
onoffswitch = self.ids["onoffswitch"]
onoff_value = onoffswitch.active
if onoff_value == False:
subprocess.call(powerdown)
def distance_on(self):
distance_label = self.ids["distance_label"]
distance_label.text = "[size=40]Distance:[/size]\n\n[size=60][color=008000]OK[/color][/size]"
class ScreenManagement(ScreenManager):
pass
application = Builder.load_file("main.kv")
class LidarApp(App):
def build(self):
return application
KIVY 定义屏幕管理器:
ScreenManagement:
transition: FadeTransition()
InitScreen:
MainScreen:
KIVY 定义标签有问题:
Label:
id: distance_label
markup:True
text:"[size=40]Distance:[/size]\n\n[size=60][color=ff0000]NO[/color][/size]"
on_text:
halign:"center"
valign:"top"
color:black
如test_socket
中的评论所述,您需要获取当前屏幕。为此,您需要使用 ScreenManager.current_screen
。
Builder.load_file
returns 一个屏幕管理器。这意味着您需要使用 application
全局变量。
您完成的代码:
def test_socket(self, connection):
Communication.server.send_data(connection,"VERIFY?")
data_back = Communication.server.receive_data(connection)
print data_back
if data_back == "DISTANCE!":
# set distance to OK
print "Distance is OK"
application.current_screen.distance_on()
我正在编写一个多子系统项目,其中涉及 3 个 Raspberry Pi 使用套接字通过本地网络相互聊天。在其中一个 Pis 上,我正在为 Kivy 编程 app.I 我试图在 Kivy 中获取一个标签,以便在另一个 Pis 中的一个通过套接字验证其正常时更改其文本。
.kv 文件中标签的定义:
Label:
id: distance_label
markup:True
text:"[size=40]Distance:[/size]\n\n[size=60][color=ff0000]NO[/color][/size]"
halign:"center"
valign:"top"
color:black
然后有一个完全独立的 Python 线程,我用它来操纵套接字。这会 ping 子系统,然后在成功回复时尝试更改标签:
def test_socket(self, connection):
Communication.server.send_data(connection,"VERIFY?")
data_back = Communication.server.receive_data(connection)
print data_back
if data_back == "DISTANCE!":
# set distance to OK
print "Distance is OK"
InitScreen().distance_on()
这将依次尝试触发 InitScreen class 的 distance_on() 方法。该方法似乎已被触发(如果将其放入其中,它会打印出一条小的调试消息),但令人讨厌的是,标签文本并没有改变其原始值。
class InitScreen(Screen):
........
def distance_on(self, *args):
distance_label = self.ids['distance_label']
distance_label.text = "[size=40]Distance:[/size]\n\n[size=60][color=008000]OK[/color][/size]"
print distance_label.text
在代码的另一部分中,我使用 Kivy 中的 on_event 函数来使用滑块更改标签的值。这非常有效。我试图让我的代码看起来尽可能与这个工作实例相似,唯一的区别是我没有试图从 Kivy 事件中触发,只是在 Python.
中任何人都可以阐明一下吗?与调用另一个 class' 方法有关吗? ID 问题?
这不是一个重复的问题。建议的重复涉及从 Kivy 事件触发功能。我想从 Python 本身触发 Kivy 标签更改 - 而不是像触摸按钮这样的 Kivy 事件。
这里是所有有问题的代码。我认为这个问题与我使用 ScreenManager 的事实混淆了,但我不能不这样做!
计划:
class Communication(threading.Thread):
server = serv.Server()
def run(self):
self.setup()
while distance == False:
(connection, address) = self.awaiting_socket()
self.test_socket(connection)
def setup(self):
Communication.server.setup_server()
print "SUCCESS ON BIND"
def awaiting_socket(self):
print "AWAITING"
(connection, address) = Communication.server.socket_reception()
return (connection, address)
def test_socket(self, connection):
Communication.server.send_data(connection,"VERIFY?")
data_back = Communication.server.receive_data(connection)
print data_back
if data_back == "DISTANCE!":
# set distance to OK
print "Distance is OK"
application.InitScreen.distance_on()
#global distance
#distance = True
if data_back == "STEPPER!":
# set stepper to OK
print "Stepper is OK"
..............
class InitScreen(Screen):
def power_off(self, *args):
onoffswitch = self.ids["onoffswitch"]
onoff_value = onoffswitch.active
if onoff_value == False:
subprocess.call(powerdown)
def distance_on(self):
distance_label = self.ids["distance_label"]
distance_label.text = "[size=40]Distance:[/size]\n\n[size=60][color=008000]OK[/color][/size]"
class ScreenManagement(ScreenManager):
pass
application = Builder.load_file("main.kv")
class LidarApp(App):
def build(self):
return application
KIVY 定义屏幕管理器:
ScreenManagement:
transition: FadeTransition()
InitScreen:
MainScreen:
KIVY 定义标签有问题:
Label:
id: distance_label
markup:True
text:"[size=40]Distance:[/size]\n\n[size=60][color=ff0000]NO[/color][/size]"
on_text:
halign:"center"
valign:"top"
color:black
如test_socket
中的评论所述,您需要获取当前屏幕。为此,您需要使用 ScreenManager.current_screen
。
Builder.load_file
returns 一个屏幕管理器。这意味着您需要使用 application
全局变量。
您完成的代码:
def test_socket(self, connection):
Communication.server.send_data(connection,"VERIFY?")
data_back = Communication.server.receive_data(connection)
print data_back
if data_back == "DISTANCE!":
# set distance to OK
print "Distance is OK"
application.current_screen.distance_on()