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

基于OpenAI、Python和Kivy库开发虚拟助手:界面消息显示问题

如何将OpenAI虚拟助手的消息显示到KivyMD的Label组件中?

要实现这个需求,你需要把OpenAI的虚拟助手逻辑和KivyMD的UI整合,同时避免同步API请求阻塞UI线程,具体实现步骤如下:

1. 完善UI布局,添加用户输入框

修改KV语言代码,新增输入框用于用户提交问题,调整布局结构适配多组件:

Screen:
    GridLayout:
        rows: 3
        size_hint_y: None
        height: self.minimum_height

        ScrollView:
            size_hint_y: None
            height: root.height * 0.7
            MDLabel:
                id: mdlab
                text: "Virtual Assistant!"
                size_hint_y: None
                padding_x: 30
                padding_y: 10
                height: self.texture_size[1]
                text_size: self.width, None
                markup: True  # 支持标记语法区分消息角色

        MDTextField:
            id: user_input
            hint_text: "输入你的问题..."
            size_hint_y: None
            height: root.height * 0.15
            padding_x: 20

        MDRaisedButton:
            id: mdbu
            text: "发送"
            size_hint_y: None
            height: root.height * 0.15
            on_press: app.send_message()

2. 整合OpenAI逻辑并处理UI更新

将OpenAI的对话逻辑嵌入KivyMD的App类中,用线程处理API请求避免UI阻塞,同时实现消息的拼接与显示:

import json
import openai
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.clock import mainthread
import threading

KV = '''
Screen:
    GridLayout:
        rows: 3
        size_hint_y: None
        height: self.minimum_height

        ScrollView:
            size_hint_y: None
            height: root.height * 0.7
            MDLabel:
                id: mdlab
                text: "Virtual Assistant!"
                size_hint_y: None
                padding_x: 30
                padding_y: 10
                height: self.texture_size[1]
                text_size: self.width, None
                markup: True

        MDTextField:
            id: user_input
            hint_text: "输入你的问题..."
            size_hint_y: None
            height: root.height * 0.15
            padding_x: 20

        MDRaisedButton:
            id: mdbu
            text: "发送"
            size_hint_y: None
            height: root.height * 0.15
            on_press: app.send_message()
'''

class virtualAssistantApp(MDApp):
    def build(self):
        self.title = "Virtual Assistant"
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_palette = "Teal"
        self.theme_cls.primary_hue = "400"
        # 初始化对话历史
        self.messages = [
            {"role": "system", "content": "Sei un assistente virtuale chiamata JOI e parli italiano."}
        ]
        # 加载OpenAI密钥
        with open("secrets.json") as f:
            secrets = json.load(f)
            openai.api_key = secrets["api_key"]
        return Builder.load_string(KV)

    def send_message(self):
        user_text = self.root.ids.user_input.text.strip()
        if not user_text:
            return
        # 清空输入框
        self.root.ids.user_input.text = ""
        # 添加用户消息到对话历史和UI
        self.messages.append({"role": "user", "content": user_text})
        self.update_label(f"[b]你:[/b] {user_text}\n")
        # 启动线程处理API请求,避免阻塞UI
        threading.Thread(target=self.get_ai_response, daemon=True).start()

    def get_ai_response(self):
        try:
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=self.messages,
                temperature=1.0
            )
            ai_message = response.choices[0].message
            self.messages.append(ai_message)
            # 在主线程更新UI
            self.update_label(f"[b]JOI:[/b] {ai_message['content']}\n\n")
        except Exception as e:
            self.update_label(f"[b]错误:[/b] {str(e)}\n\n")

    @mainthread
    def update_label(self, new_text):
        # 拼接新消息到现有文本,保留对话历史
        self.root.ids.mdlab.text += new_text

if __name__ == "__main__":
    virtualAssistantApp().run()

关键细节说明

  • UI优化:新增输入框并调整布局比例,开启Label的markup属性,用加粗格式区分用户和助手的消息,提升可读性。
  • 线程处理:用threading.Thread执行OpenAI的API请求,避免同步请求导致UI卡顿;通过@mainthread装饰器确保UI更新操作在主线程执行,符合Kivy的UI规则。
  • 消息管理:每次发送消息后,将用户输入和AI回复追加到Label文本中,完整保留对话历史。

内容的提问来源于stack exchange,提问作者Nestor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:10:23