使用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
相关产品推荐
相关产品推荐

