代码之家  ›  专栏  ›  技术社区  ›  Taher Kawantwala

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

  •  1
  • Taher Kawantwala  · 技术社区  · 7 年前

    我在从另一个类更新kivy Label文本运行时时时没有什么问题。 我尝试过类似问题的所有可能的解决方案,但都没有结果。 在我的应用程序中,我有一个主类和另一个弹出类。我想从弹出类更新主类小部件的文本标签。

    主要的kv文件

    <JKmain>:
        the_time: _id_lbl_time
        AnchorLayout:
            anchor_x: 'left'
            anchor_y: 'top'
            BoxLayout:
    
                orientation: 'vertical'
                id: _tool_box
                size_hint: None,0.75
                width: 300
    
                Label:
                    id: _id_lbl_time
                    text: "Total Layers : "
    
        AnchorLayout:
            anchor_x: 'right'
            anchor_y: 'top'
            GridLayout:
                rows:2
                ...
                ...
                BoxLayout:
                    orientation: 'horizontal'                           
                    Button: 
                        on_release: app.root.current = "main"
                        text: "SELECT"
                        size_hint: 1,0.2
                        background_color: (1.0, 1.0, 0.0, 1.0)
                        on_release: root.popup_func(self)
                    Button: 
                        text: "START"
                        size_hint: 1,0.2
                        background_color: (1.0, 0.0, 1.0, 1.0)
                        on_release: root.change_text(100)
                    Button: 
                        text: "EXIT"
                        size_hint: 1,0.2
                        background_color: (1.0, 0.0, 1.0, 1.0)
                        on_release: root.exit_app(self)
    <ConfirmPopup>:
        BoxLayout:
            orientation: 'vertical'
            FileChooserIconView:
                id: filechooser
                filters: ['*.zip']
    
            GridLayout:
                cols: 2 
                size_hint: 1,0.2
                Button:
                    text: 'OK'
                    on_release: root.dispatch('on_answer',filechooser.selection)
                    size_hint: 1,0.2
                Button:
                    text: 'Cancel'
                    on_release: root.dispatch('on_answer', 'Cancel')
                    size_hint: 1,0.2
    

    ConfirmPopup类:

    class ConfirmPopup(BoxLayout):
    
        def __init__(self,**kwargs):
            self.register_event_type('on_answer')
            super(ConfirmPopup,self).__init__(**kwargs)
            ...
            ...
            self.total_images=0
    
        def on_answer(self, filename): 
            ...
            ...
            ...
            if not isdir_empty == "":
                folders = ([name for name in os.listdir(self.project_path)])
                targets = []
                for i in folders:
                    if i.endswith('.png'):
                        targets.append(i)
                        self.total_images = len(targets)
            jk = JKMain()
            jk.change_text(self.total_images)
    

    主要类别:

    class JKMain(AnchorLayout):
        def __init__(self, **kwargs):
            super(JKMain, self).__init__(**kwargs)
    
        def change_text(self,layers):
            self.the_time.text = "Total Layers : " + str(layers)
            print "Total Layers = " + str(layers)
    
        def popup_func(self, instance):
    
            content = ConfirmPopup()
            content.bind(on_answer=self._on_answer)
            self.popup = Popup(title="Select .zip file",
                                content=content,
                                size_hint=(None, None),
                                size=(500,500),
                                auto_dismiss= False)
            self.popup.open()
        def _on_answer(self, instance, answer):
            self.popup.dismiss()
    

    我可以使用更新文本 change_text 作用从…起 确认弹出窗口 类,我正在创建 JKMain公司 和访问 更改\u文本 函数更改标签,但其不起作用

    1 回复  |  直到 7 年前
        1
  •  0
  •   ikolim    7 年前

    问题

    它不起作用,因为通过创建 JKMain公司 ,现在您有两个 JKMain公司 并且您没有访问第一个实例,即根。

    解决方案

    作为解决方案工作的演示 自己总计\u个图像 设置为 8. in方法 on\U答案 调用方法之前 更改\u文本

    kv文件

    1. 无需通过 自己 呼叫时 根popup\u功能
    2. 将根目录的实例传递给方法 on\U答案 。有关详细信息,请参阅示例和输出。

    Python脚本

    1. 添加新参数, JKMain公司 到Method on\U答案
    2. 添加新参数, obj 到方法 _on\U答案

    代码段

    主要的千伏

    <JKmain>:
    ...
                        on_release: root.popup_func()
    ...
    <ConfirmPopup>:
    ...
                    on_release: root.dispatch('on_answer', filechooser.selection, app.root)
    

    主要的py公司

    class ConfirmPopup(BoxLayout):
    
        ...
        def on_answer(self, filename, JKMain):
            self.total_images = 8
            print("JKMain=", JKMain)
            JKMain.change_text(self.total_images)
    
    class JKMain(AnchorLayout):
        ...
        def popup_func(self):
            ...
    
        def _on_answer(self, instance, answer, obj):
            self.popup.dismiss()
    

    实例

    主要的py公司

    from kivy.app import App
    from kivy.uix.anchorlayout import AnchorLayout
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.popup import Popup
    
    
    class ConfirmPopup(BoxLayout):
    
        def __init__(self, **kwargs):
            self.register_event_type('on_answer')
            super(ConfirmPopup, self).__init__(**kwargs)
            self.total_images = 0
    
        def on_answer(self, filename, JKMain):
            self.total_images = 8
            print("JKMain=", JKMain)
            JKMain.change_text(self.total_images)
    
    
    class JKMain(AnchorLayout):
        def __init__(self, **kwargs):
            super(JKMain, self).__init__(**kwargs)
    
        def change_text(self, layers):
            self.the_time.text = "Total Layers : " + str(layers)
            print("Total Layers = " + str(layers))
    
        def popup_func(self):
    
            content = ConfirmPopup()
            content.bind(on_answer=self._on_answer)
            self.popup = Popup(title="Select .zip file",
                               content=content,
                               size_hint=(None, None),
                               size=(500, 500),
                               auto_dismiss=False)
            self.popup.open()
    
        def _on_answer(self, instance, answer, obj):
            self.popup.dismiss()
    
    
    class Main(App):
    
        def build(self):
            return JKMain()
    
    
    if __name__ == "__main__":
        Main().run()
    

    主要的千伏

    #: kivy 1.10.0
    
    <JKmain>:
        the_time: _id_lbl_time
        AnchorLayout:
            anchor_x: 'left'
            anchor_y: 'top'
            BoxLayout:
    
                orientation: 'vertical'
                id: _tool_box
                size_hint: None,0.75
                width: 300
    
                Label:
                    id: _id_lbl_time
                    text: "Total Layers : "
    
        AnchorLayout:
            anchor_x: 'right'
            anchor_y: 'top'
            GridLayout:
                rows:2
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        on_release: app.root.current = "main"
                        text: "SELECT"
                        size_hint: 1,0.2
                        background_color: (1.0, 1.0, 0.0, 1.0)
                        on_release: root.popup_func()
                    Button:
                        text: "START"
                        size_hint: 1,0.2
                        background_color: (1.0, 0.0, 1.0, 1.0)
                        on_release: root.change_text(100)
                    Button:
                        text: "EXIT"
                        size_hint: 1,0.2
                        background_color: (1.0, 0.0, 1.0, 1.0)
                        on_release: root.exit_app(self)
    
    <ConfirmPopup>:
        BoxLayout:
            orientation: 'vertical'
            FileChooserIconView:
                id: filechooser
                filters: ['*.zip']
    
            GridLayout:
                cols: 2
                size_hint: 1,0.2
                Button:
                    text: 'OK'
                    on_release: root.dispatch('on_answer', filechooser.selection, app.root)
                    size_hint: 1,0.2
                Button:
                    text: 'Cancel'
                    on_release: root.dispatch('on_answer', 'Cancel')
                    size_hint: 1,0.2
    

    输出

    Img01 - AppStartup Img02 - zip File Selected, OK Button Clicked Img03 - Label Total Images Updated