私のコードは、ウィジェットを親ビューに配置する前に動的にサイズを調整します。幅は、各ウィジェットの整数として単純に計算され、独立して割り当てられます。問題は、大きなウィジェットが表示されたときに、すでに配置されていても変更されていないにもかかわらず、以前のウィジェットのサイズがまったく同じであるということです。
私は調査するためにデバッガをオンにしました。各ウィジェットの幅はメモリの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の最新開発版に
はあなたが予想される動作が何であるかをより詳細に説明することができ、問題を解決するようで、期待通り、これは動作しませんか?私が実行すると、下に文字列を入力することができます。ボタンをクリックすると、文字列を表示するのに必要な長さのメッセージが表示されます。 – zeeMonkeez
widthはすでにウィジェットのNumericPropertyであり、避けることはできません。とにかくプロパティーはディスクリプタです(ほとんどの場合、通常のインスタンス・アトリビュートとして動作します)。プロパティーが問題を引き起こすことはありません。 – inclement
@ zeeMonkeez最初に文字列を入力してボタンを押すと、ウィジェットの赤い境界線が表示されます。もう少しテキストを書いてもう一度押すと、最初のものの境界が拡張されていることがわかります。これは私が望むものではありません。私は彼らがお互いから独立していてほしいです。 – Leva7