前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用python qt5写一幅对联

用python qt5写一幅对联

原创
作者头像
mariolu
修改2024-04-12 09:10:20
10500
代码可运行
修改2024-04-12 09:10:20
举报
文章被收录于专栏:Python实用主义Python实用主义
运行总次数:0
代码可运行

用PyQt5库,就是qt在python语言环境的库。通过库提供的qt接口实现写对联这个事情。

一、对联画布

对联画布使用QWidgets。长宽设置为self.resize(550,550) 。

接着使用hBoxLayout = QtWidgets.QHBoxLayout(),添加左联、横批和右联。

代码语言:python
代码运行次数:0
复制
        hBoxLayout = QtWidgets.QHBoxLayout()
        hBoxLayout.addWidget(leftSide)
        hBoxLayout.addWidget(middleSide)
        hBoxLayout.addWidget(rightSide)

二、对联

首先我们会构建一个对联class需要的元素,代码里我命名为MyLabel。

  • 对联分为横联和竖联,左联右联为竖联
  • 左联内容为"桃花坞里桃花庵",右联内容为“桃花庵下桃花仙”,横批为“桃花庵歌”
  • 对联字体为楷体painter.setFont(QFont('楷体', font_size)),字号font_size=30
  • 竖联起始点为coor_orig_x =20coor_orig_y =100
  • 竖联的绘画区域设置为这里QRectF(coor_orig_x,coor_orig_y,font_size,coor_orig_y+font_size*7)。这里7是竖联字数
  • 竖联的字:"桃\n花\n坞\n里\n桃\n花\n庵"和'桃\n花\n庵\n下\n桃\n花\n仙‘ ,这里加入了换行符是为了对联的竖线排列。因为字是竖状排列,这里的painter的painter.drawText(QRectF()),的第一个参数一定是用Rect,如果不是Rect,即使加了换行符也没用
  • 设置对联的底色为红色,竖联通过painter.fillRect(QRectF(coor_orig_x,coor_orig_y,font_size,coor_orig_y+font_size*7), QtGui.QColor(230,0,0)),横联通过painter.fillRect(QRectF(0,0,font_size*4,font_size+10), QtGui.QColor(230,0,0))
  • 对联的字为纯黑色,于是这里painter的笔设置为黑色painter.setPen(QtCore.Qt.black)

完整的程序如下,或者在这里github链接https://github.com/lumanyu/ai_app/blob/main/spring_couplets/couplets.py下载:

代码语言:javascript
复制
import sys

from PyQt5 import QtCore,QtGui,QtWidgets

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import QRectF

class MyLabel(QtWidgets.QWidget):
    def __init__(self, text=None, horizontal=False):
        super(self.__class__, self).__init__()
        self.text = text
        #self.setAttribute(QtCore.Qt.WA_StyledBackground, True)
        #self.setStyleSheet("background-color: {};".format(QtGui.QColor(230, 0, 0).name()))
        self.horizontal=horizontal

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.setPen(QtCore.Qt.black)
        font_size=30
        painter.setFont(QFont('楷体', font_size)) #对联使用的字体和大小
        coor_orig_x = 20
        coor_orig_y = 100
        if self.horizontal:
            painter.translate(0, font_size*4/2) #平移到label的相对坐标(0,60)
        else:
            painter.translate(coor_orig_x, coor_orig_y) #平移到lable的相对坐标(20,100)
        #painter.rotate(-90)
        if self.text:
            #painter.drawText(QRectF(0.0,0.0,50.0,500.0), QtCore.Qt.AlignCenter, 0, 0, self.text)
            if self.horizontal:
                painter.fillRect(QRectF(0,0,font_size*4,font_size+10), QtGui.QColor(230, 0, 0))
                painter.drawText(0, font_size, self.text)
            else:
                painter.fillRect(QRectF(coor_orig_x,coor_orig_y,font_size,coor_orig_y+font_size*7), QtGui.QColor(230, 0, 0))
                painter.drawText(QRectF(coor_orig_x,coor_orig_y,font_size,coor_orig_y+font_size*7),  self.text)
        painter.end()

class Example(QtWidgets.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        leftSide = MyLabel("桃\n花\n坞\n里\n桃\n花\n庵")
        middleSide = MyLabel('桃花庵歌', horizontal=True)
        rightSide = MyLabel('桃\n花\n庵\n下\n桃\n花\n仙')
        hBoxLayout = QtWidgets.QHBoxLayout()
        hBoxLayout.addWidget(leftSide)
        hBoxLayout.addWidget(middleSide)
        hBoxLayout.addWidget(rightSide)
        self.setLayout(hBoxLayout)
        self.setGeometry(300, 300, 250, 150)
        self.resize(550, 550) #对联画布宽高
        self.show()

def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

效果如下:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、对联画布
  • 二、对联
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档