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

Kivy开发问题:无法居中矩形及界面显示异常求助

解决Kivy界面背景和矩形居中问题

我帮你排查了代码里的几个关键错误,这就给你详细说明并附上修复后的完整代码:

你的代码里的主要问题:

  • 全局无效代码:你在类定义外写了self.size = Window.size,这里的self根本没有定义,直接删掉这行就行。
  • Color参数错误:第二个Color的写法Color(1, 0, 0, 0, 0.5)多了一个参数,RGBA颜色只需要4个值(红、绿、蓝、透明度),如果要白色半透明应该写成Color(1, 1, 1, 0.5)。
  • 语法错误:白色矩形的Rectangle定义末尾少了闭合括号,导致代码运行异常。
  • 背景矩形位置错误:你把背景的初始pos设为(self.center_x, self.center_y),这会让背景从窗口中心开始绘制,所以只显示四分之一区域,正确的初始pos应该是self.pos(也就是窗口的左下角(0,0))。
  • 白色矩形居中逻辑错误:self.center是布局的中心坐标,但Rectangle的pos指的是它自身的左下角坐标,直接把pos设为self.center会让矩形的左下角在布局中心,导致矩形偏右上。要让矩形真正居中,需要用(self.center_x - 矩形宽度/2, self.center_y - 矩形高度/2)来计算左下角坐标。
  • 更新函数逻辑不全:update_rect2里只简单设置self.rect2.pos = self.center,没有重新计算居中的偏移量,窗口尺寸变化时矩形会错位。

修复后的完整代码

import kivy
kivy.require("1.9.1")
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import Rectangle, Color
from kivy.core.window import Window

# class in which we are creating the canvas
class DeliverTodayWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(DeliverTodayWidget, self).__init__(**kwargs)
        # 确保布局占满窗口
        self.size = Window.size
        # 蓝色背景
        with self.canvas:
            Color(.234, .456, .678, 1) # 调整透明度为1,让背景完全不透明
            self.rect = Rectangle(pos=self.pos, size=self.size)
            # 白色矩形(带半透明)
            Color(1, 1, 1, 0.5)
            rect_size = (500, 500)
            # 计算居中的左下角坐标
            rect_pos = (self.center_x - rect_size[0]/2, self.center_y - rect_size[1]/2)
            self.rect2 = Rectangle(pos=rect_pos, size=rect_size)
        
        # 绑定更新事件
        self.bind(pos=self.update_rect, size=self.update_rect)
        self.bind(pos=self.update_rect2, size=self.update_rect2)

    # 更新背景矩形
    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size

    # 更新白色矩形,确保始终居中
    def update_rect2(self, *args):
        rect_size = self.rect2.size
        self.rect2.pos = (self.center_x - rect_size[0]/2, self.center_y - rect_size[1]/2)

class DeliverTodayApp(App):
    def build(self):
        # 设置窗口初始尺寸,可选
        Window.size = (800, 600)
        return DeliverTodayWidget()

DeliverTodayApp().run()

关键改动说明:

  1. 把所有Canvas操作放在with self.canvas:块里,这是Kivy推荐的写法,确保绘图指令正确关联到当前控件的画布。
  2. 背景矩形初始pos设为self.pos,确保从窗口左下角开始绘制,占满整个窗口。
  3. 白色矩形的pos通过计算中心偏移量得到,确保无论窗口尺寸怎么变,矩形始终居中。
  4. 修正了Color参数和语法错误,保证代码能正常运行。
  5. 在App的build方法里可以设置窗口初始尺寸,让界面打开时就有合适的大小。

这样修改后,你就能得到一个全屏蓝色背景,中间居中显示白色半透明矩形的界面,调整窗口尺寸时,背景和矩形都会自动适配,不会出现黑色区域或者错位的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:07:56