Python 如何使用KIvy中的弹出窗口小部件(按钮)从类访问小部件/id

Python 如何使用KIvy中的弹出窗口小部件(按钮)从类访问小部件/id,python,class,popup,kivy,screen,Python,Class,Popup,Kivy,Screen,我从类访问小部件id时遇到问题(此处为SecondWindow)。这个类有一个id为name\u btn的按钮,它触发一个弹出窗口,其中有一个id为my\u字段的TextInput小部件。我想将第二个窗口中按钮的文本更改为用户在文本输入中写入的任何内容。。。我该怎么做呢 我尝试使用self.parent.ids.name\u btn.text访问按钮的文本,但它给了我一个错误,说明AttributeError:“super”对象没有属性“\uu\u getattr\uu”。 如需任何帮助,我的代

我从类访问小部件id时遇到问题(此处为
SecondWindow
)。这个类有一个id为
name\u btn
的按钮,它触发一个弹出窗口,其中有一个id为
my\u字段的
TextInput
小部件。我想将
第二个窗口中按钮的
文本
更改为用户在文本输入中写入的任何内容。。。我该怎么做呢

我尝试使用self.parent.ids.name\u btn.text访问按钮的文本,但它给了我一个错误,说明
AttributeError:“super”对象没有属性“\uu\u getattr\uu”
。 如需任何帮助,我的代码如下>>

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()
还有我的

        
<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_()                

:
my_字段:my_字段
文本输入:
id:我的_字段
多行:False
位置提示:{'x':0.1,'top':0.74}
大小提示:无,无
尺寸:200,60
字体大小:26
按钮:
大小提示:无,无
文本:“完成”
尺码:80,26
字体大小:14
位置提示:{'x':0.8,'top':0.18}
发布时:
根
WindowManager:
主要内容:
第二窗口:
:
名称:'main'
网格布局:
科尔斯:1
按钮:
文本:“转到第二个窗口”
发布时:
app.root.current='秒风'
名称:“sec_wind”
姓名:姓名
网格布局:
科尔斯:1
按钮:
id:name\u btn
文本:'输入文本'
发布时:
root.pop()

`

一些小改动,以实现您想要的功能。修改
弹出窗口()
以返回
弹出窗口
,使其可以关闭:

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()
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()
最后,修改
time\u intrvl
以修改按钮文本并关闭
弹出窗口

class SecondWindow(Screen):
    name_btn = ObjectProperty(None)
    def pop_(self):
        self.popup = pop_up()
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
的引用,然后获取
app
根目录,即
窗口管理器。然后它使用
get_screen()
方法获取对
second窗口的引用。通过该引用,我们可以更改按钮文本并关闭
弹出窗口

谢谢兄弟,然而,我无法理解WindowManager是如何成为应用程序的根的。兄弟还有更多的疑问,我们怎么可能直接访问函数中的变量,就像我们没有使该变量成为全局变量一样。这里我指的是第二个窗口中的
pop
中的
self.popup
WindowManager
kv
文件设置为root,其中
WindowManager
规则显示为根rue,没有周围的
self.popup
不是一个全局变量,但是它是
SecondWindow
的一个实例变量,允许使用
self.
构造访问它。Brother sry想打扰一下,但还有一个疑问,那就是我如何访问属于弹出窗口而不是屏幕的小部件
TextInput
。我想从SecondWndow屏幕类访问textinput