如何访问在一个类中声明的全局变量,而在另一个类中呢?

时间:2019-08-30 07:41:52

标签: python python-3.x kivy

我正在用Python和Kivy制作我的第一个手机和桌面应用程序。 该应用程序的目的是减少用于训练飞行计划计算的时间。

因此,我有多个类,每个类用于应用程序上的不同“屏幕”。在每个屏幕上,一路进行不同的输入。最后,有一个“结果屏幕”,该屏幕将打印出在此部分进行的计算。

例如,在一个屏幕上输入风向/速度和跑道方向,结果页将打印出逆风和侧风分量。

但是,由于此结果屏幕与输入风的屏幕不同,因此无法将str(var)添加到未定义的kivy标签中。

这也是我第一次使用Kivy和Classes等。真的很感谢任何建议。我的python知识不是很好。

非常感谢!

我试图在所有类之外定义一个函数。即

class Takeoff_3Window(Screen):

    def wind_Velocity1(self):
        global var
        ... code ...

wind_Result = Takeoff_3Window(Screen)
wind_Result.wind_Velocity()

然后尝试将wind_Result全局化,以便能够在另一个类中调用它。

但是,按下按钮时会调用wind_Velocity1(self)。

class Takeoff_3Window(Screen):

    rwy1 = ObjectProperty(None)
    wd1 = ObjectProperty(None)
    wv1 = ObjectProperty(None)

    ...
    functions to input runway number, wind direction and wind velocity

    another function, called advance_TO3() checks all the other inputs were valid
    ...

    def TO_4Btn(self, math):
        global HWC1, XWC1
        self.advance_TO3()
        if advance_TO3 is True:
            HWC1 = round((WV1 * math.cos(math.radians(abs(RWY1 - WD1)))), 1)
            XWC1 = round((WV1 * math.sin(math.radians(abs(RWY1 - WD1)))), 1)
            sm.current = "SurfaceDetails"
        else:
            pass

...
further classes (screens) take other input data from the user, similar to above
...

class Takeoff_ResultWindow(Screen):

    tor_tom = ObjectProperty(None)
    tor_cog = ObjectProperty(None)
    tor_elev = ObjectProperty(None)
    tor_wv = ObjectProperty(None)
    tor_qnh = ObjectProperty(None)
    tor_hwc = ObjectProperty(None)
    tor_palt = ObjectProperty(None)
    tor_xwc = ObjectProperty(None)
    tor_temp = ObjectProperty(None)
    tor_rwy = ObjectProperty(None)

    def TOR_Page1(self):
        pressureAlt1 = 0
        self.tor_tom.text = "TOM: " + str(TOM)
        self.tor_cog.text = "Centre of Gravity: " + str((TO_Moment*1000)/TOM)
        self.tor_elev.text = "Elevation: " + str(Elevation1)
        self.tor_wv.text = "Wind Velocity: " + str(WV1)
        self.tor_qnh.text = "QNH: " + str(QNH_1)
        self.tor_hwc.text = "Wind (HWC): " + str(HWC1)
        self.tor_palt.text = "Pressure Alt.: " + str(pressureAlt1)
        self.tor_xwc.text = "Wind (XWC): " + str(XWC1)
        self.tor_temp.text = "Temperature: " + str(Temp1)
        self.tor_rwy.text = "Runway: " + str(RWY1)

谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定自己要使用全局变量来做什么,所以我在这里暗中摸索。

我建议使用全局变量。相反,我会在您的类__init__中声明变量,然后可以在其他类中继承这些变量。

例如:

ClassA:
    def __init__(self, foo):
        self.foo = foo
        self.bar = 'some_value'
        self.foobar = 'abcd'

# class initialization
classA = ClassA('some_other_value') #this will set self.foo = 'some_other_value'

初始化课程后,您可以访问self.<variable>作为课程的属性:

classA = ClassA('some_other_value')
print(classA.foo) # prints some_other_value

现在,在您的ClassB中,您可以继承 ClassA的所有属性:

ClassB(Screen, ClassA):
    def __init__(self, foo):
        ClassA.__init__(self, foo)
        self.bar = 'some_new_value' #you can override properties from ClassA like this

classB = ClassB('some_other_value')

print(classB.foo) # prints 'some_other_value'
print(classB.bar) # prints 'some_new_value'
print(classB.foobar) #prints 'abcd'

在您的实际情况下,我将在类init中创建HWC1和XWC1`变量,然后可以通过继承在所有其他类中访问它们:

class Takeoff_3Window(Screen):
    def __init__(self):
        rwy1 = ObjectProperty(None)
        wd1 = ObjectProperty(None)
        wv1 = ObjectProperty(None)
        self.HWC1 = round((WV1 * math.cos(math.radians(abs(RWY1 - WD1)))), 1)
        self.XWC1 = round((WV1 * math.sin(math.radians(abs(RWY1 - WD1)))), 1)

现在在您的其他班级:

class Takeoff_ResultWindow(Screen, Takeoff_3Window):
    def __init__(self):
        print(self.HWC1)
        print(self.XWC1)