Kivy - 无法更改带有 id 的 .text

Posted

技术标签:

【中文标题】Kivy - 无法更改带有 id 的 .text【英文标题】:Kivy - Can't change .text with id 【发布时间】:2021-07-19 15:59:14 【问题描述】:

我正在尝试使用 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

【问题讨论】:

【参考方案1】:

您的代码存在一些问题:

首先,您发布的代码无法运行。你kv中的那一行:

text: nameOfSong

是非法的。

二、代码:

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

正在创建Name 的新实例并在该新实例上调用changeName()。但是,该新实例不是您的 GUI 中显示的那个。

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

self.z = Name()

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

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

另一个问题是changeName() 方法尝试使用不存在的 id nameOfSong。要解决这个问题(并使您发布的代码可运行),只需更改 kv 中的 &lt;Name&gt; 规则以定义 id

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

在不相关的注释中,您的代码正在构建 App GUI 两次。行:

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 文件中删除这三行。

【讨论】:

以上是关于Kivy - 无法更改带有 id 的 .text的主要内容,如果未能解决你的问题,请参考以下文章

kivy多屏找不到id

Python Kivy 无法从另一个类访问 id

使用按钮更改 kivy 或 kivymd 中的屏幕

Kivy 更改标签小部件来自另一个类的文本

带有 Kivy 错误的 Pycharm [CRITICAL] [App] 无法获取窗口,中止

从另一个线程更改 kivy 属性