NameError: name "winroot" is not defined

NameError: name "winroot" is not defined

我正在构建一个计算器应用程序,我解决了很多问题,除了这个。解决它比我更重要,我尝试了几乎所有方法,除了我现在想到的一种方法是:将程序制作在一个 (.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

因为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())