【问题标题】:Using add_widget in the kv file在 kv 文件中使用 add_widget
【发布时间】:2020-01-03 10:05:37
【问题描述】:

我在我的 kv 文件中动态添加小部件时遇到问题,到目前为止我所看到的一切都是围绕在 py 文件中添加小部件。我想为此使用 kv 文件的原因是我有一个修改过的 Button 小部件,我想使用它写在 kv 文件中,但我不知道如何在 py 文件中创建它。

所以我猜有两个可能的问题:

1) 如何在 kv 文件中正确使用 add_widget。在下面的代码中,我得到 NameError: SmoothButton is not defined。

或者

2) 如何在 py 文件中创建我的 SmoothButton?

kv 文件:

WindowManager:
    ChatPage:

<ChatPage>:
    name: "chat_page"

    NavigationLayout:
        id: nav_layout
        MDNavigationDrawer:
            NavigationDrawerIconButton:
                text: "Test"
                on_release: app.root.current = "login"

        FloatLayout:
            MDToolbar:
                pos_hint: {'top': 1}
                md_bg_color: 0.2, 0.6, 1, 1
                left_action_items: [['menu', lambda x: root.ids.nav_layout.toggle_nav_drawer()]]

            Button:
                text: "Create button"
                pos_hint: {"x": 0.65, "top": 0.15}
                size_hint: 0.35, 0.15
                on_release: root.add_widget(SmoothButton)


<SmoothButton@Button>:
    background_color: 0,0,0,0
    background_normal: ""
    back_color: 1,0,1,1
    border_radius: [6]
    canvas.before:
        Color:
            rgba: self.back_color
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: self.border_radius

py 文件:

import kivy
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty, NumericProperty, ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivymd.theming import ThemeManager
import mysql.connector
from kivymd.uix.picker import MDDatePicker

class ChatPage(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class MyApp(App):
    theme_cls = ThemeManager()

    def build(self):
        kv = Builder.load_file("kivy.kv")
        sm = WindowManager()

        screens = [ChatPage(name="chat_page")]
        for screen in screens:
            sm.add_widget(screen)

        sm.current = "chat_page"
        return sm


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

【问题讨论】:

  • 使用root.add_widget(SmoothButton())
  • 我也试过了,得到了同样的错误信息
  • 好的,我已经编辑过了。谢谢

标签: python python-3.x kivy kivy-language


【解决方案1】:

如果您想在 .kv 中添加修改后的小部件,这并不意味着您必须在此处添加它。解决方案是将 .kv 中修改后的小部件暴露给 .py,并在添加小部件的“ChatPage”中创建一个方法:

*.py

# ...
class SmoothButton(Button):
    pass


class ChatPage(Screen):
    def on_released(self):
        self.add_widget(SmoothButton())

# ...

*.kv

# ...
<ChatPage>:
    name: "chat_page"

    NavigationLayout:
        id: nav_layout
        MDNavigationDrawer:
            NavigationDrawerIconButton:
                text: "Test"
                on_release: app.root.current = "login"

        FloatLayout:
            MDToolbar:
                pos_hint: {'top': 1}
                md_bg_color: 0.2, 0.6, 1, 1
                left_action_items: [['menu', lambda x: root.ids.nav_layout.toggle_nav_drawer()]]

            Button:
                text: "Create button"
                pos_hint: {"x": 0.65, "top": 0.15}
                size_hint: 0.35, 0.15
                on_release: root.on_released() # <---


<SmoothButton>: # <---
    background_color: 0,0,0,0
    # ... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2020-12-06
    相关资源
    最近更新 更多