Python.kivy - TypeError:“NoneType”对象不可下标

问题描述 投票:0回答:1

我在使用 GUI 库 Kivy 在 Python 上编码时遇到了未知问题。问题是当我执行这段代码时

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.scatter import Scatter
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.behaviors import ButtonBehavior
from pathlib import Path


class SignUpScreen(Screen):
    def verify_user(self, email, username):
        pass


class SignInUsernameScreen(Screen):
    def signin_username(self, uname):
        pass


class SignInMasterKeyScreen(Screen):
    def check_masterkey(self, mk):
        pass


class RootWidget(ScreenManager):
    pass


class MainApp(App):
    def build(self):
        Builder.load_file('design.kv')
        return RootWidget()


if __name__ == '__main__':
    MainApp().run()

这里是design.kv文件:

<SignUpScreen>:
 GridLayout:
  cols: 1
  GridLayout:
   cols: 1
   padding: 15, 15
   spacing: 20, 20
   Label:
    text: 'User Sign Up'
    font_size: '20sp'
   TextInput:
    id: username
    hint_text: 'Username'
   TextInput:
    id: email
    hint_text: 'Email'
   RelativeLayout:
    Button:
     text: 'Create an account'
     size_hint: 0.3, 0.5
     pos_hint: {'center_x': 0.5, 'center_y': 0.6}
     on_press: root.verify_user(root.ids.username.text, root.ids.email.text)


<SignInUsernameScreen>:
 GridLayout:
  cols: 1
  GridLayout:
   cols: 1
   padding: 15, 15
   spacing: 20, 20
   Label:
    text: 'User Sign In'
    font_size: '20sp'
   TextInput:
    id: username
    hint_text: 'Username'
   RelativeLayout:
    Button:
     text: 'Sign In'
     pos_hint: {'center_x': 0.5, 'center_y': 0.6}
     on_press: root.signin_username(root.ids.username.text)
  Label:
    id: username_wrong
    text: ''

<SignInMasterkeyScreen>:
 GridLayout:
  cols: 1
  GridLayout:
   cols: 1
   padding: 15, 15
   spacing: 20, 20
   Label:
    text: 'User Login'
    font_size: '20sp'
   TextInput:
    id: masterkey
    password: True
    hint_text: 'MasterKey'
   RelativeLayout:
    Button:
     text: 'Login master key'
     pos_hint: {'center_x': 0.5, 'center_y': 0.6}
     on_press: root.signin_masterkey(root.ids.masterkey.text)
   Label:
    id: masterkey_wrong
    text: ''
  GridLayout:
   cols: 2
   size_hint: 0.2, 0.2 # 20% of window space
   padding: 10, 10
   spacing: 10, 0
   Button:
    text: 'Forgot Password'
    background_color: 1, 1, 1, 0
    opacity: 1 if self.state == 'normal' else 0.5
    color: 0.1, 0.7, 1, 1
   Button:
    text: 'Back'
    background_color: 1, 1, 1, 0
    opacity: 1 if self.state == 'normal' else 0.5
    color: 0.1, 0.7, 1, 1


<RootWidget>:
 SignUpScreen:
  name: 'signup_screen'
 SignInScreen:
  name: 'signin_screen'
 SignInMasterKeyScreen:
  name: 'signin_masterkey'

我遇到了此类错误

[INFO   ] [Logger      ] Record log in /Users/niknmirosh/.kivy/logs/kivy_22-09-28_38.txt
    [INFO   ] [Kivy        ] v2.1.0
    [INFO   ] [Kivy        ] Installed at "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/__init__.py"
    [INFO   ] [Python      ] v3.9.12 (main, Apr  5 2022, 01:53:17) 
    [Clang 12.0.0 ]
    [INFO   ] [Python      ] Interpreter at "/Users/niknmirosh/opt/miniconda3/bin/python3"
    [INFO   ] [Logger      ] Purge log fired. Processing...
    [INFO   ] [Logger      ] Purge finished!
    [INFO   ] [Factory     ] 189 symbols loaded
    [INFO   ] [Image       ] Providers: img_tex, img_imageio, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
    [INFO   ] [Text        ] Provider: sdl2
    [INFO   ] [Window      ] Provider: sdl2
    [INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
    [INFO   ] [GL          ] Backend used <sdl2>
    [INFO   ] [GL          ] OpenGL version <b'2.1 INTEL-18.8.4'>
    [INFO   ] [GL          ] OpenGL vendor <b'Intel Inc.'>
    [INFO   ] [GL          ] OpenGL renderer <b'Intel(R) Iris(TM) Plus Graphics 655'>
    [INFO   ] [GL          ] OpenGL parsed version: 2, 1
    [INFO   ] [GL          ] Shading version <b'1.20'>
    [INFO   ] [GL          ] Texture max size <16384>
    [INFO   ] [GL          ] Texture max units <16>
    [INFO   ] [Window      ] auto add sdl2 input provider
    [INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
     Traceback (most recent call last):
       File "/Users/niknmirosh/Desktop/PasswordManager (Demo)/main.py", line 46, in <module>
         MainApp().run()
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/app.py", line 954, in run
         self._run_prepare()
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/app.py", line 924, in _run_prepare
         root = self.build()
       File "/Users/niknmirosh/Desktop/PasswordManager (Demo)/main.py", line 41, in build
         Builder.load_file('/Users/niknmirosh/Desktop/PasswordManager (Demo)/design.kv')
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/builder.py", line 305, in load_file
         return self.load_string(data, **kwargs)
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/builder.py", line 372, in load_string
         parser = Parser(content=string, filename=fn)
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/parser.py", line 483, in __init__
         self.parse(content)
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/parser.py", line 593, in parse
         objects, remaining_lines = self.parse_level(0, lines)
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/parser.py", line 696, in parse_level
         _objects, _lines = self.parse_level(
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/parser.py", line 696, in parse_level
         _objects, _lines = self.parse_level(
       File "/Users/niknmirosh/opt/miniconda3/lib/python3.9/site-packages/kivy/lang/parser.py", line 756, in parse_level
         if current_property[:3] == 'on_':
     TypeError: 'NoneType' object is not subscriptable

我可能错过了什么重要的事情?我已经按照文档做了几乎所有事情,但错误仍然出现。

python kivy
1个回答
0
投票

您的

kv
文件中的缩进不一致。

<SignUpScreen>:   # no indentation - OK
 GridLayout:      # one space indentation - OK (This sets the indentation level for the entire file)
  cols: 1         # two space indentation - OK (previous indentation plus another level of indentation)
  GridLayout:     # two space indentation - OK
    cols: 1       # four space indentation - ERROR (should be three space indentation)

id: username_wrong
规则中的
<SignInUsernameScreen>
有两个从
Label:
缩进的空格。

Kivy 对缩进级别非常挑剔。使用单个空格的缩进是合法的,但可能会很难发现这样的错误。我强烈建议使用 4 个空格的缩进。另外,来自文档

缩进很重要,必须一致。间距必须 是第一个缩进行上使用的空格数的倍数。 鼓励使用空格:不建议混合使用制表符和空格。

© www.soinside.com 2019 - 2024. All rights reserved.