使用 Tkinter 入门 2D 游戏(第 2 部分):创建游戏屏幕

发布: (2025年12月24日 GMT+8 10:30)
5 min read
原文: Dev.to

Source: Dev.to

Source:

创建游戏画面

在本文中,我们将使用 Tkinter 的 Canvas 来创建游戏画面。

1. 准备工作文件夹

  1. 创建一个工作文件夹,并在其中添加名为 main.py 的文件。
    有关如何创建文件的详细说明,请参见
    Saving a Program to a File

  2. 在工作文件夹内创建一个 images 目录。所有图像资源都将存放在该目录中。

  3. 下载下图并将其保存为 bg_jigoku.png,放入 images 文件夹中。

    背景图像

    (看起来像是熟悉的地狱场景,对吧?)

你的文件夹结构应如下所示:

working_folder/
 ├─ main.py               # 主程序文件
 └─ images/
     └─ bg_jigoku.png     # 背景图像

从现在起,我们将在 main.py 文件中编写所有代码。

2. 创建 Tkinter 对象

导入 tkinter 库并创建一个带标题的根窗口。
禁用窗口大小调整可以让游戏区域保持固定尺寸。

import tkinter

root = tkinter.Tk()                 # 创建一个 Tkinter 对象
root.title("Hello, Tkinter!!")      # 窗口标题
root.resizable(False, False)       # 禁用窗口大小调整

3. 创建 Canvas

使用变量 W(宽度)和 H(高度)定义画布尺寸。
随后使用这些尺寸创建一个 Canvas 小部件。

import tkinter

# Canvas 宽度和高度
W, H = 480, 320

root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)

canvas = tkinter.Canvas(root, width=W, height=H)
canvas.pack()

如果此时运行程序,将会出现一个 480 × 320 像素 的窗口。

接下来继续添加代码,加载背景图像、处理全屏切换,并构建游戏画面的其余部分。

画布

import tkinter

W, H = 480, 320

root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)

cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()

root.mainloop()

从现在开始,我们将在此画布上绘制背景图像和角色图像。

画布示例

4. 准备初始化函数

我们将准备一个 初始化函数,它在游戏开始时运行一次;以及一个 更新函数,它会持续刷新屏幕。将初始化逻辑与更新逻辑分离可以让整体代码更加简洁。

init() 函数中的 pass 语句表示 “什么也不做”(后面会填入实际代码)。

import tkinter

W, H = 480, 320

def init():
    """初始化函数。"""
    pass

root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)

cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()

init()
update()          # 稍后会定义
root.mainloop()

5. 准备更新函数

使用 F_RATE 定义帧率。
帧率指 每秒屏幕刷新的次数
理想情况下约为 60 fps,但本练习使用 30 fps。

F_INTERVAL 是一帧的时间间隔(毫秒)。
update() 中调用 root.after(F_INTERVAL, update) 来安排下一次更新。

import tkinter

W, H = 480, 320

# 帧率
F_RATE = 30
F_INTERVAL = int(1000 / F_RATE)

def init():
    """初始化函数。"""
    pass

def update():
    """更新函数。"""
    root.after(F_INTERVAL, update)

root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)

cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()

init()
update()
root.mainloop()

6. 放置背景图像

init() 中加载并放置背景图像。
图像文件为 bg_jigoku.png,位于 images 文件夹中。

需要使用 global 关键字,以防 PhotoImage 对象被垃圾回收。

# 背景图像(全局变量)
bg_photo, bg_image = None, None

def init():
    """初始化函数。"""
    global bg_photo, bg_image

    bg_photo = tkinter.PhotoImage(file="images/bg_jigoku.png")
    bg_image = cvs.create_image(W / 2, H / 2, image=bg_photo)

完整代码(截至目前)

import tkinter

W, H = 480, 320

F_RATE = 30
F_INTERVAL = int(1000 / F_RATE)

bg_photo, bg_image = None, None

def init():
    global bg_photo, bg_image
    bg_photo = tkinter.PhotoImage(file="images/bg_jigoku.png")
    bg_image = cvs.create_image(W / 2, H / 2, image=bg_photo)

def update():
    root.after(F_INTERVAL, update)

root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)

cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()

init()
update()
root.mainloop()

结果窗口

接下来…

感谢阅读!
下一篇文章将是 “使用鼠标事件”。 敬请期待!

Back to Blog

相关文章

阅读更多 »