Python Kivy动态类未定义

huangapple go评论46阅读模式
英文:

Python Kivy Dyanmic Class not defined

问题

我一直遇到一个NameError错误,报告“name TripButton is not defined”,尽管我在同一个.kv文件中定义了一个名为TripButton的按钮。

我尝试在MyPopup类上面和下面声明TripButton类,但没有成功。我将我的代码与kivy文档中的动态类进行了比较,就我所看到的语法而言,我似乎是匹配的。我尝试在Python文件和.kv文件中都导入Button类,但没有成功。

为了澄清,所有这些都在与Python文件相同的目录中的同一个.kv文件中。应用程序在我单击MyPopup中的提交按钮之前运行,然后程序崩溃,我收到NameError错误。这是我在Python文件中的内容。

我做错了什么?我还能尝试什么?谢谢您的时间。

英文:

I keep getting a Name Error reporting "name TripButton is not defined" although I have a button called TripButton defined in the same .kv file.

#:kivy 1.11.1

<TripButton@Button>:
    size_hint: (0.15,0.15)
    pos_hint: {'y':0.84}
    text:"Test Text"

<MyPopup>:
    size_hint: 0.5, 0.5
    auto_dismiss: False
    title: 'New Trip'

    BoxLayout:
        orientation: 'vertical'
        TextInput:
            id: trip_name
            multiline: False

        BoxLayout:
            size_hint_y: None
            height: 30

            Button:
                text: 'Submit'
                on_release:
                    root.parent.parent.add_widget(TripButton(text=trip_name.text, size_hint=(1,0.1)))
                    root.dismiss()

            Button:
                text: 'Cancel'
                on_release: root.dismiss()


<FirstScreen>:
    name: 'first'
    FloatLayout:

        BoxLayout:
            size_hint: (0.95, 0.95)
            pos_hint: {'center_x':0.5, 'center_y':0.5}
            orientation: "vertical"

            canvas.before:
                Color:
                    rgba: (1, 0, 0, 1) # Red color

                Rectangle:
                    pos: self.pos
                    size: self.size
            BoxLayout:
                TripButton:


            Button:
                text: 'Add Trip'
                font_size: 12
                size_hint: (0.1, 0.1)
                pos_hint: {'right':1, 'bottom':1}
                on_release: app.open_popup()
                pos_hint: {'right':1, 'bottom':1}
                on_release: app.open_popup()

I tried declaring the TripButton class above and below the MyPopup class and that didn't work. I compared my code with the kivy documentation for dynamic classes and the from what I can tell I'm matching the syntax. I tried importing the Button class in both the python file and the .kv file and that hasn't worked.

To clarify all of this is in the same .kv file in the same directory as the python file. the app runs until I click the submit button in MyPopup then the program crashes and I get the NameError. This is what I have in my python file.

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup

class FirstScreen(Screen):
    pass

class MyPopup(Popup):
    pass

class MyApp(App):

    def build(self):
        sm = ScreenManager()
        sm.add_widget(FirstScreen(name='first'))
        sm.current = 'first'
        return sm

    def open_popup(self):
        p = MyPopup()
        p.open()

    def add_button(self):
        pass


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

What am I doing wrong? What else I can try? Thanks for your time.

答案1

得分: 0

要访问在kv文件中定义的类,请使用kivy.factory.Factory

id属性添加到您的按钮的BoxLayout,以替换kv文件中的以下部分:

            BoxLayout:
                TripButton:

用以下内容替换:

            BoxLayout:
                id: trip_buttons
                TripButton:

然后替换:

    root.parent.parent.add_widget(TripButton(text=trip_name.text, size_hint=(1,0.1)))

用以下内容替换:

    app.root.current_screen.ids.trip_buttons.add_widget(kivy.factory.Factory.TripButton(text=trip_name.text, size_hint=(1,0.1)))

您还在第一个屏幕的最后一个按钮定义中重复了以下行。请替换:

                pos_hint: {'right':1, 'bottom':1}
                on_release: app.open_popup()
                pos_hint: {'right':1, 'bottom':1}
                on_release: app.open_popup()

用以下内容替换:

                pos_hint: {'right':1, 'bottom':1}
                on_release: app.open_popup()
英文:

To access classes defined within kv file use kivy.factory.Factory

Add id attribute to your button's BoxLayout, so replace following part of kv file:

        BoxLayout:
            TripButton:

with

        BoxLayout:
            id: trip_buttons
            TripButton:

then replace:

root.parent.parent.add_widget(TripButton(text=trip_name.text, size_hint=(1,0.1)))

with:

app.root.current_screen.ids.trip_buttons.add_widget(kivy.factory.Factory.TripButton(text=trip_name.text, size_hint=(1,0.1)))

You also duplicated following lines within last button definition on first screen. Replace:

            pos_hint: {'right':1, 'bottom':1}
            on_release: app.open_popup()
            pos_hint: {'right':1, 'bottom':1}
            on_release: app.open_popup()

with

            pos_hint: {'right':1, 'bottom':1}
            on_release: app.open_popup()

huangapple
  • 本文由 发表于 2023年2月7日 03:53:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/75365944.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定