繁体   English   中英

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

[英]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: ""

问题

1. AttributeError-my_label

在kv文件中,缺少id: my_label

2.在填充my_label.text之前切换屏幕

屏幕切换后, self.manager.current = "three"my_label.text完成, self.manager.current = "three"

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

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

KV文件

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

Python代码

  1. from kivy.properties import StringProperty添加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()方法,然后从参数列表中删除text
  6. 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`
  7. 可选:减少使用的内存,用return Builder.load_file("example.kv")替换return presentation ,并删除presentation = Builder.load_file("example.kv")

main.py

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

example.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-屏幕二 Img02-屏幕上显示的三个Button1的文本 Img03-ScreenThree Button2的文本显示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM