2

pos_hint を使用してウィジェット (例: Scatter) を配置した後、現在の x、y 位置 (pos) を取得するにはどうすればよいですか?

例えば

wid.pos = (250, 350)
print wid.pos  <----- # it print (200, 350). Correct.
wid.pos_hint = {'top':0.9, 'right':0.5}  # moved the widget to other position using pos_hint.
print wid.pos  <----- # it sill print (200, 350) eventhough the widget position has changed.


編集: コード例

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.scatter import Scatter

Builder.load_string(""" 
<Icon@Scatter>: 
    size_hint: .06, .08

    Image:
        size: root.size
        allow_stretch: True
        keep_ratio: True
""")

class Icon(Scatter):
    def __init__(self, **kwargs):
        self.pos = (200, 200)
        self.move()
        super(Icon, self).__init__(**kwargs)

    def move(self):
        print "BEFORE: "
        print self.pos      # print 200, 200
        self.pos_hint = {'top':0.9, 'right':0.5} # assume now Scatter has moved to x800 y500.
        print "AFTER: "
        print self.pos      # it still print 200, 200 :(


class GameApp(App):
    def build(self):
        return Icon()

if __name__ == '__main__':
    GameApp().run()
4

1 に答える 1

1

size_hint問題は、レイアウトによって受け入れられる値 (または など)を割り当てた直後に、ウィンドウ (およびレイアウト自体) が更新されないことですpos_hint。ウィンドウが更新された直後 (メソッドが終了するまで) に更新されます。

基本的に、メソッドをdo_layout明示的に呼び出すことができます。ドキュメントには、「このメソッドは、レイアウトが必要なときにトリガーによって呼び出される」と記載されています。この種の使用法は文書化されていないため、明示的に呼び出すと問題が発生する可能性があるかどうかはわかりません。それは私のために働いていますが、注意してください:

wid.pos = (250, 350)
print wid.pos  # it prints (200, 350). Correct.
wid.pos_hint = {'top':0.9, 'right':0.5} 
print wid.pos  # it sill print (200, 350) 
wid.do_layout()
print wid.pos  # it should work now

Scatterウィンドウをリフレッシュする場合、つまり が(またはその他のWidget) が移動したことを実際に確認できた場合、これは必要ありません。


EDIT:問題のコードの修正版

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.scatter import Scatter
from kivy.uix.floatlayout import FloatLayout

Builder.load_string(""" 
<Icon>: 
    size_hint: .06, .08

    Image:
        size: root.size
        allow_stretch: True
        keep_ratio: True

<BaseLayout>:
    icon: _icon
    Icon:
        id: _icon
    Button: 
        text: "Press me"
        size_hint: .1,.05
        on_press: _icon.move()
""")

class Icon(Scatter):
    def __init__(self, **kwargs):
        self.pos = (200, 200)
        super(Icon, self).__init__(**kwargs)

    def move(self):
        print "BEFORE: "
        print self.pos      # print 200, 200
        self.pos_hint = {'top':0.9, 'right':0.5} # assume now Scatter has moved to x800 y500.
        self.parent.do_layout()
        print "AFTER: "
        print self.pos      # it still print 200, 200 :(


class BaseLayout(FloatLayout):
    pass


class GameApp(App):
    def build(self):
        return BaseLayout()

if __name__ == '__m
ain__':
    GameApp().run()
于 2013-08-04T17:54:54.313 に答える