Python基维。如何将标签文本更改为已按下按钮上的文本?

2024-10-01 04:52:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些按钮,如果我按下按钮-然后屏幕改变,在新的屏幕上有一个标签,显示的文本是在已按下的按钮。在

当一切看起来都好的时候它就不起作用了。在

Python

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()

基维

^{pr2}$

输出

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__'

Tags: textfromimportselfidsondefbutton
2条回答

问题

1。AttributeError-我的标签

在kv文件中,缺少id: my_label。在

2。填充我的屏幕之前_标签.text在

填充my_label.text是在切换屏幕后完成的,self.manager.current = "three"。在

3。屏幕三-空白/黑色窗口

屏幕三实例化两次。第一个实例由ScreenThree:在kv文件中创建(这相当于Python代码中的ScreenThree())。第二个实例是用Python代码screenThree = ScreenThree()创建的。在

my_label.text的填充在第二个实例/对象中,而不是在第一个实例中。因此,screentree是空白/黑色窗口,因为app使用的是kv文件的视图,即screentree的第一个实例。在

注:

如果添加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)))

解决方案

kv文件

  1. ScreenTwo:下添加id: screen_two。这将用于引用屏幕2中的类属性/方法。在
  2. app.root.current = "two"替换为root.manager.current = "two",因为默认情况下每个屏幕都有一个属性manager
  3. 在^{下添加id: my_label

Python代码

  1. 添加import语句,from kivy.properties import StringProperty
  2. 在ScreenTwo()类中声明StringProperty,text = StringProperty(''),这样就不需要传递参数,也不需要封装。在
  3. 在pressedFunction()方法中,将text = str(instance.text)替换为self.text = str(instance.text)
  4. 切换屏幕前填充文本
  5. 在ScreenThree()类中,将changing_label()方法重命名为on_pre_enter()方法,并从参数列表中删除{}。在
  6. 替换self.ids.my_label.text = text' withself.ids.my_标签。文本=self.manager.ids.屏幕_二、文本`在
  7. 可选:减少使用的内存,将return presentation替换为return Builder.load_file("example.kv"),并删除{}

示例

在主.py在

^{pr2}$

在示例.kv在

#: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: ""

输出

Img01 - ScreenTwoImg02 - ScreenThree Button1's Text displayedImg03 - ScreenThree Button2's Text displayed

“我的标签”在你的.kv文件中不存在,请在标签上添加一个id,你可以在标签上进行这些更改。在

<ScreenThree>:
    name: "three"

    BoxLayout:
        id: labelContainer

        Label:
            id: my_label
            text: ""

相关问题 更多 >