【问题标题】:Problem with working with python package kivy使用 python 包 kivy 的问题
【发布时间】:2021-10-16 18:38:44
【问题描述】:

错误是这样的:

文件“c:/Users/hp/OneDrive/Desktop/Python/big.py”,第 26 行,在 Myapp().run()
运行中的文件“C:\Users\hp\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py”,第 949 行 self._run_prepare()
_run_prepare 中的文件“C:\Users\hp\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py”,第 925 行 raise Exception('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()

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    我所做的第一个更改是将您的类“布局”大写为“布局”。 这是 python 中的 PEP8 约定,有助于避免混淆。

    您的代码的问题在于 MyApp().build() 方法...您试图返回一个从未实例化的类。

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

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

    【讨论】:

      【解决方案2】:

      因为你必须调用布局类

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 2021-06-20
        • 2023-03-27
        • 2021-09-17
        • 2021-01-03
        • 2022-10-13
        • 2021-08-18
        相关资源
        最近更新 更多