嗨,我一直在try 用Kivy创建一个基本的聊天,并遵循了本教程的一部分: https://www.youtube.com/watch?v=lmWE2bydekk个
新的消息被添加到底部,但我有一个问题,当用户滚动或添加下一条消息时,文本似乎从底部漂浮到顶部,在捕捉到底部后.我对视频中的原始代码做了一些修改,试图修复它,但无济于事.
完整代码:
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from kivy.clock import Clock
Window.size = (500, 500)
class ScrollableLabel(ScrollView):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.layout = GridLayout(cols=1, size_hint_y=None)
self.add_widget(self.layout)
self.chat_history = Label(size_hint_y=None, markup=True, halign='left',text_size=(None, None))
self.chat_history.bind(width=lambda s, w: s.setter('text_size')(s, (w, None)))
self.scroll_to_point = Label(size_hint_y=None, height=1)
self.layout.add_widget(self.chat_history)
self.layout.add_widget(self.scroll_to_point)
def update_chat_history(self, message):
self.chat_history.text += '\n' + message
self.chat_history.height = self.chat_history.texture_size[1]
self.layout.height = self.chat_history.texture_size[1] +15
self.chat_history.tet_size = (self.chat_history.width*0.98,None)
self.scroll_to(self.scroll_to_point)
#self.scroll_to_point.height = 1
#self.scroll_y = 0
class Example(App):
def build(self):
layout = GridLayout(cols=1,
row_default_height=40,
spacing = 10,
padding = 10,
)
secondLayout = GridLayout(cols=2, row_force_default=True, row_default_height=40,
spacing = 10,
)
self.new_message = TextInput(width=Window.size[0]*0.8,size_hint_x=None, multiline=False)
submit = Button(text="submit", on_press=self.send_message)
self.history = ScrollableLabel(height=Window.size[1]*0.9, size_hint_y=None)
layout.add_widget(self.history)
secondLayout.add_widget(self.new_message)
secondLayout.add_widget(submit)
layout.add_widget(secondLayout)
initial_messages = ["Hello!", "How are you?", "Test message"]
for message in initial_messages:
self.incoming_message(message)
Clock.schedule_once(self.focus_text_input, 1)
layout.bind(size=self.adjust_fields)
return layout
def adjust_fields(self, *_):
if Window.size[1]*0.1<50:
new_height=Window.size[1]-50
else:
new_height=Window.size[1]*0.9
self.history.height=new_height
if Window.size[0]*0.2<160:
new_width=Window.size[0]-160
else:
new_width=Window.size[0]*0.8
self.new_message.width=new_width
def send_message(self, _):
message = self.new_message.text
self.new_message.text=""
if message:
self.history.update_chat_history(f"[color=dd2020]You[/color] > {message}")
def focus_text_input(self,_):
self.new_message.focus = True
def incoming_message(self, message):
self.history.update_chat_history(f"[color=20dd20]PowerBot[/color] > {message}")
Example().run()
我试过的线路是self.scroll_to_point.height = 1
和self.scroll_y = 0
,但我真的不知道我在做什么.有什么帮助吗?