You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:18:11