wxPython中RichTextCtrl设置聊天消息背景色不生效的问题求助
wxPython中RichTextCtrl设置聊天消息背景色不生效的问题求助
各位大佬好,我正在做一个带聊天框的wxPython应用,想要实现每条消息用不同颜色的背景显示,但目前遇到了问题——消息能正常追加到RichTextCtrl里,但设置的文字颜色和背景色完全没变化,麻烦帮忙看看哪里出问题了!
我自定义了ChatDisplayer类继承自RichTextCtrl,写了addMessage方法来添加带样式的消息,代码如下:
class ChatDisplayer(RichTextCtrl): def __init__(self, *args, **kw): super().__init__(*args, **kw) def addMessage(self, message, red, green, blue): font = Font(12, DEFAULT, NORMAL, NORMAL, False) text_attr = RichTextAttr() text_attr.SetTextColour(BLACK) text_attr.SetFont(font) bg_color = Colour(red=red, green=green, blue=blue) text_attr.SetBackgroundColour(bg_color) self.BeginStyle(text_attr) self.AppendText(message) self.EndStyle()
现在的情况是,调用这个方法后消息确实能显示,但文字还是默认颜色,背景色也没变化。另外我注意到,SetBackgroundColour这个方法在wxPython的源码里能找到,但官方文档里没有相关说明,这会不会是问题所在?
我的主界面结构大概是这样的(简化后的代码):
class ChatMessageGrid(FlexGridSizer): def __init__(self, panel): super().__init__(6, 2, 9, 25) chat_message_apikey_label = StaticText(panel, label="API key") chat_message_apikey_input = TextCtrl(panel) chat_displayer_label = StaticText(panel, label="Chat", pos=(1, 0)) chat_displayer_input = ChatDisplayer(panel, ID_ANY, style=TE_MULTILINE|TE_READONLY) chat_message_system_label = StaticText(panel, label="System") chat_message_system_input = TextCtrl(panel) chat_message_label = StaticText(panel, label="your message") chat_message_text = TextCtrl(panel, style=TE_MULTILINE) chat_message_button = Button(panel, label="send") model_choice_label = StaticText(panel, label="model") model_choice_box = ComboBox(panel, value="bbb", choices=model_choices) self.AddMany( [ chat_message_apikey_label, (chat_message_apikey_input, 1, EXPAND), chat_message_system_label, (chat_message_system_input, 1, EXPAND), (chat_displayer_label, 1, EXPAND), (chat_displayer_input, 1, EXPAND), (chat_message_label, EXPAND), (chat_message_text, 1, EXPAND), (model_choice_label, EXPAND), (model_choice_box, EXPAND), (chat_message_button, EXPAND), ] ) self.AddGrowableRow(2, 1) self.AddGrowableRow(3, 1) self.AddGrowableCol(1, 1) chat_message_button.Bind( EVT_BUTTON, lambda event: self.onClick( event, chat_message_system_input, chat_message_apikey_input, chat_displayer_input, chat_message_text, model_choice_box, chat_message_button ), ) def completeRequest(self, messages, model, apiKey, chat_displayer_input, message, button): # 调用服务的逻辑省略 userMessage = "User:\n" aiMessage = "Assistant:\n" # 更新UI CallAfter(chat_displayer_input.addMessage, userMessage, 176, 210,167) # CallAfter(chat_displayer_input.addMessage, aiMessage, 176, 210,167) button.Enable() def onClick( self, event, chat_message_system_input: TextCtrl, chat_message_apikey_input: TextCtrl, chat_message_historic_input: ChatDisplayer, chat_message_text: TextCtrl, model_choice_box: ComboBox, button: Button ): if not len(chat_message_apikey_input.GetValue().strip()): MessageBox("API key is empty!", "Error", OK | ICON_ERROR) elif not len(chat_message_text.GetValue().strip()): MessageBox("type something please!", "Error", OK | ICON_ERROR) else: apiKey = chat_message_apikey_input.GetValue().strip() message = chat_message_text.GetValue().strip() button.Disable() # 创建线程处理API调用 t = threading.Thread(target=self.completeRequest, args=(messages, model_choice_box.GetValue(), apiKey, chat_message_historic_input, message, button)) t.start()
有没有大佬能帮我看看,为什么设置的背景色和文字颜色不生效?是不是我用RichTextAttr的方式不对?或者RichTextCtrl的样式设置有什么特殊要求?
备注:内容来源于stack exchange,提问作者Bouji
相关产品推荐
相关产品推荐

