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

Beeware Toga Canvas在Windows正常运行,Android端无响应求助

Toga Canvas在Android平台点击按钮无绘制反应的解决方法

问题分析

你的代码在Windows平台正常运行,但Android端点击按钮后没有绘制效果,主要有两个潜在原因:

  • 全局变量canvas在Android的应用生命周期环境下可能存在作用域或引用失效的问题
  • Android平台的Canvas组件不会自动触发重绘,需要手动调用刷新方法

解决方案

修改代码,将Canvas改为App类的实例属性,并在绘制完成后手动触发画布刷新:

  1. 移除全局变量,把canvas定义为self.canvas(类实例属性)
  2. 将draw_rect改为类的成员方法,便于访问实例属性
  3. 绘制完成后调用self.canvas.refresh()强制刷新画布

修改后的代码

import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW

class HelloWorld(toga.App):
    def startup(self):
        main_box = toga.Box(style=Pack(direction=COLUMN))

        test_button = toga.Button("draw", on_press=self.draw_rect, style=Pack(padding=5))
        self.canvas = toga.Canvas(style=Pack(flex=1))
        main_box.add(self.canvas)
        main_box.add(test_button)

        self.main_window = toga.MainWindow(title=self.formal_name)
        self.main_window.content = main_box
        self.main_window.show()

    def draw_rect(self, widget):
        with self.canvas.fill(color="red") as rect:
            rect.rect(x=50, y=50, width=25, height=15)
        # 手动触发画布刷新,适配Android平台
        self.canvas.refresh()

def main():
    return HelloWorld()

关键修改说明

  • 使用self.canvas替代全局变量,确保在Android环境下组件引用始终有效
  • draw_rect作为类方法,直接通过self访问画布实例
  • refresh()方法会通知Android平台重新渲染Canvas内容,这是Windows平台自动处理但Android需要手动触发的步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:33:22