【问题标题】:How to access a widget/id from a class using popup widget(Button) in KIvy如何在 KIvy 中使用弹出小部件(按钮)从类中访问小部件/ID
【发布时间】:2020-10-17 20:30:39
【问题描述】:

我在从类(此处为 SecondWindow)访问小部件 ID 时遇到问题。这个类有一个 id 为name_btn 的按钮,它触发一个弹出窗口,其中有一个TextInput 小部件,id 为my_field。我想将SecondWindow 中按钮的text 更改为用户在文本输入中写入的任何内容...我该怎么做。

我尝试使用 self.parent.ids.name_btn.text 访问按钮的文本,但它给了我一个错误声明 AttributeError: 'super' object has no attribute '__getattr__'。 我的代码如下>>

main.py

import kivy
import kivymd
kivy.require('1.10.1')
from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager , Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.uix.floatlayout import FloatLayout


class Main(Screen):
    pass

class SecondWindow(Screen):
    name_btn = ObjectProperty(None)
    def pop_(self):
        pop_up()


class WindowManager(ScreenManager):
    pass  

class time_intrvl(FloatLayout): 
    
    my_field = ObjectProperty(None)
    
    def yeah(self):
        self.parent.ids.name_btn.text = self.my_field.text


class ExamPortal(MDApp):

    def build(self):
        kv = Builder.load_file('my.kv')        
        return kv
        
def pop_up():
    pop_window = time_intrvl()
    PopUpWindow = Popup(title = 'Enter Time' ,content = pop_window,size_hint = (0.5,0.3))
    PopUpWindow.open()         
            

if __name__ == "__main__":
    ExamPortal().run()

和我的.kv

        
<time_intrvl>:

    my_field : my_field

    TextInput:
        id : my_field
        multiline : False
        pos_hint : {'x':0.1 , 'top': 0.74}
        size_hint : None,None
        size : 200,60
        font_size : 26
        

        
    Button:
        size_hint : None , None
        text : 'Done'
        size : 80,26
        font_size : 14    
        pos_hint : {'x':0.8,'top':0.18}
        on_release:
            root.yeah()
            
WindowManager:
    Main:
    SecondWindow:
              
<Main>:
    name : 'main'
    GridLayout:
        cols : 1
        Button:
            
            text : 'Go to SecondWindow'
            on_release:
                app.root.current = 'sec_wind'
<SecondWindow>
    name : 'sec_wind'
    name_btn : name_btn
    
    GridLayout:
        cols : 1
        Button:
            id : name_btn
            text:'Enter Text'
            on_release:
                root.pop_()                

`

【问题讨论】:

    标签: python class popup kivy screen


    【解决方案1】:

    进行一些小改动以获得您想要的工作。修改pop_up() 以返回PopUpWindow 使其可以被关闭:

    def pop_up():
        pop_window = time_intrvl()
        PopUpWindow = Popup(title = 'Enter Time' ,content = pop_window,size_hint = (0.5,0.3))
        PopUpWindow.open()
        return PopUpWindow
    

    然后修改SecondWindow以保留对PopUpWindow的引用:

    class SecondWindow(Screen):
        name_btn = ObjectProperty(None)
        def pop_(self):
            self.popup = pop_up()
    

    最后,修改time_intrvl 以修改按钮文本并关闭PopUpWindow

    class time_intrvl(FloatLayout):
    
        my_field = ObjectProperty(None)
    
        def yeah(self):
            second_window = MDApp.get_running_app().root.get_screen('sec_wind')
            second_window.name_btn.text = self.my_field.text
            second_window.popup.dismiss()
    

    上面的代码使用MDApp.get_running_app()得到了对App的引用,然后得到了Approot,也就是WindowManager。然后它使用get_screen() 方法获取对SecondWindow 的引用。有了这个引用,我们就可以更改 Button 文本并关闭 PopUpWindow

    【讨论】:

    • 谢谢兄弟,但是我不明白 WindowManager 是如何成为应用程序的根目录的。
    • 和兄弟更怀疑我们怎么可能直接访问函数内部的变量,就像我们没有将该变量设为全局变量一样。这里我指的是self.popup,它位于SecondWindow中的pop_
    • WindowManagerkv 文件设置为root,其中WindowManager 规则显示为root rue,没有包围&lt;&gt;
    • self.popup 不是全局变量,而是SecondWindow 的实例变量,可以使用self. 构造访问它。
    • 兄弟很抱歉打扰,但我更怀疑如何在TextInput &lt;my_field&gt; 处访问属于弹出窗口而不是屏幕的小部件。我想从 SecondWndow 屏幕类访问文本输入
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多