前面聊了聊如何在GUI窗口里面加载图片,今天就用图片结合其它控件来模拟一个咱们常玩的包袱、剪刀、锤 的小游戏,游戏的动画效果如下: 其实上面的游戏很简单,用到的控件就是两个:标签、下拉菜单;素材就是6张小图片; 主要逻辑就是利用下拉菜单的信号currentTextChanged 连接一个槽函数,所有给标签设置图片的操作都在槽函数内完成;from PySide6.QtCore import Qtfrom PySide6.QtGui import QPixmapfrom PySide6.QtWidgets import QWidget, QApplication, QGridLayout, QLabel, QComboBoximport random # 导入随机模块
class Win(QWidget): def __init__(self): super().__init__() # 设置窗口标题 self.setWindowTitle("剪包锤游戏") # 设置窗口尺寸 self.resize(500, 350) # 设置样式表,可先跳过,后面有空再聊 self.setStyleSheet(""" QWidget { font-size:20px; border-image: url(./bg02.png); } QLabel { font-size:20px; border-image: none; } QComboBox { font-size:20px; border-image: none; } """) # 创建主布局为网格布局 self.main_layout = QGridLayout() # 把网格布局设置给主窗口 self.setLayout(self.main_layout) # 设置各网格间距为20 self.main_layout.setSpacing(20) # 设置布局中各列的宽度占比 self.main_layout.setColumnStretch(0, 1) self.main_layout.setColumnStretch(1, 1) self.main_layout.setColumnStretch(2, 3) # 设置布局中控件顶部对齐 self.main_layout.setAlignment(Qt.AlignmentFlag.AlignTop) # 下面是为主窗口设置背景图片后重新绘制背景 self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) # 创建setup_01 实例方法 # 在实例方法中创建控件 self.setup_01()
def setup_01(self): # 创建一个列表 self.list = ["包袱", "剪刀", "锤"] # 创建一个标签和下拉菜单 self.label_00 = QLabel("人方:") self.combobox_01 = QComboBox() # 给下拉菜单添加列表选项 self.combobox_01.addItems(self.list) # 设置下拉菜单启动显示为空 self.combobox_01.setCurrentIndex(-1) # 为下拉菜单启动时设置占位提示内容 self.combobox_01.setPlaceholderText("请选择手势") # 为下拉列表 当前文本改变 信号连接一个槽函数 self.combobox_01.currentTextChanged.connect(self.show_image) # 创建一个列表显示为电脑方 self.label_02 = QLabel("电脑方:") # 设置列表居中显示 self.label_02.setAlignment(Qt.AlignmentFlag.AlignCenter) # 把上面控件添加到网格布局中 self.main_layout.addWidget(self.label_00, 0, 0) self.main_layout.addWidget(self.combobox_01, 0, 1) # 电脑方在布局中占两列 self.main_layout.addWidget(self.label_02, 0, 2) # 创建人方标签用来放置剪、包、锤图片 self.label_10 = QLabel() # 设置标签内容图片居中显示 self.label_10.setAlignment(Qt.AlignCenter) # 创建电脑方标签用来放置剪、包、锤图片 self.label_11 = QLabel() # 设置标签内容图片居中显示 self.label_11.setAlignment(Qt.AlignCenter) # 把二个标签放到布局中 self.main_layout.addWidget(self.label_10, 1, 0, 1, 2) self.main_layout.addWidget(self.label_11, 1, 2) # 创建一个文字标签用来显示游戏结果 self.label_20 = QLabel() self.main_layout.addWidget(self.label_20, 2, 0, 1, -1)
def show_image(self, text): if text == "包袱": img = QPixmap("./包.png") elif text == "剪刀": img = QPixmap("./剪.png") else: img = QPixmap("./锤.png") # 对图片进行缩放 scaled_img = img.scaled(190, 190) self.label_10.setPixmap(scaled_img) # 使用随机函数,使电脑从列表中取出一个结果 self.result = random.choice(self.list) # 下面是用随机函数拿到的电脑随机手势 if self.result == "包袱": img_2 = QPixmap("./包1.png") elif self.result == "剪刀": img_2 = QPixmap("./剪1.png") else: img_2 = QPixmap("./锤1.png") # 对图片进行缩放 scaled_img_2 = img_2.scaled(190, 190) self.label_11.setPixmap(scaled_img_2) # 下面是输赢判断if语句 # 用if语句判断输赢 if text == "包袱": if self.result == "包袱": result_show = "双方平局!" elif self.result == "剪刀": result_show = "很遗憾,你输了!" else: result_show = "恭喜你,你赢了!" elif text == "剪刀": if self.result == "包袱": result_show = "恭喜你,你赢了!" elif self.result == "剪刀": result_show = "双方平局!" else: result_show = "很遗憾,你输了!" else: if self.result == "包袱": result_show = "很遗憾,你输了!" elif self.result == "剪刀": result_show = "恭喜你,你赢了!" else: result_show = "双方平局!" # 给标签设置判定输赢的结果 self.label_20.setText(result_show) # 设置文本居中显示 self.label_20.setAlignment(Qt.AlignmentFlag.AlignCenter) # 为文字设置样式表,字体尺寸30px; 颜色为红色; self.label_20.setStyleSheet( "font-size: 30px;" "color: red;" )
if __name__ == "__main__": import sys # 创建一个应用程序对象 app = QApplication(sys.argv) # 实例化一个窗口win win = Win() # 显示窗口win win.show() # 运行app程序 sys.exit(app.exec())
上面的槽函数都是用最直接,最容易理解的语法写的,其实专业程序员,完全可以优化一下,让代码更少,但是针对业余爱好者,上面的写法是最容易理解的逻辑;大家有空了可以自己敲一遍,想一想,练习练习。