Kivy: как мне использовать макеты на отдельных экранах при использовании ScreenManager?

#python #python-3.x #kivy #kivy-language

#python #python-3.x #kivy #kivy-language

Вопрос:

У меня есть некоторый код Kivy, который пока отображает экран (BrickBreakerMenuScreen) с изображением и меткой, который при нажатии меняется на пустой экран (GameScreen) с изображением в центре. Однако это не является целью моего кода; как вы можете видеть из конструктора, второй экран должен выровнять изображение в правом верхнем углу:

 from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.image import Image
from kivy import Config
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.animation import Animation
import time

Config.set('graphics', 'multisamples', '0')
Builder.load_string('''
<BrickBreakerMenuScreen>:
    BoxLayout:
        orientation: 'vertical'
        Image:
            source: 'brickbreaker log.png'
        Label:
            font_name: 'vgafix.fon'
            text: 'Tap to start'

<GameScreen>:
    AnchorLayout:
        anchor_x: 'right'
        anchor_y: 'top'
        Image:
            source: 'settings-cog.png'
''')

class BrickBreakerMenuScreen(Screen):
    def __init__(self, **kwargs):
        super(BrickBreakerMenuScreen, self).__init__(**kwargs)

    def on_touch_down(self, touch):
        sm.current = 'game'

class GameScreen(Screen):
    def __init__(self, **kwargs):
        super(GameScreen, self).__init__(**kwargs)

sm = ScreenManager(transition = FadeTransition())
sm.add_widget(BrickBreakerMenuScreen(name='menu'))
sm.add_widget(GameScreen(name='game'))

class BrickBreakerInsanityApp(App):
    def build(self):
        return sm



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

Это проблема из-за ScreenManager? Я изменил скрипт kv, чтобы попытаться выяснить, не связано ли это с AnchorLayout, но ни один из других макетов не изменяет местоположение изображения на игровом экране.

Любая помощь очень ценится. Спасибо!

Изображения:

винтик из GameScreen

логотип из BrickBreakerMenuScreen

Ответ №1:

Ваш код работает нормально. Изображение находится в правом верхнем углу.
Ваша проблема заключается в размере этого Image виджета. Он такой же большой, как размер окна.
Чтобы исправить это, вы могли бы добавить size_hint: .1, .1 в Image свойства, и они будут отображаться так, как вы хотите.

     Image:
        size_hint: .1, .1
        source: 'settings-cog.png'