基维标签.text属性在UI上不更新

2024-06-27 09:34:39 发布

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

我有一个问题,即标签的更新文本属性不能正确显示在我的UI上。我检查text属性,并可以验证它是否被设置为新值,但是在呈现标签时该值没有显示。在

标签在另一个屏幕上,我正在切换到使用屏幕管理器。屏幕的子窗口小部件和树在单独的.kv文件中构造(我在示例中使用了load_string()Builder方法,但结果是相同的)

下面是一个简单的例子:

from kivy.config import Config
Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '200')
Config.set('graphics', 'resizable', '0')

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

Builder.load_string("""
<screen1>:
    Button:
        id: button
        text: 'Press me to Update Screen2'
        on_press:
            root.update_screen2()

<screen2>:
    Label:
        id: mainLabel
        text: 'I have not been updated'
""")

class screen1(Screen):

    def __init__(self, **kwargs):
        """
            Set super and store the id of the button
        """
        super(screen1, self).__init__(**kwargs)
        self.button = self.ids.button.__self__
        return

    def update_screen2(self):
        """
            send text 1 and text 2 to the screen2 object 
            for it to set on it's label
        """
        text1 = 'Hi There'
        text2 = 'Does this work'
        screen2.update_label(screen2(),text1, text2)
        return


class screen2(Screen):

    def __init__(self, **kwargs):
        """
            set super ond store the id of the label
        """
        super(screen2, self).__init__(**kwargs)
        self.mainLabel = self.ids.mainLabel.__self__
        return

    def update_label(self, text1, text2):
        """
            using text1 and text2, update the text property of the label
            the output of each print() shows the text property is being updated
            it just doesn't display on the UI
        """
        print(self.mainLabel.text)
        self.mainLabel.text = text1 + '\n\n' + text2
        print(self.mainLabel.text)
        screenManager.current = 'screen2'
        return

screenManager = ScreenManager()


class MainApp(App):
    def build(self):
        #root widget is abox layout
        self.root = BoxLayout()

        #instantiate the screen objects
        self.screen1 = screen1(name='screen1')
        self.screen2 = screen2(name='screen2')

        #add the screens to the screenManager
        screenManager.add_widget(self.screen1)
        screenManager.add_widget(self.screen2)

        #set the current screen
        screenManager.current = 'screen1'

        #add the screenManager to the root widget and return it
        self.root.add_widget(screenManager)
        return self.root


if __name__ == '__main__':
    MainApp().run()

我尝试过各种各样的方法,比如改变我在python中引用label小部件的方式,要求画布更新,或者创建一个'screen2()'对象来调用screen1中的方法,但是都没有用。 我错过了什么?在


Tags: thetotextfromimportselfreturnroot
1条回答
网友
1楼 · 发布于 2024-06-27 09:34:39
screen2.update_label(screen2(),text1, text2)

这行代码并不像您所想的那样—实际上,它会犯很多错误,您熟悉python类是如何工作的吗?在

首先,当你调用一个方法时,你通常希望用类的一个实例来实现,例如

^{pr2}$

这将在列表的实例后追加10个。在

您所做的不是调用类实例的update_label方法,而是使用类定义和新实例screen2()直接调用它。因为这对你来说没有崩溃,我想如果你传递了你想要改变的实例,它可能会起作用,但是这是不正常的,没有理由这样做。问题是,您更改了传入的新screen2实例的文本,但这与您在应用程序中实际显示的对象完全不同,因此您看不到任何更改。在

相反,您需要调用应用程序实际使用的screen2实例的update_label方法。例如,下面这样的方法应该有效:

screen2_instance = self.parent.get_screen('screen2')
screen2_instance.update_label(text1, text2)

第一行使用screenmanager的get_screen方法检索名为“screen2”的现有屏幕。第二行使用新文本调用其update label方法。注意,而不是传入屏幕实例参数(称为self)-实例方法会自动接收第一个参数。在

您还应该将类名大写,一方面是因为它是一种python约定(这显然不是强制性的,但是遵循一般的社区风格指导原则有很多要说的),另一方面是因为kv语言使用这种大写来标识小部件,因此如果不这样做,以后可能会遇到问题。在

相关问题 更多 >