2016-12-03 135 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

相關問題