本文目录
PyQt5桌面应用系列
- PyQt5桌面应用开发(0/22):总结再出发
- PyQt5桌面应用开发(1):需求分析
- PyQt5桌面应用开发(2):事件循环
- PyQt5桌面应用开发(3):并行设计
- PyQt5桌面应用开发(4):界面设计
- PyQt5桌面应用开发(5):对话框
- PyQt5桌面应用开发(6):文件对话框
- PyQt5桌面应用开发(7):文本编辑+语法高亮与行号
- PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递
- PyQt5桌面应用开发(9):经典布局QMainWindow
- PyQt5桌面应用开发(10):界面布局基本支持
- PyQt5桌面应用开发(11):摸鱼也要讲基本法,两个字,16
- PyQt5桌面应用开发(12):QFile与线程安全
- PyQt5桌面应用开发(13):QGraphicsView框架
- PyQt5桌面应用开发(14):数据库+ModelView+QCharts
- PyQt5桌面应用开发(15):界面动画
- PyQt5桌面应用开发(16):定制化控件-QPainter绘图
- PyQt5桌面应用开发(17):类结构+QWebEngineView
- PyQt5桌面应用开发(18):自定义控件界面设计与实现
- PyQt5桌面应用开发(19):事件过滤器
- PyQt5桌面应用开发(20):界面设计结果自动测试(一)
- PyQt5桌面应用开发(21):界面设计结果自动测试(二)
PyQt5 与艺术
AI时代,计算创作艺术已经不是什么新闻。在前AI时代,为了讨好女朋友,秃子们也还是经常努力一下,比如用Turbo
C编个程序,显示一些闪来闪去一亮一亮的文字,效果不怎么样!别问我为什么知道。当时作为大一生的C语言老师,我指导了很多份这样的手工作品,但是班里成双结对的都是哪些Hello world!勉强能打印出来的帅小伙……
而今秃不秃什么的已经毫无心理波动,初心还是没有改变。那就来一次艺术与PyQt5的碰撞。
先看作品:

这个充满后现代主义、透着一种小清新、又带有亿点点叛逆的作品就是这次的快200多行代码的成果。当数量增加到20000后后,更有一种残酷感觉,一种欲言又止的感觉。Oh man, 那就是我的青春啊……

code
下面就是代码。
import random
import sys
from PyQt5.QtCore import Qt, QThread, pyqtSignal, pyqtSlot, QRectF
from PyQt5.QtGui import QColor, QFont, QPen, QFontDatabase, QPainter, QTransform
from PyQt5.QtGui import QImage, QKeyEvent, QKeySequence, QResizeEvent
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QFileDialog, QMessageBox, QMainWindow
from PyQt5.QtWidgets import QInputDialog, qApp, QProgressBar, QGraphicsTextItem, QLabel
# def transform2str(tt: QTransform):
# return f"""[{tt.m11():5.2f} {tt.m12():5.2f} {tt.m13():5.2f}\n{tt.m21():5.2f} {tt.m22():5.2f} {tt.m23():5.2f}\n{tt.m31():5.2f} {tt.m32():5.2f} {tt.m33():5.2f}]"""
class Worker(QThread):
finished = pyqtSignal()
tick_progress = pyqtSignal(int, tuple)
start_tick = pyqtSignal(int)
def __init__(self, n: int, r: QRectF):
super(Worker, self).__init__()
self.n = n
self.r = r
def run(self) -> None:
self.start_tick.emit(self.n)
for i in range(self.n):
x, y = random.uniform(self.r.x(), self.r.x() + self.r.width()), \
random.uniform(self.r.y(), self.r.y() + self.r.height())
self.tick_progress.emit(i + 1, (
random.randint(8, 28), # fontSize
chr(random.randint(ord('A'), ord('z'))), # character
random.randint(0, 255), # red
random.randint(0, 255), # green
random.randint(0, 255), # blue
random.randint(0, 255), # alpha
random.randint(0, 360), # rotation
x, y
))
self.finished.emit()
class TextArtScene(QGraphicsScene):
progress = pyqtSignal(int)
def __init__(self, parent=None):
super(TextArtScene, self).__init__(parent)
self.fonts = None
self.text_count = None
self.fonts_choice = None
self.setSceneRect(-200, -200, 400, 400)
@pyqtSlot(int)
def start_fill_text

本文通过一个PythonPyQt5项目展示了如何结合QGraphicsView框架创作艺术作品,代码生成了具有后现代风格的文本艺术图像。文章详细介绍了QGraphicsView、QGraphicsScene和QGraphicsItem的使用,以及如何处理多线程问题以避免阻塞用户界面。此外,还讨论了QObject与线程的关系,强调了在不同线程间操作QObject的限制和解决策略。
最低0.47元/天 解锁文章
699

被折叠的 条评论
为什么被折叠?



