Как я могу получить kivymd useranimationcard для моего приложения - PullRequest
0 голосов
/ 15 февраля 2020

Я работаю над проектом и пытаюсь добавить к нему анимационную карту. я делаю пример из документации 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'

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Это потому, что вы не указали путь к изображению. Измените эту конкретную строку вашего кода, указав путь к изображению.

path_to_avatar="image.jpg"
0 голосов
/ 04 мая 2020

Что ж, чтобы «заставить пользовательскую анимационную карту работать в вашем приложении», вам может понадобиться гибкость в использовании пользовательской анимационной карты, помимо примера.

Вы можете настроить приложение для использования пользовательской анимационной карты. от .kv file, как в примере ниже.

В этом примере мы будем использовать left_action_items из MDtoolbar, чтобы показать карточку анимации пользователя при нажатии.

Не забудьте добавить путь к аватару (изображение).

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"
0 голосов
/ 29 апреля 2020
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()

Друг, код верен, вам просто нужно указать путь к изображению.

...