2016-12-03 88 views
0

据我所知,kv语言在制作静态显示时非常有用,例如,而不是在运行时需要很多小部件定位的游戏。在这里我尝试做一个简单的游戏,但仍然需要很多定位,所以kv语言不在窗口小部件的上下文中,而不在屏幕上。我使用屏幕来区分主菜单和游戏屏幕。但是当我尝试使用'add_widget'来插入图像时,它总是位于窗口的中间位置。后来我发现屏幕尺寸只有100x100。将小部件动态添加到kivy屏幕对象中

下面是我能想到的唯一途径,但仍然没有运气:

class HomeScreen(Screen): 
    pass 

class GameScreen(Screen): 
    pass 

class ScreenManagement(ScreenManager): 
    pass 

presentation=Builder.load_file('ProjectSD.kv') 

class ProjectSDApp(App): 
    def build(self): 
     A=presentation 
     A.screens[0].size=(Window.size) 
     A.screens[0].add_widget(Label(text='hello',font_Size=80,pos=(0,0))) 
     return A 

if __name__=='__main__': 
    print(Window.size) 
    ProjectSDApp().run() 

和我ProjectSD.kv文件:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition 
ScreenManagement: 
    transition: FadeTransition() 
    HomeScreen: 
    GameScreen: 
<Button>: 
    font_name:'attackofthecucumbers.ttf' 

<HomeScreen>: 
    name:'home' 
    canvas: 
     Rectangle: 
      pos: self.pos 
      size: self.size 
      source: 'nature.jpg' 
    Label: 
     text: 'Monopoly GX' 
     font_name:'KBDunkTank.ttf' 
     font_size:100 
     size_hint:0.7,0.2 
     pos:root.width*0.15,root.height*0.70 
    Button: 
     on_release: app.root.current = "game" 
     text: 'Play Game' 
     font_size:root.width/20 
     size_hint:0.3,0.15 
     pos:root.width*0.35,root.height*0.45 
    Button: 
     on_release: app.stop() 
     text: 'exit' 
     font_size:root.width/20 
     size_hint:0.3,0.15 
     pos:root.width*0.35,root.height*0.20 

<GameScreen>: 
    name:'game' 
    Button: 
     on_release: app.root.current = "home" 
     background_color: (1,0.15,0.2,0.8) 
     text: 'X' 
     font_size:root.width/40 
     size_hint:0.05,0.05 
     pos:root.width*0.95,root.height*0.95 

由于没有“正”的方法在屏幕对象中,我把我的小部件手动定位(0,0)。

我发现的唯一方法就是下面: https://kivyspacegame.wordpress.com/2014/08/10/tutorial-flappy-ship-part-2-build-simple-menus-and-animate-your-games-using-clock/

所以我的问题是,如果我在使用屏幕对象从kivy的构建,如何达到同样的效果?所以我仍然可以添加和删除小部件,因为我想以后呢?

+0

你能编辑你的问题更具体你要问什么.kv文件?您是否想要将图像添加到现有屏幕?作为背景(即另一个小部件的画布)?添加一个屏幕到屏幕管理器?应该使用屏幕来保存其他自己可以容纳诸如图像之类的布局。还请发布更多代码,一个MCVE - http://stackoverflow.com/help/mcve – Daniel

+0

对不起,我想要做的是将图像或任何内容添加到现有屏幕,该屏幕是用kivy的内部版本创建的蟒蛇。我真正的问题是屏幕尺寸只有100x100。而不是作为背景,但作为一个可以稍后移动的对象 – aaron

+0

你的kv文件的内容是什么 – Daniel

回答

0

我不完全清楚你在问什么;我没有看到代码中的任何地方,您正试图将图像添加到布局。你在中间添加一个标签,并且工作正常。

我认为,因为您正在创建没有任何布局的屏幕,也没有设置默认窗口大小,屏幕只占用最小的默认大小。您需要添加布局,并与开头例如具有限定的尺寸,或设置窗口大小的东西填满它:

# window import 
from kivy.core.window import Window 
from kivy.utils import get_color_from_hex 
Window.size = (1920/2,1080/2) 
Window.clearcolor = get_color_from_hex('#000000') # black 

下面是一些代码,创建你的两个Screen S,并增加了一个可拖动和在FloatLayout的位置处的静态Image

from kivy.app import App 
from kivy.uix.screenmanager import (ScreenManager, Screen) 
from kivy.uix.image import Image 
from kivy.uix.label import Label 
from kivy.uix.button import Button 
from kivy.uix.behaviors import DragBehavior 
from kivy.lang import Builder 
from kivy.uix.floatlayout import FloatLayout 

class HomeScreen(Screen): 
    pass 

class GameScreen(Screen): 
    pass 

class ScreenManagement(ScreenManager): 
    pass 

class MovingImage(DragBehavior,Image): 
    pass 

class DragLabel(DragBehavior, Label): 
    pass 

class StaticImage(Image): 
    pass 

class MyApp(App): 
    def build(self): 
     A = ScreenManagement() 
     A.current = 'game' 
     A.screens[1].ids.gamefloat.add_widget(MovingImage(size_hint = [0.3,0.3])) 
     A.screens[1].ids.gamefloat.add_widget(StaticImage(pos = (150,300))) 
     return A 

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

,并呼吁myapp.kv

<ScreenManagement>: 
    HomeScreen: 
    GameScreen: 

<Button>: 

<HomeScreen>: 
    name:'home' 
    canvas: 
     Rectangle: 
      pos: self.pos 
      size: self.size 
      source: 'image.jpg' 
    Label: 
     text: 'Monopoly GX' 
     font_size:100 
     size_hint:0.7,0.2 
     pos:root.width*0.15,root.height*0.70 
    Button: 
     on_release: app.root.current = "game" 
     text: 'Play Game' 
     font_size:root.width/20 
     size_hint:0.3,0.15 
     pos:root.width*0.35,root.height*0.45 
    Button: 
     on_release: app.stop() 
     text: 'exit' 
     font_size:root.width/20 
     size_hint:0.3,0.15 
     pos:root.width*0.35,root.height*0.20 

<GameScreen>: 
    name:'game' 
    FloatLayout: 
     id: gamefloat 
     Button: 
      on_release: app.root.current = "home" 
      background_color: (1,0.15,0.2,0.8) 
      text: 'X' 
      font_size:root.width/40 
      size_hint:0.05,0.05 
      pos:root.width*0.95,root.height*0.95 

<MovingImage>: 
    drag_rectangle: self.x, self.y, self.width, self.height 
    drag_timeout: 1000000 
    drag_distance: 0 
    source: 'image.jpg' 

<StaticImage>: 
    source: 'image.jpg' 
+0

我只是用一个简单的代码例如在这里做了一个标签。他们两个都是小部件,所以它不是基本相同? – aaron

相关问题