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

使用PyQt5绘制法国国旗:渐变无法实现纯色区块的技术求助

用PyQt5绘制法国国旗的正确方式

嘿,我懂你的困扰了——你一开始尝试用渐变绘图,但渐变是用来实现颜色平滑过渡的,而法国国旗是三个完全独立的纯色竖条,没有任何颜色渐变,所以用渐变自然达不到你想要的效果。

别担心,直接绘制三个填充纯色的矩形就可以完美解决这个问题,下面是完整的可运行代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import Qt

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("法国国旗")
        # 法国国旗的标准宽高比是3:2(宽:高),这里设置初始窗口大小为600x400来匹配
        self.resize(600, 400)
        self.show()

    def paintEvent(self, event):
        painter = QPainter(self)
        # 获取当前窗口的实际宽高,保证窗口缩放时国旗布局也能自适应
        win_width = self.width()
        win_height = self.height()
        
        # 计算每个竖条的宽度:总宽度平均分成3份
        stripe_width = win_width // 3

        # 绘制左侧蓝色竖条(使用法国国旗官方标准色值)
        painter.setBrush(QColor(0, 85, 164))
        painter.drawRect(0, 0, stripe_width, win_height)

        # 绘制中间白色竖条
        painter.setBrush(QColor(255, 255, 255))
        painter.drawRect(stripe_width, 0, stripe_width, win_height)

        # 绘制右侧红色竖条(同样用官方标准色值)
        painter.setBrush(QColor(239, 65, 53))
        # 最后一个条用总宽度减去前两个的宽度,避免整数除法导致的像素偏差
        painter.drawRect(stripe_width * 2, 0, win_width - stripe_width * 2, win_height)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

几个关键点说明:

  • 为什么不用渐变:渐变的核心是颜色过渡,而国旗需要的是纯色块无任何过渡,所以直接绘制矩形填充纯色才是正确的思路。
  • 自适应布局:代码里会根据窗口的实时宽高计算每个竖条的宽度,哪怕你缩放窗口,三个竖条始终保持三等分的比例。
  • 标准色值:我用的是法国国旗的官方指定色值,比随便选的蓝、白、红更准确。
  • 绘图时机:所有绘图操作都放在paintEvent方法里,这是PyQt中绘图的标准做法,窗口刷新时会自动重新绘制,保证显示正常。

运行这段代码后,你就能得到一个完美的法国国旗,完全符合你的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:05:20