界面设计

本我的项目重视算法实现,为了安装简单且具备强跨平台性,所以抉择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, git2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)3. cd ptetris4. python3 tetrisThis project surpport windows, linux, macOson linux, you must install tkinter first, use this command:  sudo apt install python3-tk

相干我的项目

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

https://gitee.com/zhoutk/qtetris