2017-01-19 1 views
0

저는 처음 Kivy 응용 프로그램을 파이썬으로 작성했습니다 (지금 kv를 피하고 있습니다). WorldviewWidget이라는 사용자 정의 위젯을 만들었으므로이 패키지를 그리기 장소로 사용하려고합니다. 버튼 위젯을 사용하면 size_hint와 pos_hint를주고, 원하는 위치에 나타납니다. 그러나 위젯을 사용하면 size_hint 및 position_hint를 사용하여 WorldviewWidget에서 드로잉 할 직사각형의 크기를 조절하는 방법을 알 수 없습니다. 여기에 코드가 있습니다. 미리 감사드립니다!Kivy 응용 프로그램에서 캔버스 자동 크기 조정

#! /usr/bin/python 
from kivy.app import App 
from kivy.graphics import * 
from kivy.core.window import Window 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 


class WorldviewWidget(Widget): 
    def __init__(self, **kwargs): 
     super(WorldviewWidget, self).__init__(**kwargs) 

     self.canvas.clear() 
     print self.size, self.pos 

     with self.canvas: 
      Color(1, 0, 0, 1, mode='rgba') 
      # HELP! I want the rectangle to be resized when the window changes size so that it always takes up the same proportion of the screen. 
      self.rect = Rectangle(size=???, pos=???)  


class JFROCS_App(App): 

    def build(self): 
     Window.clearcolor = [1,1,1,1] 
     parent = FloatLayout(size=Window.size) 

     worldview = WorldviewWidget(size_hint=(0.4, 0.4), pos_hint = {'x':0.2, 'y':0.2}) 
     parent.add_widget(worldview) 


     start_btn = Button(text='Start', size_hint=(0.1, 0.1), pos_hint={'x':.02, 'y':.7}, background_color=[0,1,0,1]) 
     start_btn.bind(on_release=self.start_simulation) 
     parent.add_widget(start_btn) 

     pause_btn = Button(text='Pause', size_hint=(0.1,0.1), pos_hint={'x':.02, 'y':.6}, background_color=[1,1,0,1]) 
     pause_btn.bind(on_release=self.pause_simulation) 
     parent.add_widget(pause_btn) 

     stop_btn = Button(text='Stop', size_hint=(0.1,0.1), pos_hint={'x':.02, 'y':.5}, background_color=[1,0,0,1]) 
     stop_btn.bind(on_release=self.stop_simulation) 
     parent.add_widget(stop_btn) 

     return parent 

    def start_simulation(self, obj): 
     print "You pushed the start button!" 
    def pause_simulation(self, obj): 
     print "You pushed the pause button!" 
    def stop_simulation(self, obj): 
     print "You pushed the stop button!" 

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

답변

0

나는이 종류의 작업이 kivy-language에 대해 예정되어 있다고 생각하지만 여기에는 파이썬의 해결책이있다. 기본적으로 위젯이 부모의 size에서 변경 사항을 수신하도록하기 위해 bind -method를 사용했습니다. 이 메커니즘에 대한 자세한 내용은 this을 참조하십시오.

from kivy.app import App 
from kivy.graphics import * 
from kivy.core.window import Window 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 


class WorldviewWidget(Widget): 
    def __init__(self, **kwargs): 
     super(WorldviewWidget, self).__init__(**kwargs) 

     self.canvas.clear() 
     print self.size, self.pos 

     with self.canvas: 
      Color(1, 0, 0, 1, mode='rgba') 
      # *changed* ############################################## 
      self.rect = Rectangle(size=self.size, pos=self.pos)  

    # *new* ########################################################## 
    def update_size(self, instance, new_size): 
     print "UPDATING SIZE", instance, new_size 
     self.size[0] = new_size[0] * 0.4 
     self.size[1] = new_size[1] * 0.4 
     self.rect.size = self.size 
     self.pos[0] = self.parent.size[0] * 0.2 
     self.pos[1] = self.parent.size[1] * 0.2 
     self.rect.pos = self.pos 

class JFROCS_App(App): 

    def build(self): 
     Window.clearcolor = [1,1,1,1] 
     parent = FloatLayout(size=Window.size) 

     # *changed* ################################################## 
     worldview = WorldviewWidget(size=(0.4*parent.size[0], 0.4*parent.size[1]), 
            pos=(0.2*parent.size[0], 0.2*parent.size[1])) 
     # makes sure that the widget gets updated when parent's size changes: 
     parent.bind(size=worldview.update_size) 
     parent.add_widget(worldview) 


     start_btn = Button(text='Start', size_hint=(0.1, 0.1), pos_hint={'x':.02, 'y':.7}, background_color=[0,1,0,1]) 
     start_btn.bind(on_release=self.start_simulation) 
     parent.add_widget(start_btn) 

     pause_btn = Button(text='Pause', size_hint=(0.1,0.1), pos_hint={'x':.02, 'y':.6}, background_color=[1,1,0,1]) 
     pause_btn.bind(on_release=self.pause_simulation) 
     parent.add_widget(pause_btn) 

     stop_btn = Button(text='Stop', size_hint=(0.1,0.1), pos_hint={'x':.02, 'y':.5}, background_color=[1,0,0,1]) 
     stop_btn.bind(on_release=self.stop_simulation) 
     parent.add_widget(stop_btn) 

     return parent 

    def start_simulation(self, obj): 
     print "You pushed the start button!" 
    def pause_simulation(self, obj): 
     print "You pushed the pause button!" 
    def stop_simulation(self, obj): 
     print "You pushed the stop button!" 

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

그리고 kivy 언어를 보라 - 그것은 모두 당신을 위해 바인딩 :

+0

감사합니다 돌봐! 나는 확실히 언어를 들여다 볼 것이다. 나는 단지 그것이 장면들 뒤에 무엇을하고 있는지를 이해하고 싶다. :) –