Kivy - 无法使用 id 更改 .text

Kivy - Can't change .text with id

提问人:Leon Kardaš 提问时间:4/26/2021 更新时间:4/26/2021 访问量:147

问:

我正在尝试使用 id 更改标签的文本,我尝试了使用 stringProperty,使用没有任何属性的 objectProperty。我的代码中一定缺少一些东西,因为无论我尝试什么,它都不起作用,任何帮助将不胜感激。

这段代码是一个简单的屏幕,有 2 个按钮,一个用于转到另一个屏幕,一个用于更改标签

from kivy.app import *
from kivy.uix.button import *
from kivy.graphics import *
from kivy.uix.widget import *
from kivy.uix.label import *
from kivy.uix.floatlayout import *
from kivy.uix.boxlayout import *
from kivy.uix.relativelayout import *
from kivy.uix.scrollview import ScrollView
from kivy.properties import ListProperty, StringProperty,ObjectProperty
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout

class WindowManager(ScreenManager):
    pass

class Name(FloatLayout):
    def __init__(self, **kwargs):
        super(Name, self).__init__(**kwargs)
    def changeName(self):
        print(self.ids)
        self.name = self.ids.nameOfSong.text
        print(self.name)
        self.ids.nameOfSong.text = 'name'
        self.name = self.ids.nameOfSong.text
        print(self.name)

class MainWindow(Screen):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.pos = (0, 0)
        self.size = (1,1)
        self.z = Name()
        self.add_widget(self.z)
    def swap(self):
        Name().changeName()
class SecondWindow(Screen,BoxLayout):
    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)

class langApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainWindow(name='main'))
        sm.add_widget(SecondWindow(name='second'))
        return sm

Builder.load_file("kiv.kv")
if __name__ == '__main__':
    langApp().run()

我的kiv.kv文件,其中大部分与问题无关(我认为)

#:kivy 1.11.1
WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"
    FloatLayout:
        pos: 0,0
        size: root.width,root.height
        Button:
            on_release:
                root.manager.transition.direction = 'left'
                app.root.current = "second"
            text: 'Stop'
            pos_hint: {'x':.45,'y':.1}
            size_hint: .1,.1
        Button:
            on_press: root.swap()
            text: 'Next'
            pos_hint: {'x':.65,'y':.1}
            size_hint: .1,.1

<SecondWindow>:
    name: "second"
    FloatLayout:
        pos: 0,0
        size: root.width,root.height
        Button:
            on_release:
                root.manager.transition.direction = 'right'
                app.root.current = "main"
            text: 'Stop'
            pos_hint: {'x':.45,'y':.1}
            size_hint: .1,.1

<Name>:
    Label:
        text: nameOfSong
        font_size: 20
        size_hint: None, None
        pos_hint: {'x': 0.435, 'y': 0.25}
python oop kivy 语言

评论


答:

1赞 John Anderson 4/26/2021 #1

代码存在一些问题:

首先,您发布的代码不会运行。你的行:kv

text: nameOfSong

是非法的。

二、代码:

def swap(self):
    Name().changeName()

正在创建新实例并调用该新实例。但是,该新实例不是 GUI 中显示的实例。NamechangeName()

要解决这个问题,你只需要调用你的GUI中的实例。方便的是,您已经保存了对正确实例的引用,并带有以下行:changeName()Name

self.z = Name()

因此,您可以更改方法以使用该实例:swap()Name

def swap(self):
    self.z.changeName()

另一个问题是该方法尝试使用不存在的 id 。要解决这个问题(并使你发布的代码可运行),只需更改 kv 中的规则来定义:changeName()nameOfSong<Name>id

<Name>:
    Label:
        id: nameOfSong
        text: 'Some Name'
        font_size: 20
        size_hint: None, None
        pos_hint: {'x': 0.435, 'y': 0.25}

在不相关的说明中,您的代码正在构建两次。该行:AppGUI

Builder.load_file("kiv.kv")

正在构建从以下行:GUI

WindowManager:
    MainWindow:
    SecondWindow:

您的 python 代码将在此处再次构建它:

def build(self):
    sm = ScreenManager()
    sm.add_widget(MainWindow(name='main'))
    sm.add_widget(SecondWindow(name='second'))
    return sm

您可以从文件中删除这三行。kv