使用 python 软件包 kivy 时出现问题

Problem with working with python package kivy

错误是这样的:

File "c:/Users/hp/OneDrive/Desktop/Python/big.py", line 26, in Myapp().run()
File "C:\Users\hp\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py", line 949, in run self._run_prepare()
File "C:\Users\hp\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py", line 925, in _run_prepare raise Exception('Invalid instance in App.root')

我的代码是这样的:

import kivy
from kivy.app import App
from kivy.core import text
from kivy.uix.label import Label 
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput

class layout(GridLayout):
    def __init__(self, **kwargs):
        super(layout, self).__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text="Username= "))
        self.username = TextInput(multiline=False)
        cell_1 = self.username
        self.add_widget(Label(text="Password= "))
        self.password = TextInput(multiline=False)
        cell_2 = self.password



class Myapp(App):
    def build(self):
        return layout

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

因为必须调用布局class

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput


class Layout(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.cols = 2
        self.add_widget(Label(text="Username= "))
        self.username = TextInput(multiline=False)
        self.add_widget(Label(text="Password= "))
        self.password = TextInput(multiline=False)


class MyApp(App):
    def build(self):
        return Layout()


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

我做的第一个改变是将你的 class 'layout' 大写为 'Layout'。 这是 python 中的 PEP8 约定,有助于避免混淆。

您的代码的问题出在 MyApp().build() 方法中...您试图 return 一个您从未实例化的 class。

当您使用 'class' 关键字创建 class 模板时。它只是一个模板。为了从模板创建实际对象,您必须使用一组括号 () 来调用 class 名称。

import kivy
from kivy.app import App
from kivy.core import text
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput


# Class names should always be CamelCase style
# Changed the name of layout to Layout
class Layout(GridLayout):
    def __init__(self, **kwargs):

        # Changed layout to Layout here too
        super(Layout, self).__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text="Username= "))
        self.username = TextInput(multiline=False)
        cell_1 = self.username
        self.add_widget(Label(text="Password= "))
        self.password = TextInput(multiline=False)
        cell_2 = self.password



class Myapp(App):
    def build(self):

        # Changes made here
        # You never created an instance of your 'layout()' class
        # To create an instance you have to use ( and )
        layout = Layout()

        return layout

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