![](/img/trans.png)
[英]Python Kivy. The label does not have a text, however, i assigned it's value to the variable
[英]Python Kivy. How to change the Label text to the text on the button that have been pressed?
我有一些按钮,如果按下按钮-屏幕会发生变化,在新屏幕上有一个标签,显示已按下按钮上的文本。
当一切看起来正确时,它不起作用。
蟒蛇
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.lang import Builder
from kivy.uix.button import Button
class ScreenOne(Screen):
pass
class ScreenTwo(Screen):
def on_pre_enter(self, *args):
btn = Button(text = "word is here", on_release =self.pressedFunction)
self.ids.container.add_widget(btn)
btn1 = Button(text = "another word is here", on_release =self.pressedFunction)
self.ids.container.add_widget(btn1)
def pressedFunction(self, instance, *args):
self.manager.current= "three"
screenThree = ScreenThree()
text = str(instance.text)
screenThree.changing_label(text)
class ScreenThree(Screen):
def changing_label(self, text):
self.ids.my_label.text = text
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("example.kv")
class MainApp(App):
def build(self):
return presentation
if __name__ == "__main__":
MainApp().run()
Kivy
ScreenManagement:
ScreenOne:
ScreenTwo:
ScreenThree:
<ScreenOne>:
BoxLayout:
Button:
text: "press me"
on_release: app.root.current = "two"
<ScreenTwo>:
name: "two"
BoxLayout:
id: container
<ScreenThree>:
name: "three"
BoxLayout:
id: labelContainer
Label:
text: ""
产量
File "example.py", line 28, in changing_label
self.ids.my_label.text = text
File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__
AttributeError: 'super' object has no attribute '__getattr__'
您的.kv文件中不存在“ my_label”,请在您要进行这些更改的标签上添加一个ID。
<ScreenThree>:
name: "three"
BoxLayout:
id: labelContainer
Label:
id: my_label
text: ""
在kv文件中,缺少id: my_label
。
屏幕切换后, self.manager.current = "three"
的my_label.text
完成, self.manager.current = "three"
。
ScreenThree实例化了两次。 第一个实例由ScreenThree:
在kv文件中创建ScreenThree:
这等效于Python代码中的ScreenThree()
)。 第二个实例是用Python代码创建的screenThree = ScreenThree()
。
my_label.text
位于第二个实例/对象中,而不是在第一个实例中。 因此,ScreenThree是空白/黑色窗口,因为应用程序按照kv文件(即ScreenThree的第一个实例)使用视图。
如果添加id()
函数,它将在屏幕上显示不同的内存位置。
def pressedFunction(self, instance, *args):
self.manager.current = "three"
self.debug()
screenThree = ScreenThree()
print("screenThree={0}, id(screenThree)={1}".format(screenThree, id(screenThree)))
self.debug()
text = str(instance.text)
screenThree.changing_label(text)
def debug(self):
print("\ndebug:")
print("\tself.manager.screen_names=", self.manager.screen_names)
print("\tself.manager.screens=", self.manager.screens)
for x in self.manager.screens:
print("\t\tscreen={0}, id(screen)={1}".format(x, id(x)))
ScreenTwo:
下添加id: screen_two
。 这将用于引用ScreenTwo中的类属性/方法。 app.root.current = "two"
替换root.manager.current = "two"
因为默认情况下每个屏幕都有一个属性manager
Label:
下添加id: my_label
Label:
from kivy.properties import StringProperty
添加import语句from kivy.properties import StringProperty
text = StringProperty('')
因此不需要传递参数也不需要封装。 text = str(instance.text)
替换为self.text = str(instance.text)
changing_label()
方法重命名为on_pre_enter()
方法,然后从参数列表中删除text
。 self.ids.my_label.text = text' with
替换self.ids.my_label.text = text' with
self.ids.my_label.text = self.manager.ids.screen_two.text` return Builder.load_file("example.kv")
替换return presentation
,并删除presentation = Builder.load_file("example.kv")
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.properties import StringProperty
class ScreenOne(Screen):
pass
class ScreenTwo(Screen):
text = StringProperty('')
def on_pre_enter(self, *args):
print("\nScreenTwo.on_pre_enter:")
btn = Button(text = "word is here", on_release =self.pressedFunction)
self.ids.container.add_widget(btn)
btn1 = Button(text = "another word is here", on_release =self.pressedFunction)
self.ids.container.add_widget(btn1)
def pressedFunction(self, instance, *args):
self.text = str(instance.text) # populate before switching screen
self.manager.current = "three" # switch screen
class ScreenThree(Screen):
def on_pre_enter(self, *args):
self.ids.my_label.text = self.manager.ids.screen_two.text
class ScreenManagement(ScreenManager):
pass
class MainApp(App):
def build(self):
return Builder.load_file("example.kv")
if __name__ == "__main__":
MainApp().run()
#:kivy 1.11.0
ScreenManagement:
ScreenOne:
ScreenTwo:
id: screen_two
ScreenThree:
<ScreenOne>:
BoxLayout:
Button:
text: "press me"
on_release: root.manager.current = "two" # every screen has a default property manager
<ScreenTwo>:
name: "two"
BoxLayout:
id: container
<ScreenThree>:
name: "three"
BoxLayout:
id: labelContainer
Label:
id: my_label
text: ""
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.