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

NO 'POS' メソッドが存在しないため私はウィジェットを(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のビルドで作成された画面が既存の画面に追加されていることです。 Python。私の本当の問題は、画面のサイズが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 

ここでは、あなたの2つの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

関連する問題