Kivy 使用 python 更改标签文本
Kivy change label text with python
我对 Python 不太满意,但对 Kivy 是全新的,我知道我的问题是引用标签 ID,但我似乎无法解决它而且搜索似乎没有给我我需要的。
我正在尝试获取一个标签来显示当前时间,所以我知道我在更新等方面有正确的框架,但我确信这一切都归结为以某种方式引用标签 ID,而且我在挣扎吗?
以下代码运行良好,显示标签等,直到我尝试更新 label_text.text
,此时我收到错误:AttributeError: 'float' object has no attribute 'lbl_time'
。我试过 str(time.strftime("%H:%M:%S"))
但这并没有解决问题。
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition, FadeTransition
from kivy.uix.anchorlayout import AnchorLayout
from kivy.properties import ObjectProperty, StringProperty
from kivy.clock import Clock
import time
from datetime import datetime
class MainScreen(Screen):
def update_time(self):
lbl_time = ObjectProperty()
MyTime = time.strftime("%H:%M:%S")
self.lbl_time.text = MyTime
class DetailScreen(Screen):
pass
class SettingsScreen(Screen):
pass
class MyScreenManager(ScreenManager):
pass
root_widget = Builder.load_string('''
MyScreenManager:
MainScreen:
DetailScreen:
SettingsScreen:
<MainScreen>:
name: 'main'
BoxLayout:
orientation: 'vertical'
Label:
id: lbl_time
text: 'Time'
font_size: 60
Label:
text: 'Main2'
font_size: 30
GridLayout:
cols: 2
Label:
text: 'Bottom'
font_size: 30
Label:
text: 'Bottom1'
font_size: 30
<DetailScreen>:
name: 'details'
<SettingsScreen>:
name: 'settings'
''')
class ScreenManagerApp(App):
def build(self):
return root_widget
def on_start(self):
Clock.schedule_interval(MainScreen.update_time, 1)
ScreenManagerApp().run()
这更像是一个 Python 问题,而不是 Kivy 问题。您调用的是 class MainScreen
class 的 update_time
,而不是 MainScreen
的 object/instance。基本上,您需要在 build
方法中保存对对象 (self.main_screen) 的引用,然后在 on_start.
中使用它
class ScreenManagerApp(App):
def build(self):
self.main_screen = MainScreen()
return self.main_screen
def on_start(self):
Clock.schedule_interval(self.main_screen.update_time, 1)
此外,您不能在 kv 语言之外访问 id,即在 python 中。您必须通过添加 属性 来引用 ID,例如the_time
:
<MainScreen>:
name: 'main'
the_time: _id_lbl_time
BoxLayout:
orientation: 'vertical'
Label:
id: _id_lbl_time
一个小问题是 update_time()
接收到参数。另外,您的代码中有很多奇怪的东西,所以我无法 运行 代码。我在下面的代码中修复了以上所有内容:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty, StringProperty
from kivy.clock import Clock
import time
from datetime import datetime
Builder.load_string('''
<MainScreen>:
name: 'main'
the_time: _id_lbl_time
BoxLayout:
orientation: 'vertical'
Label:
id: _id_lbl_time
text: 'Time'
font_size: 60
''')
class MainScreen(Screen):
def update_time(self, sec):
MyTime = time.strftime("%H:%M:%S")
self.the_time.text = MyTime
class ScreenManagerApp(App):
def build(self):
self.main_screen = MainScreen()
return self.main_screen
def on_start(self):
Clock.schedule_interval(self.main_screen.update_time, 1)
ScreenManagerApp().run()
我对 Python 不太满意,但对 Kivy 是全新的,我知道我的问题是引用标签 ID,但我似乎无法解决它而且搜索似乎没有给我我需要的。
我正在尝试获取一个标签来显示当前时间,所以我知道我在更新等方面有正确的框架,但我确信这一切都归结为以某种方式引用标签 ID,而且我在挣扎吗?
以下代码运行良好,显示标签等,直到我尝试更新 label_text.text
,此时我收到错误:AttributeError: 'float' object has no attribute 'lbl_time'
。我试过 str(time.strftime("%H:%M:%S"))
但这并没有解决问题。
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition, FadeTransition
from kivy.uix.anchorlayout import AnchorLayout
from kivy.properties import ObjectProperty, StringProperty
from kivy.clock import Clock
import time
from datetime import datetime
class MainScreen(Screen):
def update_time(self):
lbl_time = ObjectProperty()
MyTime = time.strftime("%H:%M:%S")
self.lbl_time.text = MyTime
class DetailScreen(Screen):
pass
class SettingsScreen(Screen):
pass
class MyScreenManager(ScreenManager):
pass
root_widget = Builder.load_string('''
MyScreenManager:
MainScreen:
DetailScreen:
SettingsScreen:
<MainScreen>:
name: 'main'
BoxLayout:
orientation: 'vertical'
Label:
id: lbl_time
text: 'Time'
font_size: 60
Label:
text: 'Main2'
font_size: 30
GridLayout:
cols: 2
Label:
text: 'Bottom'
font_size: 30
Label:
text: 'Bottom1'
font_size: 30
<DetailScreen>:
name: 'details'
<SettingsScreen>:
name: 'settings'
''')
class ScreenManagerApp(App):
def build(self):
return root_widget
def on_start(self):
Clock.schedule_interval(MainScreen.update_time, 1)
ScreenManagerApp().run()
这更像是一个 Python 问题,而不是 Kivy 问题。您调用的是 class MainScreen
class 的 update_time
,而不是 MainScreen
的 object/instance。基本上,您需要在 build
方法中保存对对象 (self.main_screen) 的引用,然后在 on_start.
class ScreenManagerApp(App):
def build(self):
self.main_screen = MainScreen()
return self.main_screen
def on_start(self):
Clock.schedule_interval(self.main_screen.update_time, 1)
此外,您不能在 kv 语言之外访问 id,即在 python 中。您必须通过添加 属性 来引用 ID,例如the_time
:
<MainScreen>:
name: 'main'
the_time: _id_lbl_time
BoxLayout:
orientation: 'vertical'
Label:
id: _id_lbl_time
一个小问题是 update_time()
接收到参数。另外,您的代码中有很多奇怪的东西,所以我无法 运行 代码。我在下面的代码中修复了以上所有内容:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty, StringProperty
from kivy.clock import Clock
import time
from datetime import datetime
Builder.load_string('''
<MainScreen>:
name: 'main'
the_time: _id_lbl_time
BoxLayout:
orientation: 'vertical'
Label:
id: _id_lbl_time
text: 'Time'
font_size: 60
''')
class MainScreen(Screen):
def update_time(self, sec):
MyTime = time.strftime("%H:%M:%S")
self.the_time.text = MyTime
class ScreenManagerApp(App):
def build(self):
self.main_screen = MainScreen()
return self.main_screen
def on_start(self):
Clock.schedule_interval(self.main_screen.update_time, 1)
ScreenManagerApp().run()