2016-05-19 2 views
0

私のコードは、ウィジェットを親ビューに配置する前に動的にサイズを調整します。幅は、各ウィジェットの整数として単純に計算され、独立して割り当てられます。問題は、大きなウィジェットが表示されたときに、すでに配置されていても変更されていないにもかかわらず、以前のウィジェットのサイズがまったく同じであるということです。
私は調査するためにデバッガをオンにしました。各ウィジェットの幅はメモリの1か所に配置されています。したがって、それらはすべて実質的に同じであり、1つのウィジェットでそれを変更すると、他のウィジェットが適切に変更されます。ここでは問題を表し汚いアプリは次のとおりです。Kivyで望ましくないプロパティの共有

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import Screen 
from kivy.uix.label import Label 
from kivy.uix.widget import Widget 
from kivy.uix.textinput import TextInput 
from kivy.uix.button import Button 
from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 

Builder.load_string('''   
<ScrollView>: 
    canvas: 
     Color: 
      rgba: 1, 1, 1, 1 
     Rectangle: 
      pos: self.pos 
      size: self.size 

<Message>: 
    x: 5 
    width: 500 
    canvas: 
     Color: 
      rgba: 1,0,0,1 
     Rectangle: 
      pos: self.pos 
      size: self.size 
    BoxLayout: 
     pos: root.pos 
     height: self.height 
     canvas: 
      Color: 
       rgba: 1,1,1,1 
      RoundedRectangle: 
       pos: root.x, root.y 
       size: self.width, self.height 

     TextInput: 
      pos: root.pos 
      size: root.size 
      id: msg 
      background_color: 0, 0, 0, 0 
''') 

class Chat(Screen): 
    pass 

class Message(Widget): 
    pass 

class ChatApp(App): 
    def width_modify(self): 
     min_width = 160 
     max_width = 320 
     max_line = 0 
     for i in self.msg_stack[-1].ids['msg']._lines_labels: 
      if i.width > max_line: 
       max_line = i.width 
     curr_width = max_line + 15 
     return curr_width 

    def msg_in(self, btn): 
     msg_stack = self.msg_stack 
     msg = self.tx1_main.text.strip("\n ") 
     msg_stack.append(Message()) 
     msg_stack[-1].ids['msg'].text = msg 

     msg_stack[-1].size_hint = [None, None] 
     msg_stack[-1].width = self.width_modify() 
     msg_stack[-1].height = (len(msg_stack[-1].ids['msg']._lines_labels) + 1) * (msg_stack[-1].ids['msg'].line_height) 
     for i in msg_stack[-1].walk(): 
      i.height = msg_stack[-1].height 
      i.width = msg_stack[-1].width 

     msg_stack[-1].y = self.sv1_main.height - 5 - self.pr_msg_y - msg_stack[-1].height 

     self.msg_layout.add_widget(msg_stack[-1]) 
     self.pr_msg_y += msg_stack[-1].height + 5 


    def build(self): 
     self.msg_stack = [] 
     self.pr_msg_y = 5 

     self.chat = Chat() 
     self.tx1_main = TextInput(size_hint = (0.9, 0.155)) 
     self.sv1_main = ScrollView(pos_hint = {"top":0.87, "center_x":0.5}, 
            size_hint = (0.97, 0.65)) 
     self.msg_layout = GridLayout(height = 10, cols = 1, size_hint_y = None) 
     self.msg_layout.bind(minimum_height = self.msg_layout.setter('height')) 

     self.bt1_main = Button(size_hint = (0.061, 0.078), 
           pos_hint = {"top":0.097, "center_x":0.951}, 
           on_press = self.msg_in) 

     self.chat.add_widget(self.tx1_main) 
     self.chat.add_widget(self.sv1_main) 
     self.sv1_main.add_widget(self.msg_layout) 
     self.chat.add_widget(self.bt1_main) 
     return self.chat 

ChatApp().run() 

私は問題がMessageウィジェット、特にこのラインwidth: 500のKV定義であるかもしれないと思います。私はテスト目的のために置いたプロパティですが、現在はそれを削除することでサイズ変更が中断します。また、それをコメントアウトすることは実際には何も解決していないようです。じゃあどうすればいい?
これは、問題を示すためにlinkです。赤コーナーはKivyの最新開発版に

+1

はあなたが予想される動作が何であるかをより詳細に説明することができ、問題を解決するようで、期待通り、これは動作しませんか?私が実行すると、下に文字列を入力することができます。ボタンをクリックすると、文字列を表示するのに必要な長さのメッセージが表示されます。 – zeeMonkeez

+0

widthはすでにウィジェットのNumericPropertyであり、避けることはできません。とにかくプロパティーはディスクリプタです(ほとんどの場合、通常のインスタンス・アトリビュートとして動作します)。プロパティーが問題を引き起こすことはありません。 – inclement

+0

@ zeeMonkeez最初に文字列を入力してボタンを押すと、ウィジェットの赤い境界線が表示されます。もう少しテキストを書いてもう一度押すと、最初のものの境界が拡張されていることがわかります。これは私が望むものではありません。私は彼らがお互いから独立していてほしいです。 – Leva7

答えて

0

のアップグレードを拡張してはならない(v1.9.2-dev0は)

関連する問題