首页 > 解决方案 > 'NoneType' 对象在 kivy 上没有属性 'root'

问题描述

我需要将值传递给 kivy 上的另一个类(屏幕)这是我的 py 代码:

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder


class MyLayout(Screen):
    pstd=ObjectProperty(None)
    def save():
        pass

    def calculate(self):
        pstd=self.pstd.text
        pres=self.pres.text
        tres=self.tres.text
        tsep=self.tsep.text
        psep=self.psep.text
        api=self.api.text
        dg=self.sg.text
        pb=self.pb.text
        co2=self.co2.text
        h2s=self.h2s.text
        n2=self.n2.text
        tds=self.tds.text
        if(self.sat.state == "down"):
            cond = 2
        else :
            cond = 1
        print(pstd)
        return pstd
        

    
class MyLayout2(Screen):
    def __init__(self,**kwargs):
        print(App.get_running_app().root.get_screen('main').calculate())
        


    
class WindowManager(ScreenManager):
    pass
kv = Builder.load_file("tubes1.kv")

class TubesApp(App):
    my_layout = MyLayout()
    def build(self):
        return kv

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

这是我的 kv 代码:

WindowManager:
    MyLayout:
    MyLayout2:

<MyLayout>:
    name: "main"
    free:free
    sat:sat
    pstd:pstd
    tres:tres
    pres:pres
    tsep:tsep
    psep:psep
    api:api
    sg:sg
    pb:pb
    co2:co2
    h2s:h2s
    n2:n2
    tds:tds
    btn:btn
    background_color : 71/255,213/255,223/255,1
    canvas.before:
        Color :
            rgba : self.background_color
        Rectangle :
            size : self.size
            pos : self.pos
    FloatLayout :
        size : root.width,root.height
        Label :
            text : "PVT Calculator"
            font_size : 20
            size_hint : (None,None)
            size : 400,100
            color: 1,1,1,1
            pos_hint : {"center_x":0.5,"top" : 1}
            background_color : (35/255,135/255,142/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        Label :
            text : "Oil Data"
            font_size : 20
            size_hint : (0.5,0.09)
            color: 0.3,0.4,0.5,1
            pos_hint : {"center_x":0.25,"top" : 0.8}
            background_color : (71/255,220/255,141/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos

        Label :
            text : "API"
            font_size : 12
            size_hint : (0.25,0.04)
            color: 1,1,1,1
            pos_hint : {"x":0, "top":0.712}
            background_color : (5/255,95/255,53/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput :
            id:api
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.25, "top":0.712}

        Label :
            text : "Saturation pressure"
            font_size : 12
            size_hint : (0.25,0.04)
            color: 1,1,1,1
            pos_hint : {"x":0, "top":0.672}
            background_color : (6/255,124/255,69/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput :
            id:pb
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.25, "top":0.672}

        Label :
            text : "Spesific Gravity"
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0, "top":0.632}
            color: 1,1,1,1
            background_color : (8/255,152/255,85/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:sg
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.25, "top":0.632}

        Label : 
            text : "Non-Hydrocarbon Component"
            font_size : 20
            size_hint : (0.5,0.09)
            color: 0.3,0.4,0.5,1
            pos_hint : {"center_x":0.75,"top" : 0.8}
            background_color : (14/255,195/255,110/225,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        Label :
            text : "CO2"
            font_size : 12
            size_hint : (0.25,0.04)
            color: 1,1,1,1
            pos_hint : {"x":0.5, "top":0.712}
            background_color : (5/255,95/255,53/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:co2
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.75, "top":0.712}

        Label :
            text : "H2S"
            font_size : 12
            size_hint : (0.25,0.04)
            color: 1,1,1,1
            pos_hint : {"x":0.5, "top":0.672}
            background_color : (6/255,124/255,69/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:h2s
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.75, "top":0.672}

        Label :
            text : "N2"
            font_size : 12
            size_hint : (0.25,0.04)
            color: 1,1,1,1
            pos_hint : {"x":0.5, "top":0.632}
            background_color : (8/255,152/255,85/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:n2
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.75, "top":0.632}

        Label :
            text : "Reservoir and Separator Data"
            font_size : 20
            size_hint : (0.5,0.09)
            color: 0.3,0.4,0.5,1
            pos_hint : {"center_x":0.25,"top" : 0.5}
            background_color : (14/255,195/255,110/225,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        Label :
            text : "Reservoir Temperature"
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0, "top":0.41}
            color: 1,1,1,1
            background_color : (5/255,95/255,53/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:tres
            multiline:False
            font_size : 12
            size_hint : (0.25,0.04)
            pos_hint : {"x":0.25, "top":0.41}

        Label :
            text : "Initial Reservoir pressure"
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            color: 1,1,1,1
            pos : 0,200
            background_color : (6/255,124/255,69/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:pres
            multiline:False
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            pos : 200,200

        Label :
            text : "Separator Temperature"
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            color: 1,1,1,1
            pos : 0,175
            background_color : (8/255,152/255,85/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:tsep
            multiline:False
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            pos : 200,175

        Label :
            text : "Separator pressure"
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            color: 1,1,1,1
            pos : 0,150
            background_color : (9/255,181/255,101/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput :
            id:psep
            multiline:False
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            pos : 200,150

        Label :
            text : "Standard pressure"
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            color: 1,1,1,1
            pos : 0,125
            background_color : (10/255,209/255,116/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
        TextInput : 
            id:pstd
            multiline:False
            font_size : 12
            size_hint : (None,None)
            size : 200,25
            pos : 200,125

        Label :
            text : "Water Formation Data"
            font_size : 20
            size_hint : (0.5,0.09)
            color: 0.3,0.4,0.5,1
            pos_hint : {"center_x":0.75,"top" : 0.5}
            background_color : (71/255,220/255,141/255,1)
            canvas.before:
                Color :
                    rgba : self.background_color
                Rectangle :
                    size : self.size
                    pos : self.pos
            Label :
                size_hint : (None,None)
                size : 400,125
                color: 0.3,0.4,0.5,1
                pos: 400,125
                background_color : (5/255,95/255,53/255,1)
                canvas.before:
                    Color :
                        rgba : self.background_color
                    Rectangle :
                        size : self.size
                        pos : self.pos

            Label :
                text : "Condition"
                font_size : 12
                size_hint : (None,None)
                size : 400,25
                color: 1,1,1,1
                pos : 400,225
                background_color : (6/255,124/255,69/255,1)
                canvas.before:
                    Color :
                        rgba : self.background_color
                    Rectangle :
                        size : self.size
                        pos : self.pos
            ToggleButton :
                id:sat
                text : "Gas-Saturated Brine"
                size_hint : (None,None)
                size : 180, 60
                pos : 420, 155
                group : 'Condition'
     
            ToggleButton :
                id:free
                text : "Gas-Free Brine"
                size_hint : (None,None)
                size : 180, 60
                pos : 610, 155
                group : 'Condition'
                state: "normal" 
                    

            Label :
                text : "Total Dissolved Solid"
                font_size : 12
                size_hint : (None,None)
                size : 200,25
                color: 1,1,1,1
                pos : 400,125
                background_color : (10/255,209/255,116/255,1)
                canvas.before:
                    Color :
                        rgba : self.background_color
                    Rectangle :
                        size : self.size
                        pos : self.pos
            TextInput : 
                id:tds
                multiline:False
                font_size : 12
                size_hint : (None,None)
                size : 200,25
                pos : 600,125
        
        Button :
            id:btn
            text : "CALCULATE"
            size_hint : (None,None)
            size : 180, 60
            pos_hint : {"center_x":0.5,"y":0.05}
            on_press : root.calculate()
            on_release : app.root.current = "second"

<MyLayout2>:

    name : "second"
    ubah:ubah
    GridLayout :
        cols : 1
        Label :
            id:ubah
            text : "test"
        Button :
            text : "Back"
            on_press : root.press()
            on_release : app.root.current = "main"

如果我使用 def ...() 而不是 def init () 它可以工作,但在这种情况下我需要使用init 。当我使用 App.get_running_app().root.get_screen('second').press() 时,它总是说'NoneType'对象没有属性'root'

标签: pythonpython-3.xclassoopkivy-language

解决方案


这些变化应该会有所帮助。

添加超级方法,我还添加了一个打印语句,仅供参考。

class MyLayout(Screen):

    def __init__(self, **kwargs):
        super().__init__()
        print(kwargs)

并且还在这个类中在init _ 方法中添加超级调用。我还添加了一个方法press,它连接到您在 .kv 文件中输入的按钮按下事件。App.get_running_app() 在这种情况下不起作用的原因是因为在初始化时 run() 方法还没有执行。它此时没有运行......所以我评论了你的行

class MyLayout2(Screen):
    def __init__(self, **kwargs):
        super().__init__()
        print(kwargs)
        # print(App.get_running_app().root.get_screen('main').calculate())
    def press(self):
        print("you pressed Back from {}".format(self))

我在这里添加了一个on_start方法和一些可能对您有所帮助的打印语句。老实说,此时我不知道 calculate() 语句的目的是什么。

class TubesApp(App):
    my_layout = MyLayout()

    def build(self):
        return kv

    def on_start(self) -> None:
        print(type(App.get_running_app()))
        print(type(App.get_running_app().root))
        print(type(App.get_running_app().root.get_screen('main')))
        # print(App.get_running_app().root.get_screen('main').calculate())

通过这些更改,您的应用程序启动并在按下计算按钮时移动到第二个窗口,并在按下返回按钮时返回


推荐阅读