更改窗口小部件大小

时间:2014-03-22 01:31:30

标签: kivy

所以我有一个游戏,我有一张树的图片和一个可移动的角色。我无法让collide_widget工作,也无法找出原因。我打开了Kivy Inspector并发现当我点击我的可移动角色时有一个小红框,但是当我点击树的图片时,整个kivy窗口变成红色,所以我猜测小部件大小与整个窗口一样大(这也解释了为什么collide_widget始终显示为True)。为了解决这个问题,我被告知要添加size_hint = None并指定树的大小。当我在构建中实例化树时,我这样做了,但整个屏幕仍然变为红色,我点击了树。

我的问题是小部件树在里面太大了吗?我如何让它变小?添加size_hint = None并将大小更改为50,50并没有修复它,除非我做错了。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.label import Label
from kivy.uix.behaviors import ButtonBehavior
from kivy.core.audio import SoundLoader
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import FallOutTransition


gamelayout = RelativeLayout(size=(300, 300))
bglayout = RelativeLayout()

class Game(Screen):
    pass    

class Bg(Image):

    def __init__(self, **kwargs):
        super(Bg, self).__init__(**kwargs)
        self.allow_stretch = True
        self.size_hint = (None, None)
        self.size = (1440, 1440)


class MoveableImage(Image):

    def __init__(self, **kwargs):
        super(MoveableImage, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(None, self)
        if not self._keyboard:
            return
        self._keyboard.bind(on_key_down=self.on_keyboard_down)
        self._keyboard.bind(on_key_up=self.on_keyboard_up)
        self.size_hint = (.11, .11)
        self.y = (Window.height/2.1)
        self.app = App.get_running_app()

    def collide_with_tree(self, tree):
        if self.widget_collide(self.app.tree):
            print "success"


    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'left':
            print self.pos
            print self.app.tree.pos
            self.collide_with_tree(self.app.tree)
            self.source = 'selectionscreen/left.zip'
            self.anim_delay=.20
            if self.x < (Window.width * .25):
                bglayout.x += 4
            else:
                self.x -= 6
        elif keycode[1] == 'right':
            self.source ='selectionscreen/right.zip'
            self.anim_delay=.20
            if self.x > (Window.width * .70):
                bglayout.x -= 4
            else:
                self.x += 6
        elif keycode[1] == 'down':
            self.source ='selectionscreen/right.zip'
            self.anim_delay=.20
            if self.y < (Window.height * .25):
                bglayout.y += 4
            else:
                self.y -= 6
        elif keycode[1] == 'up':
            self.source = 'selectionscreen/back.zip'
            self.anim_delay=.1
            if self.y > (Window.height * .70):
                bglayout.y -= 4
            else:
                self.y += 6
        else:
            return False
        return True

    def on_keyboard_up(self, keyboard, keycode):
        if keycode[1] == 'left':
            self.source = 'selectionscreen/left1.png'
        elif keycode[1] == 'right':
            self.source ='selectionscreen/right1.png'
        elif keycode[1] == 'down':
            self.source ='selectionscreen/right1.png'
        elif keycode[1] == 'up':
            self.source ='selectionscreen/back2.png'
        else:
            return False
        return True


class gameApp(App):
    def build(self):
        global sm
        sm = ScreenManager()
        game = Game(name='game')
        sm.add_widget(game)
        hero = MoveableImage(source='selectionscreen/right1.png')
        self.tree = Image(source='selectionscreen/tree.zip', size_hint=(None, None), size=(50, 50))
        self.background=Bg(source='selectionscreen/background9.png')

        #add widgets to bglayout
        bglayout.add_widget(self.background)
        bglayout.add_widget(self.tree)

        #add bglayout and moveable hero to gamelayout
        gamelayout.add_widget(bglayout)
        gamelayout.add_widget(hero)
        game.add_widget(gamelayout)

        return sm



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

1 个答案:

答案 0 :(得分:0)

您需要使用 FloatLayout 而不是RelativeLayout(或者只是将一个FloatLayout添加到ScreenManager的屏幕(这是一个RelativeLayout)),而是将所有游戏小部件放在FloatLayout中。

所以,你需要这样的东西:

sm = ScreenManager()
game_screen = Screen()
game = FloatLayout()
game_screen.add_widget(game)

..然后将所有游戏小部件添加到游戏中,以便大小固定,而不是与父级布局的“相对”。