关于python3.x:Python3编程实战Tetris游戏界面设计

6次阅读

共计 2191 个字符,预计需要花费 6 分钟才能阅读完成。

界面设计

本我的项目重视算法实现,为了安装简单且具备强跨平台性,所以抉择 python 内置的 tkinter。这个界面库是有些问题,比方前面发现其与线程锁配合有问题,会莫名死掉。我的项目中的 lockbug 分支,我曾经把问题定位了,进行了一系列的日志输入,有趣味的同学能够去钻研一下具体问题。这个问题能够避开,本我的项目应用的界面个性很少,我的主张够用即可。

设计思路

应用两个 canvas 来显示方块,一个是游戏空间,另一个是下一方块显示。因为界面比较简单,分成三局部,一是游戏空间,二是下一方块显示,三是信息即操作按钮。这三大块间接应用 place 相对定位,第三大块应用 frame 对 Label,Button 等元素进行组合。

界面成果

具体实现

窗口设定

def start():
    root = Tk()
    root.title("Tetris")
    root.geometry('470x630')   # 窗口大小,两头是字母 x 示意乘号
    root.resizable(0, 0)       # 窗口大小固定
    App(root)
    root.mainloop()

两个 canvas

from tkinter import *
from tkinter import ttk
                  # 常数 CANVASOFFSET,目标是留一点边框空隙,在不同的操作系统上体现不统一,用空隙协调
self.gameCanvas = Canvas(root, bg='black', height=600 + CANVASOFFSET * 2, width=300 + CANVASOFFSET * 2)
self.gameCanvas.place(x=12, y=10)          # 相对定位
                        # 父窗口   背景设为彩色
self.nextCanvas = Canvas(root, bg='black', height=120 + CANVASOFFSET * 2, width=120 + CANVASOFFSET * 2)
self.nextCanvas.place(x = 330, y = 10)

信息操作单元

应用 frame 来组合画布对象,应用 anchor 形式来布局,这块不能用 side 形式,留神两种形式的区别。

frame = Frame(root)
frame.place(x = 330, y = 160)

Label(frame, text = "SPEED:").pack(anchor="w") # 应用 anchor 形式布局
self.speedVar = StringVar()                    # 游戏速度显示变量,留神这有圆括号,与前面的下拉框比拟
speed = Label(frame, height=1, width=12, relief=SUNKEN, bd=1, textvariable=self.speedVar)
speed.pack(anchor="w")

复选框与按钮:

Checkbutton(frame, text = "AutoPlay").pack(anchor="w") # 复选框应用形式
self.btnStartVar = StringVar()
self.btnStartVar.set("Start")           # 开始游戏按钮
Button(frame, height=1, width=10, command=self.btnStartClicked, textvariable=self.btnStartVar).pack(anchor="w")
                                        # 绑定点击事件 

下拉框抉择回放参数:

coboxVar = StringVar     # 留神这没有圆括号,与后面的游戏速度参数比拟    
cobox = ttk.Combobox(frame, textvariable=coboxVar, height=5, width=8, state="readonly")
cobox.pack(anchor="w")                                                # 只能抉择,不能批改
cobox["value"] = ("last", "one", "two", "three")
cobox.current(0)                                        # 以后抉择第一项
cobox.bind("<<ComboboxSelected>>", self.comboxClicked)  # 绑定单击事件 

游戏空间绑定键盘响应:

self.gameCanvas.bind(sequence="<Key>", func=self.processKeyboardEvent) # 绑定键盘响应
self.game = Game(self.gameCanvas, self.nextCanvas, self)               # 初始化游戏对象
self.gameCanvas.focus_set()                                            # 设置游戏空间为焦点对象 

我的项目地址

https://gitee.com/zhoutk/ptetris
或
https://github.com/zhoutk/ptetris

运行办法

1. install python3, git
2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)
3. cd ptetris
4. python3 tetris

This project surpport windows, linux, macOs

on linux, you must install tkinter first, use this command:  
sudo apt install python3-tk

相干我的项目

曾经实现了 C ++ 版,我的项目地址:

https://gitee.com/zhoutk/qtetris
正文完
 0