如何让kivymd用户动画卡到我的应用程序中?

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

我正在做一个项目,并试图添加一个动画卡到它。我从kivymd文档中找到了一个例子,但我仍然无法让它运行。

这是我的代码

from kivy.lang import Builder
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.toast import toast
from kivymd.uix.useranimationcard import MDUserAnimationCard
from kivymd.uix.button import MDIconButton
from kivymd.uix.list import ILeftBodyTouch
from kivy.uix.image import Image

# Your content for a contact card.
Builder.load_string(
    """
#:import get_hex_from_color kivy.utils.get_hex_from_color


<TestAnimationCard@BoxLayout>:
    orientation: "vertical"
    padding: dp(10)
    spacing: dp(10)
    size_hint_y: None
    height: self.minimum_height

    BoxLayout:
        size_hint_y: None
        height: self.minimum_height

        Widget:
        MDRoundFlatButton:
            text: "Free call"
        Widget:
        MDRoundFlatButton:
            text: "Free message"
        Widget:

    OneLineIconListItem:
        text: "Video call"
        IconLeftSampleWidget:
            icon: "camera-front-variant"

    TwoLineIconListItem:
        text: "Call Viber Out"
        secondary_text: "[color=%s]Advantageous rates for calls[/color]" % get_hex_from_color(app.theme_cls.primary_color)
        IconLeftSampleWidget:
            icon: "phone"

    TwoLineIconListItem:
        text: "Call over mobile network"
        secondary_text: "[color=%s]Operator's tariffs apply[/color]" % get_hex_from_color(app.theme_cls.primary_color)
        IconLeftSampleWidget:
            icon: "remote"
"""
)


class IconLeftSampleWidget(ILeftBodyTouch, MDIconButton):
    pass


class MainApp(MDApp):
    user_animation_card = ObjectProperty()

    def __init__(self, **kwargs):
        self.title = "KivyMD Examples - User Animation Card"
        self.theme_cls.primary_palette = "Teal"
        super().__init__(**kwargs)

    def build(self):
        def main_back_callback():
            toast("Close card")

        if not self.user_animation_card:
            self.user_animation_card = MDUserAnimationCard(
                user_name="User Name",
                path_to_avatar="path_to_avatar",
                callback=main_back_callback,
            )
            self.user_animation_card.box_content.add_widget(Factory.TestAnimationCard())
        self.user_animation_card.open()


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

这是我得到的错误

Traceback (most recent call last):
   File "c:/Users/Allano/Desktop/exe/New folder (2)/MDtest.py", line 83, in <module>
     MainApp().run()
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\app.py", line 855, in run
     runTouchApp()
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\core\window\window_sdl2.py", line 747, in mainloop
     self._mainloop()
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\core\window\window_sdl2.py", line 479, in _mainloop
     EventLoop.idle()
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\base.py", line 339, in idle
     Clock.tick()
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\clock.py", line 591, in tick
     self._process_events()
   File "kivy\_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 167, in kivy._clock.ClockEvent.tick
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivy\uix\boxlayout.py", line 323, in do_layout
     c.size = (w, h)
   File "kivy\properties.pyx", line 497, in kivy.properties.Property.__set__
   File "kivy\properties.pyx", line 1371, in kivy.properties.ReferenceListProperty.set
   File "kivy\properties.pyx", line 599, in kivy.properties.Property.dispatch
   File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
   File "C:\Users\Allano\Anaconda3\lib\site-packages\kivymd\utils\fitimage.py", line 63, in adjust_size
     (img_x, img_y) = self.image.texture.size
 AttributeError: 'NoneType' object has no attribute 'size'
python python-3.x kivy kivy-language
1个回答
1
投票

这是因为你没有指定图像路径.通过指定图像路径来改变你代码中的这一行。

path_to_avatar="image.jpg"

0
投票
from kivy.lang import Builder
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.toast import toast
from kivymd.uix.useranimationcard import MDUserAnimationCard
from kivymd.uix.button import MDIconButton
from kivymd.uix.list import ILeftBodyTouch
from kivy.uix.image import Image

# Your content for a contact card.
Builder.load_string(
    """
#:import get_hex_from_color kivy.utils.get_hex_from_color


<TestAnimationCard@BoxLayout>:
    orientation: "vertical"
    padding: dp(10)
    spacing: dp(10)
    size_hint_y: None
    height: self.minimum_height

    BoxLayout:
        size_hint_y: None
        height: self.minimum_height

        Widget:
        MDRoundFlatButton:
            text: "Free call"
        Widget:
        MDRoundFlatButton:
            text: "Free message"
        Widget:

    OneLineIconListItem:
        text: "Video call"
        IconLeftSampleWidget:
            icon: "camera-front-variant"

    TwoLineIconListItem:
        text: "Call Viber Out"
        secondary_text: "[color=%s]Advantageous rates for calls[/color]" % get_hex_from_color(app.theme_cls.primary_color)
        IconLeftSampleWidget:
            icon: "phone"

    TwoLineIconListItem:
        text: "Call over mobile network"
        secondary_text: "[color=%s]Operator's tariffs apply[/color]" % get_hex_from_color(app.theme_cls.primary_color)
        IconLeftSampleWidget:
            icon: "remote"
"""
)


class IconLeftSampleWidget(ILeftBodyTouch, MDIconButton):
    pass


class MainApp(MDApp):
    user_animation_card = ObjectProperty()

    def __init__(self, **kwargs):
        self.title = "KivyMD Examples - User Animation Card"
        self.theme_cls.primary_palette = "Teal"
        super().__init__(**kwargs)

    def build(self):
        def main_back_callback():
            toast("Close card")

        if not self.user_animation_card:
            self.user_animation_card = MDUserAnimationCard(
                user_name="User Name",
                path_to_avatar="pathoftheimageyouwanttoview\\00000.png",
                callback=main_back_callback,
            )
            self.user_animation_card.box_content.add_widget(Factory.TestAnimationCard())
        self.user_animation_card.open()


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

朋友,代码是正确的,你只需要指定要暴露的图像的路径。


0
投票

好了,要想 "让用户动画卡在你的App中工作",除了例子之外,你可能还需要灵活使用用户动画卡。

你可以从以下方面定制你的应用来使用用户动画卡。.kv file 就像下面的例子。

在这个例子中,我们将使用 left_action_itemsMDtoolbar 以在点击时显示用户动画卡。

不要忘了添加头像(图片)的路径。

python代码(test.py)。

from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.list import ILeftBodyTouch
from kivymd.uix.useranimationcard import MDUserAnimationCard


class IconLeftSampleWidget(ILeftBodyTouch, MDIconButton):
    pass


class ShowUserAnimationCard(MDBoxLayout):
    user_animation_card = ObjectProperty()

    def __init__(self, **kw):
        super(ShowUserAnimationCard, self).__init__(**kw)

    def builder(self):
        if not self.user_animation_card:
            self.user_animation_card = MDUserAnimationCard(
                user_name=" user_name",
                path_to_avatar="path/to/avatar" # remember to add path to your avatar (image)
            )
            self.user_animation_card.box_content.add_widget(Factory.TestAnimationCard())
        self.user_animation_card.open()


class TestApp(MDApp):

    def __init__(self, **kw):
        super(TestApp, self).__init__(**kw)


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

kivy文件,(test.kv)。

ShowUserAnimationCard:
    orientation: 'vertical'

    MDToolbar:
        id: toolbar
        size_hint_y: dp(0.17)
        title: 'Test App'
        left_action_items: [['menu', lambda x: root.builder()]]

    MDBoxLayout:
    # To push MDToolbar at the top

<TestAnimationCard@MDBoxLayout>:
    orientation: 'vertical'
    padding: dp(10)
    spacing: dp(10)
    size_hint_y: None
    height: self.minimum_height

    MDBoxLayout:
        size_hint_y: None
        height: self.minimum_height

    TwoLineIconListItem:
        text: "Edit Account"
        text_size: "1dp"

        secondary_text: "[color=#009999]Edit Main Account[/color]"
        IconLeftSampleWidget:
            icon: "account-edit"

    TwoLineIconListItem:
        text: "Credit Card"
        secondary_text: "[color=#009999] Credit Card Outline[/color]"
        IconLeftSampleWidget:
            icon: "credit-card-outline"

    TwoLineIconListItem:
        text: "Delete account"
        secondary_text: "[color=#009999]Permanently delete this account[/color]"
        IconLeftSampleWidget:
            icon: "face"
© www.soinside.com 2019 - 2024. All rights reserved.