KivyMD Hero Item не работает при добавлении домашней страницыPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 KivyMD Hero Item не работает при добавлении домашней страницы

Сообщение Anonymous »

Я использую предметы героев kivyMD, обнаружил одну проблему, герои работают только если они находятся на первом/главном экране,
код -

Код: Выделить всё

from kivy.animation import Animation
from kivy.clock import Clock
from kivy.properties import StringProperty, ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.scrollview import ScrollView
from kivymd.app import MDApp
from kivymd.uix.hero import MDHeroFrom, MDHeroTo
from kivymd.uix.imagelist.imagelist import MDSmartTile, MDSmartTileImage, MDSmartTileOverlayContainer
from kivy.metrics import dp
from kivymd.uix.button import MDButton, MDButtonIcon, MDButtonText
from kivymd.uix.screen import MDScreen
from kivymd.uix.screenmanager import MDScreenManager
from kivymd.uix.label.label import MDLabel
from kivymd.uix.scrollview import StretchOverScrollStencil, MDScrollView
from kivymd.uix.gridlayout import MDGridLayout
from kivy.core.window import Window
from functools import partial
import time

class Example2(MDApp):

def create_tile(self, img_path, index):
# Create SmartTile
tag_name = "Tag "+ str(index)
herofrom = MDHeroFrom(size_hint_y = None, height = "200dp", radius = "24dp",
tag=tag_name,
)

tile = MDSmartTile(size_hint=(0.5, None), height="200dp")  # Use size_hint appropriately
tile.bind(on_release=lambda x: self.switch_to_screen_b(tag=tag_name))

# Create SmartTileImage
image = MDSmartTileImage(source=img_path, radius="24dp")
image.ripple_duration_in_fast = 0.05
tile.add_widget(image)

# Create Overlay Container
overlay = MDSmartTileOverlayContainer(
md_bg_color=(0, 0, 0, .5),
adaptive_height=True,
radius=[0, 0, dp(24), dp(24)],
padding="8dp",
spacing="8dp",
)

label = MDLabel(text=tag_name, theme_text_color='Custom', text_color="white", adaptive_height=True)
overlay.add_widget(label)
tile.add_widget(overlay)

herofrom.add_widget(tile)
return herofrom

def switch_to_screen_b(self, tag):
#time.sleep(0.2)
print('?tag', tag)
self.manager.current_heroes = [tag]
screen_b = self.manager.get_screen("screen B")
print('screen_b', screen_b)
print('screen_b.hero_to.tag', self.hero_to.tag)
self.hero_to.tag = tag
print('screen_b.hero_to.tag', self.hero_to.tag)
self.manager.current = "screen B"

def screenA_fun(self):
self.screenA = MDScreen(name='screen A')
scroll_view = MDScrollView()
grid = MDGridLayout(id='grid', cols=2, spacing="12dp", padding="12dp", adaptive_height = True,)
for i in range(12):
hero_item = self.create_tile('4.png', i)
grid.add_widget(hero_item)

scroll_view.add_widget(grid)
self.screenA.add_widget(scroll_view)

def screenB_fun(self):
self.hero_to = MDHeroTo(size_hint=(1, None), height="220dp", pos_hint={"top": 1})
self.screenB = MDScreen(name='screen B', heroes_to=[self.hero_to])
self.screenB.add_widget(self.hero_to)

button = MDButton(MDButtonText(text="Move Hero To Screen A"),
pos_hint={"center_x": .5}, y = "36dp")#size_hint_y=None, height=dp(50)

button.bind(on_release=lambda x: self.switch_to_screen_a(self.hero_to))
self.screenB.add_widget(button)

def switch_to_screen_a(self, hero_to):
print('b', hero_to, hero_to.tag)
self.manager.current = "screen A"
self.manager.current_heroes = [hero_to.tag]

def screen0_fun(self):
self.main = MDScreen(name='screen 0')
button = MDButton(MDButtonText(text="start"),
pos_hint={"center_x": .5}, y = "36dp")#size_hint_y=None, height=dp(50)

button.bind(on_release=lambda x:  self.switch_to_screen_a_1())
self.main.add_widget(button)

def switch_to_screen_a_1(self, *args):
self.manager.current = "screen A"

def build(self):

self.theme_cls.theme_style_switch_animation = True
self.theme_cls.primary_palette = "Orange"
self.theme_cls.theme_style = "Dark"  # "Light"
print('self.theme_cls.backgroundColor', self.theme_cls.backgroundColor)

self.manager = MDScreenManager()
self.manager.primary_palette = "Orange"
self.manager.theme_style = "Dark"  # "Light"

self.screen0_fun()
self.manager.add_widget(self.main)

self.screenA_fun()
self.manager.add_widget(self.screenA)

self.screenB_fun()
self.manager.add_widget(self.screenB)

return self.manager

Example2().run()
Здесь, в этом коде, в методе сборки, я добавил эту строку self.manager.add_widget(self.main) в качестве главной/домашней страницы. Если я удалю эту строку, что означает удаление главного экрана, то герои будут работать правильно. Но когда я добавляю эту строку, чтобы сначала добавить главный экран, герои не работают и показывают эту ошибку -

Код: Выделить всё

kivy_learn_env/lib/python3.10/site-packages/kivymd/uix/transition/transition.py", line 202, in on_complete

hero_from_children = self._hero_from_widget_children[
KeyError: 'Tag 3'
ОТЛАДКА:
в файле kivy_learn_env/lib/python3.10/site-packages/kivymd/uix/ переход/переход.py - функция Animated_hero_out - метод класса on_complete - в строке 192, = должен вызываться только тогда, когда выбран элемент героя, но вместо этого происходит то, что происходит вызывается, когда сам открывается "экран А"
Как решить, спасибо

Подробнее здесь: https://stackoverflow.com/questions/792 ... -home-page
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»