lightninng
发表于 2015-5-25 19:12:53
wei_Y 发表于 2015-5-25 17:22
下次加点注释呗。。
好的,代码超过一定行数我会加注释的{:9_217:}
lightninng
发表于 2015-5-25 20:37:23
shinima 发表于 2015-5-25 19:09
楼楼的帖子非常棒
现在网上很多教程是Qt4的, 很多函数名,变量名和Qt5都不太一样, 初学者就会很 ...
谢谢支持,欢迎交流~~{:9_240:}
kwen24
发表于 2015-5-27 19:33:11
留下脚印,谢谢楼主:handshake
lightninng
发表于 2015-5-27 22:05:12
kwen24 发表于 2015-5-27 19:33
留下脚印,谢谢楼主
欢迎多交流~~{:9_231:}
lightninng
发表于 2015-5-28 13:09:57
~风介~ 发表于 2015-5-12 19:26
过个一两百年也许会变!
原来是限时精华{:9_234:}
~风介~
发表于 2015-5-28 15:54:18
lightninng 发表于 2015-5-28 13:09
原来是限时精华
什么情况...{:9_241:}
lightninng
发表于 2015-5-28 19:02:29
本主题由 System 于 2015-5-16 21:00 解除限时精华~~{:9_240:}
小皮猪
发表于 2015-5-28 21:38:32
你好楼主,最近我在写一个pyqt5的程序,前台只有一个滚动条,这需要后台的程序根据磁盘的大小比例调节滚动条的数值,在网上看说应该用多线程,一个线程处理界面,一个线程处理数据。请问该怎么写呢
lightninng
发表于 2015-5-29 00:02:18
小皮猪 发表于 2015-5-28 21:38
你好楼主,最近我在写一个pyqt5的程序,前台只有一个滚动条,这需要后台的程序根据磁盘的大小比例调节滚动 ...
滚动条是指拉动页面滚动的那个条么,我还没学到~~!{:9_240:}
小皮猪
发表于 2015-5-29 20:50:52
lightninng 发表于 2015-5-29 00:02
滚动条是指拉动页面滚动的那个条么,我还没学到~~!
哦,错了,应该是进度条,我研究会了,谢谢
lightninng
发表于 2015-5-29 23:00:24
小皮猪 发表于 2015-5-29 20:50
哦,错了,应该是进度条,我研究会了,谢谢
好的,欢迎交流~~{:9_232:}
lightninng
发表于 2015-6-1 14:42:09
本帖最后由 lightninng 于 2021-11-20 14:47 编辑
11.4.4 方块颜色显然直接用内置的fillRect方法绘制的方块太丑了,随便上网就能找到一大把好的素材,下面说说怎么把方块变的好看一些。分析了教程的代码,可以知道方块的绘制是用draw_squre方法完成的,看看改了之后的draw_squre代码。 def draw_square(self, x, y, square_type):
shape_table = [0x000000, QPixmap(":source\Red.png"),
QPixmap(":source\Green.png"), QPixmap(":source\Blue.png"),
QPixmap(":source\Yellow.png"), QPixmap(":source\Purple.png"),
QPixmap(":source\Water_Green.png"), QPixmap(":source\Orange.png")]
color_table = [(0, 0, 0), (190, 110, 110), (160, 190, 110), (110, 140, 190),
(165, 170, 180), (150, 130, 180), (100, 180, 190), (190, 135, 80)]
# 调用get_square_width方法和get_square_height方法获取方块的长和宽
square_width, square_height = self.get_square_width(), self.get_square_height()
painter = QPainter(self)
# 绘制方块内部
painter.drawPixmap(x + 1, y + 1, square_width - 2, square_height - 2, shape_table)
# 绘制方块边框
color = QColor(*color_table)
painter.setPen(color.lighter())
painter.drawLine(x, y, x + square_width - 1, y)
painter.drawLine(x, y, x, y + square_height - 1)
painter.setPen(color.darker())
painter.drawLine(x + square_width - 1, y + 1, x + square_width - 1, y + square_height - 1)
painter.drawLine(x + 1, y + square_height - 1, x + square_width - 1, y + square_height - 1)其实改动最大的只有一点就是我们把调用fillRect方法改为了调用drawPixmap,fillRect方法绘制一个矩形颜色块,而drawPixmap绘制一个pixmap图形。 shape_table = 首先我们将各种不同形状的俄罗斯方块的图片读取到shape_table中。 painter.drawPixmap(x + 1, y + 1, square_width - 2, square_height - 2, shape_table)然后调用drawPixmap方法以指定的位置和大小将pixmap对象绘制到部件上。11.4.5 初步的成果经过上面的讨论,我们初步写了一些代码,这里面包括自适应背景图的CentralWidget部件的一些代码,以及游戏主面板(GameBoard)和显示下一个块的面板(NextBoard)的基类(Board)的代码:from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFrame, QLabel
# from PyQt5.QtCore import
from PyQt5.QtGui import QPixmap, QImage, QPainter, QPalette, QBrush, QColor
import tetris_file
class Tetris(QMainWindow):
def __init__(self):
super(Tetris, self).__init__()
self.resize(450, 660)
self.setCentralWidget(CentralWidget())# 设置Board为中心部件看看效果
class CentralWidget(QWidget):
def __init__(self):
super(CentralWidget, self).__init__()
# 设置背景图案
self.background = QImage(r":source\ground.png")
self.setAutoFillBackground(True)
def resizeEvent(self, event):
# 重写resizeEvent, 使背景图案可以根据窗口大小改变
QWidget.resizeEvent(self, event)
palette = QPalette()
palette.setBrush(QPalette.Window, QBrush(self.background.scaled(event.size())))
self.setPalette(palette)
class Board(QFrame):
def __init__(self, parent=None):
super(Board, self).__init__(parent)
# 设置面板边框
self.setStyleSheet("border: 1px groove gray; border-radius: 5px; ")
def get_square_width(self):
return 100
def get_square_height(self):
return 100
def paintEvent(self, event):
# 重写panitEvent,绘制一个方块在Board上看看效果
self.draw_square(self.contentsRect().width()/2, self.contentsRect().height()/2, 1)
def draw_square(self, x, y, square_type):
shape_table = [0x000000, QPixmap(":source\Red.png"),
QPixmap(":source\Green.png"), QPixmap(":source\Blue.png"),
QPixmap(":source\Yellow.png"), QPixmap(":source\Purple.png"),
QPixmap(":source\Water_Green.png"), QPixmap(":source\Orange.png")]
color_table = [(0, 0, 0), (190, 110, 110), (160, 190, 110), (110, 140, 190),
(165, 170, 180), (150, 130, 180), (100, 180, 190), (190, 135, 80)]
# 调用get_square_width方法和get_square_height方法获取方块的长和宽
square_width, square_height = self.get_square_width(), self.get_square_height()
painter = QPainter(self)
# 绘制方块内部
painter.drawPixmap(x + 1, y + 1, square_width - 2, square_height - 2, shape_table)
# 绘制方块边框
color = QColor(*color_table)
painter.setPen(color.lighter())
painter.drawLine(x, y, x + square_width - 1, y)
painter.drawLine(x, y, x, y + square_height - 1)
painter.setPen(color.darker())
painter.drawLine(x + square_width - 1, y + 1, x + square_width - 1, y + square_height - 1)
painter.drawLine(x + 1, y + square_height - 1, x + square_width - 1, y + square_height - 1)
class GameBoard(Board):
pass
class NextBoard(Board):
pass
class ScoreBoard(QLabel):
pass
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
tetris = Tetris()
tetris.show()
sys.exit(app.exec_())为了看看我们的Board类中draw_square方法的效果,我们将其设为中心部件,并在它的paintEvent方法中调用draw_square方法绘制一个块,大小为100,100。然后可以再将CentralWidget类设为中心部件看看背景图的效果(请自行实现,改一个词而已)http://xxx.fishc.com/album/201506/01/143144txz59nasu5z2zs5v.jpg
截图:绘制方块和背景
有些鱼油喜欢先看效果,我把我用到的图片资源,打包好的tetris_files.py放到一个压缩文件里,需要的鱼油可以自行下载。
链接: http://pan.baidu.com/s/1mgnBsus 密码: rbab
2021.11.20
准备用PySide2重新实现,原因见1#楼最后面更新的说明
请到129#楼,查看后续章节
康小泡
发表于 2015-6-4 00:51:35
楼主好心细
lightninng
发表于 2015-6-4 10:00:13
kklloo 发表于 2015-6-4 00:51
楼主好心细
谢谢夸奖,欢迎多来python版交流~~{:9_228:}
小甲鱼
发表于 2015-6-4 12:42:23
测试回复上传图片。
黑猫白喵
发表于 2015-6-4 16:13:25
正在找QT5教程啊:handshake
网上都是4的
lightninng
发表于 2015-6-4 23:07:41
小甲鱼 发表于 2015-6-4 12:42
测试回复上传图片。
我在这个贴子里回复也不能上传图片,在别的贴子里回复可以上传图片,下面我这个贴子里上点图片按钮的截图
http://xxx.fishc.com/album/201506/04/230524npjzjkv0wr9ook59.jpg
lightninng
发表于 2015-6-4 23:16:51
黑猫白喵 发表于 2015-6-4 16:13
正在找QT5教程啊
网上都是4的
欢迎学习了之后多过来 交流~~{:9_240:}
小甲鱼
发表于 2015-6-5 05:25:25
lightninng 发表于 2015-6-4 23:07
我在这个贴子里回复也不能上传图片,在别的贴子里回复可以上传图片,下面我这个贴子里上点图片按钮的截图 ...
如果是在其他帖子可以正常上传图片,而该帖不行,可能有两个原因,第一是已达到当天最大的上传限制,第二是系统可能有限制每个帖子最大附件尺寸(后台找不到设置的地方)
lightninng
发表于 2015-6-5 07:32:17
小甲鱼 发表于 2015-6-5 05:25
如果是在其他帖子可以正常上传图片,而该帖不行,可能有两个原因,第一是已达到当天最大的上传限制,第二 ...
恩恩,有可能是第二个原因,现在我都把图片放在论坛的相册里了,谢谢帮助~~{:7_113:}