NameError:name" winroot"没有定义

时间:2018-06-14 19:28:45

标签: python kivy nameerror

我正在构建一个计算器应用程序,除了这个问题我解决了很多问题。解决它比我大,我尝试了几乎所有的东西,除了我正在考虑的方法之一是:将程序放在一个(.py)文件中。

我的程序是在Kivy中设计的,我在两个python文件中创建了应用程序,所以这就是问题:主屏幕有几个选项可以打开一个新页面,而且该页面必须有一个按钮,让应用程序返回到主屏幕,这个按钮不起作用。

一个变量刚刚神奇地消失了......叫做winroot'!

这是代码(main.py):

class Base(App):
    def build(self):
        global winroot
        winroot = TheMainScreen()
        mnsc = MainScreen()
        winroot.add_widget(mnsc)
        return winroot
class TheMainScreen(FloatLayout):
    def back(self, obj=1):
        print('pressed')
        winroot.clear_widgets()
        winroot.add_widget(MainScreen())
class MainScreen(FloatLayout):
    def __init__(self, **kwargs):
        self.B1 = Button(text='Base Calculator\n\n\n', on_press=self.basecalc)
    def basecalc(self, obj):
        winroot.clear_widgets()
        from calculator.basecalculator import BaseCalculator
        winroot.add_widget(BaseCalculator())

这是第二个python文件(basecalculator.py):

class BaseCalculator(FloatLayout):
    def __init__(self, **kwargs):
        super(BaseCalculator, self).__init__(**kwargs)
        self.B11 = Button(size_hint=(.08, .13), on_release=self.prev)
    def prev(self, obj=1):
        from calculator.main import TheMainScreen
        a = TheMainScreen()
        a.back()

,这是出现的错误:

File "C:\Users\work\PycharmProjects\Kivy\calculator\basecalculator.py", line 95, in prev
 a.back()

File "C:\Users\work\PycharmProjects\Kivy\calculator\main.py", line 26, in back winroot.clear_widgets()
NameError: name 'winroot' is not defined

1 个答案:

答案 0 :(得分:0)

由于winroot是在函数内创建的全局变量,因此必须在使用它的每个函数中将其声明为全局变量。

或者,你知道,而不是全局,set是实例属性并传递它,那么你不需要全局变量:

class Base(App):
    def build(self):
        self.winroot = TheMainScreen()
        self.mnsc = MainScreen(self.winroot)
        self.winroot.add_widget(self.mnsc)
        return winroot


class TheMainScreen(FloatLayout):
    def back(self, obj=1):
        print('pressed')
        self.clear_widgets()
        self.add_widget(MainScreen())


class MainScreen(FloatLayout):
    def __init__(self, winroot, **kwargs):
        self.B1 = Button(text='Base Calculator\n\n\n', on_press=self.basecalc)
        self.winroot = winroot

    def basecalc(self, obj):
        self.winroot.clear_widgets()
        from calculator.basecalculator import BaseCalculator
        self.winroot.add_widget(BaseCalculator())