繁体   English   中英

kivy 应用程序的 python 代码引发错误:KeyError:''

[英]python code for kivy app throws the error: KeyError: ''

我正在尝试运行 kivy 应用程序,但我不断收到 (KeyError: '') 错误,我尝试了不同的方法,但无法正常工作。 ps: dic 是我的本地文件,其中包含: -dic_trans- 和 -full- 作为非常长的字典。

使用计数器变量 x 来增加两个字典的键值索引,例如:

单击第一个按钮(是)时,第一个 label 应接收第一个字典的键,第二个 label 应接收该键的值

同样对于第二个按钮(否),第一个 label 应该接收第二个字典的键,第二个 label 应该接收该键的值

我不确定我错过了哪里,可能是由于使用属性时的一些错误,或者其他原因,我有点困惑,因为我对 kivy 有点陌生。

python 代码如下:

    from dic import dic_trans
    from dic import full
    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.properties import StringProperty
    from kivy.properties import  NumericProperty
    from kivy.properties import DictProperty
    class MainBoxLayout (BoxLayout):
        label1property = StringProperty()
        label2property = StringProperty()
        x = NumericProperty(-1)
        y = DictProperty(dic_trans)
        z = DictProperty(full)
        def press_yes(self):
            global x
            self.x += 1
            self.label1property = str(self.y[self.x])
        def press_no(self):
            self.label2property = str(self.z[self.x])
        class BasicWordsPracticeApp(App):
            pass
    BasicWordsPracticeApp().run()

对于 kv 文件:

    MainBoxLayout:
    <MainBoxLayout>:
        padding:("7dp","7dp","7dp","7dp")
        orientation: "vertical"
        Label:
            text: root.label1property
            multiline: True
            font_size: 50
            background_color: (0,0,1,1)
            canvas.before:
                Color:
                    rgba: self.background_color
                Rectangle:
                    size: self.size
                    pos: self.pos
        Label:
            text: root.label2property
            multiline: True
            size_hint:  1,None
            height: "450dp"
            font_size: 50
            background_color: (1,1,0,1)
            canvas.before:
                Color:
                    rgba: self.background_color
                Rectangle:
                    size: self.size
                    pos: self.pos
        BoxLayout:
            Button:
                text: "No"
                on_press: root.press_no()
                background_color: (255,0,0,1)

            Button:
                text: "Yes"
                on_press: root.press_yes()
                background_color: (0,255,0,1)

   

错误如下:。 . .

    [INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, 
    img_ffpyplayer 
     Traceback (most recent call last):
       File "hope.py", line 38, in <module>
         BasicWordsPracticeApp().run()
       File "/", line 949, 
    in run
          self._run_prepare()
       File "/", line 918, 
    in _run_prepare
         self.load_kv(filename=self.kv_file)
       File "/", line 691, 
    in load_kv
         root = Builder.load_file(rfilename)
       File "/", 
    line 306, in load_file
         return self.load_string(data, **kwargs)
       File "/", 
    line 404, in load_string
         widget = Factory.get(parser.root.name)(__no_builder=True)
       File "kivy/_event.pyx", line 195, in kivy._event.EventDispatcher.__cinit__
       File "kivy/properties.pyx", line 1317, in 
    kivy.properties.ReferenceListProperty.link_deps
       File "kivy/properties.pyx", line 465, in kivy.properties.Property.fbind
     KeyError: ''

你的问题是你使用了像“x”、“y”、“z”这样的字母,同样的错误也为我复制了。 尝试使用以下内容:

x_num = NumericProperty(-1)
y_dict = DictProperty(dic_trans)
z_dict = DictProperty(full)

我相信 xy 和 z 可能是 kivy 的默认变量。

关于标签:

您可以通过为标签指定 id 以不同的方式控制标签。 您需要提供 label 和 ID,然后在父级中引用它,以便能够在任何父级函数中访问它。 试试这个:

.py

from dic import dic_trans
from dic import full
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.properties import NumericProperty
from kivy.properties import DictProperty


class BasicWordsPracticeApp(App):
    pass


class MainBoxLayout(BoxLayout):
    x_num = NumericProperty(-1)
    y_dict = DictProperty(dic_trans)
    z_dict = DictProperty(full)

    def press_yes(self):
        global x
        self.x += 1
        # accessing the .text variable of the label id label_1
        self.label_1.text = str(self.y[self.x])
       
    def press_no(self):
        # accessing the .text variable of the label id label_2
        self.label_2.text = str(self.z[self.x])
     

BasicWordsPracticeApp().run()

.kv

MainBoxLayout:

<MainBoxLayout>
    label_1: label_1
    label_2: label_2
    padding:("7dp","7dp","7dp","7dp")
    orientation: "vertical"
    Label:
        id: label_1
        text: "some default value"
        multiline: True
        font_size: 50
        background_color: (0,0,1,1)
        canvas.before:
            Color:
                rgba: self.background_color
            Rectangle:
                size: self.size
                pos: self.pos
    Label:
        id: label_2
        text: "some default value"
        multiline: True
        size_hint:  1,None
        height: "450dp"
        font_size: 50
        background_color: (1,1,0,1)
        canvas.before:
            Color:
                rgba: self.background_color
            Rectangle:
                size: self.size
                pos: self.pos
    BoxLayout:
        Button:
            text: "No"
            on_press: root.press_no()
            background_color: (255,0,0,1)

        Button:
            text: "Yes"
            on_press: root.press_yes()
            background_color: (0,255,0,1)

@Jonathan:更改名称似乎有助于继续下一步,正在打开 kivy 应用程序,但是当单击任一按钮时,我收到一个 keyError 0 用于单击一个按钮,而 keyError 为 -1 用于单击其他按钮。 请注意,我也尝试过另一种方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM