前言
本专栏将参考《Python GUI 设计 tkinter 从入门到实践》书籍(吉林大学出版社 ISBN: 9787569275001)所整理的 Python GUI 设计内容,结合笔者自身在项目实践过程中对于 GUI 开发的理解,主要围绕 tkinter 库进行 GUI 设计的详细介绍。
《Python GUI 设计tkinter从入门到实践(全彩版)》内容简介
《Python GUI设计tkinter从入门到实践》这本书以开发Python窗口程序常用的tkinter模块为主线,全面介绍了使用 tkinter 设计 Python GUI 程序的各方面技术。全书共分为18章,包括搭建开发环境、tkinter与GUI、tkinter窗口设计、tkinter布局管理、文本类组件、按钮类组件、选择列表与滚动条、容器组件、消息组件与对话框、菜单组件、进度条组件、Canvas绘图、鼠标键盘事件处理、数据库操作、文件操作、程序的打包发布、掷骰子游戏、学生成绩管理系统等内容。从用户学习与应用的角度出发,通过将知识点与实例结合的方式让读者学用结合,轻松理解;通过大量示意图和有趣应用,打造零压力学习的阅读氛围;利用两个实战项目将tkinter开发知识应用于实际项目中,以使读者亲身体验项目开发的全过程,力求为读者打造一本结合了“基础入门+应用开发+实战项目”一体化的Python tkinter开发图书。
感兴趣的读者可找来该书详细阅读。
本章内容导图
我们民间掷骰子是一个博弈点数猜大小的游戏,每次下注前,庄家先把三颗骰子放在有盖的器皿内部摇晃,参与者下注猜骰子点数大小,下注结束庄家打开器皿,计算骰子总点数的和,小于等于 10 为小,大于 10 为大,猜中者获胜。
1. 需求分析
掷骰子游戏来自于民间游戏,游戏以猜点数大小为主,该游戏简单易上手。本项目就是在 tkinter 窗口中模拟掷骰子游戏,对局角色有用户和电脑,用户可以自由选择点数为大或者小,而电脑选择的点数取决于之前骰子次数较多的点数。
2. 系统功能结构
本项目主要实现掷骰子游戏,主窗口中包括:单选按钮、随机点数的骰子、用户和玩家选择的点数以及开始按钮。整个游戏的主要功能包括:获取用户选择的点数、帮助电脑选择点数、将用户和电脑的选择结果显示在窗口中、判断用户和电脑的胜负结果。
掷骰子游戏系统功能结构:
3. 设计流程
4. 系统开发环境
- 操作系统:
- Python 版本:
- Python 内置模块:tkinter、tkinter.ttk、tkinter.messagebox、time、random
- 开发工具:
5. 系统预览
6. 窗口布局
窗口中的主要内容包括:单选框、三个骰子、用户、电脑的选择以及开始按钮。单选框用于帮助用户选择点数为大或者为小;三个骰子用于让用户看到投掷骰子的动画过程;下方通过两个 Label 组件显示用户和电脑的选择结果;选择结果的下方为游戏的结果,只有在一局游戏结束后才能显示结果;开始按钮则用于启动游戏。
引入模块并设置变量:
import tkinter
import tkinter.ttk
import tkinter.messagebox
import random
import time
big = 0 # big和little用于帮助电脑选择点数大小
little = 0
count = 0 # 单次游戏中骰子变化的次数
创建窗口,然后在窗口中添加单选按钮、标签组件以及骰子图片扽内容,使用 grid 方法进行布局:
root = tkinter.Tk()
root.title('掷骰子游戏')
root.wm_attributes('-topmost', 1)
root.geometry('320x250')
title = tkinter.Label(root, text="选择骰子点数大小:").grid(column=0, row=0)
cvar = tkinter.IntVar()
cvar.set('1') # 单选按钮的默认值
tkinter.Radiobutton(root, text="大", variable=cvar, value=1, command=option_value).grid(column=0, row=1, columnspan=3)
tkinter.Radiobutton(root, text="小", variable=cvar, value=0, command=option_value).grid(column=3, row=1, columnspan=3)
image1 = tkinter.PhotoImage(file='2t.png')
label = tkinter.Label(root, image=image1) # 第一个骰子图片
label.grid(column=0, row=2, columnspan=2)
image2 = tkinter.PhotoImage(file='4t.png')
labe2 = tkinter.Label(root, image=image2) # 第二个骰子图片
labe2.grid(column=2, row=2, columnspan=2)
image3 = tkinter.PhotoImage(file='6t.png')
labe3 = tkinter.Label(root, image=image3) # 第三个骰子图片
labe3.grid(column=4, row=2, columnspan=2)
labe4 = tkinter.Label(root, text="你选的是:大") # 显示用户选择结果
labe4.grid(column=0, row=3, columnspan=3)
labe5 = tkinter.Label(root, text="电脑选的是:大") # 显示电脑选择结果
labe5.grid(column=3, row=3, columnspan=3)
tkinter.Button(root, text="开始", command=start).grid(column=0, row=6, columnspan=6) # 开始按钮
root.mainloop()
7. 功能实现
用户和电脑选择骰子的点数大小
通过 option_value 和 sys_value 方法分别获取用户和电脑所选择的骰子大小。
# 获取用户的选择结果
def option_value():
global value
global big
global little
global s_sel
global labe4
if cvar.get() == 1: # 获取单选按钮的值
value = "大"
else:
value = "小"
labe4.config(text="你选的是:" + value)
s_sel = sys_value(big, little) # 调用 sys_value 方法,获取电脑选择点数
return value
# 电脑选择的结果
def sys_value(value1, value2): # 电脑选择结果,接收两个参数,分别是 big 和 little,当 big <= little 时,电脑选择大,反正选择小。
if value1 <= value2:
labe5.config(text="电脑选的是:大")
return "大"
else:
labe5.config(text="电脑选的是:小")
return "小"
摇骰子过程实现
call 方法用于实现摇骰子的动画过程,该方法中,一次生成了三个随机数,然后在窗口中显示对应的骰子的点数,将 count 加 1,count 就是单次游戏中摇骰子的次数,判断 count 是否大于或等于 20,如果大于或等于 20,则进行下一步,反之,则 100 毫秒之后再执行该方法。
def call():
global image1 # 第一个骰子图片变量
global image2 # 第二个骰子图片变量
global image3 # 第三个骰子的图片变量
global count # 摇骰子次数
global add # 三个骰子的总点数
global flag # 第三个骰子的图片变量
num = random.choice(range(1, 7)) # 随机生成第一个骰子的点数
img = str(num) + "t.png"
image1 = tkinter.PhotoImage(file=img)
label.config(image=image1) # 切换对应点数的骰子图片
add = num
num = random.choice(range(1, 7)) # 随机生成第二个骰子的点数
img = str(num) + "t.png"
image2 = tkinter.PhotoImage(file=img)
labe2.config(image=image2) # 切换对应点数的骰子图片
add += num # 求和
num = random.choice(range(1, 7)) # 随机生成第三个骰子的点数
img = str(num) + "t.png"
image3 = tkinter.PhotoImage(file=img)
labe3.config(image=image3) # 切换对应点数的骰子图片
add += num
count += 1
if count < 20:
root.after(100, call) # after 方法的作用是,多少毫秒后再次调用函数,时间单位为毫秒
else:
judge() # 判断大小
判断游戏结果
判断游戏结果的逻辑为:依次判断骰子的点数大小、玩家选择的点数大小以及电脑选择的点数大小,如果骰子点数为大,用户和电脑选择的点数也为大,则用户和电脑为平手;若用户选择的点数为大,而系统选择的点数为小,则玩家赢了电脑;同理,若玩家和电脑都选择了小,则玩家和电脑都输了;若玩家选择了小,而电脑选择了大,则玩家输给了电脑,依次类推。文章来源:https://www.toymoban.com/news/detail-669606.html
# 判断胜负
def judge():
global big
global little
global s_sel
global y_sel
global add
if add >= 10:
big += 1 # 总点数大于10,则big+1,反之little+1
if y_sel == "大": # 如果用户选择点数为大
if s_sel == "小":
tkinter.messagebox.showinfo("掷骰子结果","恭喜,你赢了电脑")
else:
tkinter.messagebox.showinfo("掷骰子结果", "^_^你和电脑打平了!")
else:
if s_sel == "大":
tkinter.messagebox.showinfo("掷骰子结果", "哦耶,电脑赢了!")
else:
tkinter.messagebox.showinfo("掷骰子结果", "-_-|||你和电脑都输了!")
else: # 如果用户选择点数为小
little += 1
if y_sel == "大":
if s_sel == "小":
tkinter.messagebox.showinfo("掷骰子结果","哦耶,电脑赢了!")
else:
tkinter.messagebox.showinfo("掷骰子结果","-_-|||你和电脑都输了!")
else:
if s_sel == "大":
tkinter.messagebox.showinfo("掷骰子结果", "恭喜,你赢了电脑!")
else:
tkinter.messagebox.showinfo("掷骰子结果", "^_^你和电脑打平了!")
单击开始按钮进行游戏
为开始按钮绑定 start 方法,然后在该方法中初始化 count 参数,并且调用 call 方法启动投掷骰子动画:文章来源地址https://www.toymoban.com/news/detail-669606.html
# 开始游戏
def start():
global y_sel
global count
count = 0
y_sel = option_value()
call()
源代码汇总
import tkinter
import tkinter.ttk
import tkinter.messagebox
import random
import time
big = 0 # big和little用于帮助电脑选择点数大小
little = 0
count = 0 # 单次游戏中骰子变化的次数
def call():
global image1 # 第一个骰子图片变量
global image2 # 第二个骰子图片变量
global image3 # 第三个骰子的图片变量
global count # 摇骰子次数
global add # 三个骰子的总点数
global flag # 第三个骰子的图片变量
num = random.choice(range(1, 7)) # 随机生成第一个骰子的点数
img = str(num) + "t.png"
image1 = tkinter.PhotoImage(file=img)
label.config(image=image1) # 切换对应点数的骰子图片
add = num
num = random.choice(range(1, 7)) # 随机生成第二个骰子的点数
img = str(num) + "t.png"
image2 = tkinter.PhotoImage(file=img)
labe2.config(image=image2) # 切换对应点数的骰子图片
add += num # 求和
num = random.choice(range(1, 7)) # 随机生成第三个骰子的点数
img = str(num) + "t.png"
image3 = tkinter.PhotoImage(file=img)
labe3.config(image=image3) # 切换对应点数的骰子图片
add += num
count += 1
if count < 20:
root.after(100, call)
else:
judge() # 判断大小
# 获取用户的选择结果
def option_value():
global value
global big
global little
global s_sel
global labe4
if cvar.get() == 1:
value = "大"
else:
value = "小"
labe4.config(text="你选的是:" + value)
s_sel = sys_value(big, little)
return value
# 电脑选择的结果
def sys_value(value1, value2): # 电脑选择结果
if value1 <= value2:
labe5.config(text="电脑选的是:大")
return "大"
else:
labe5.config(text="电脑选的是:小")
return "小"
# 判断胜负
def judge():
global big
global little
global s_sel
global y_sel
global add
if add >= 10:
big += 1 # 总点数大于10,则big+1,反之little+1
if y_sel == "大": # 如果用户选择点数为大
if s_sel == "小":
tkinter.messagebox.showinfo("掷骰子结果","恭喜,你赢了电脑")
else:
tkinter.messagebox.showinfo("掷骰子结果", "^_^你和电脑打平了!")
else:
if s_sel == "大":
tkinter.messagebox.showinfo("掷骰子结果", "哦耶,电脑赢了!")
else:
tkinter.messagebox.showinfo("掷骰子结果", "-_-|||你和电脑都输了!")
else: # 如果用户选择点数为小
little += 1
if y_sel == "大":
if s_sel == "小":
tkinter.messagebox.showinfo("掷骰子结果","哦耶,电脑赢了!")
else:
tkinter.messagebox.showinfo("掷骰子结果","-_-|||你和电脑都输了!")
else:
if s_sel == "大":
tkinter.messagebox.showinfo("掷骰子结果", "恭喜,你赢了电脑!")
else:
tkinter.messagebox.showinfo("掷骰子结果", "^_^你和电脑打平了!")
# 开始游戏
def start():
global y_sel
global count
count = 0
y_sel = option_value()
call()
root = tkinter.Tk()
root.title('掷骰子游戏')
root.wm_attributes('-topmost', 1)
root.geometry('320x250')
title = tkinter.Label(root, text="选择骰子点数大小:").grid(column=0, row=0)
cvar = tkinter.IntVar()
cvar.set('1') #单选按钮的默认值
tkinter.Radiobutton(root, text="大", variable=cvar, value=1, command=option_value).grid(column=0, row=1, columnspan=3)
tkinter.Radiobutton(root, text="小", variable=cvar, value=0, command=option_value).grid(column=3, row=1, columnspan=3)
image1 = tkinter.PhotoImage(file='2t.png')
label = tkinter.Label(root, image=image1) # 第一个骰子图片
label.grid(column=0, row=2, columnspan=2)
image2 = tkinter.PhotoImage(file='4t.png')
labe2 = tkinter.Label(root, image=image2) # 第二个骰子图片
labe2.grid(column=2, row=2, columnspan=2)
image3 = tkinter.PhotoImage(file='6t.png')
labe3 = tkinter.Label(root, image=image3) # 第三个骰子图片
labe3.grid(column=4, row=2, columnspan=2)
labe4 = tkinter.Label(root, text="你选的是:大") # 显示用户选择结果
labe4.grid(column=0, row=3, columnspan=3)
labe5 = tkinter.Label(root, text="电脑选的是:大") # 显示电脑选择结果
labe5.grid(column=3, row=3, columnspan=3)
tkinter.Button(root, text="开始", command=start).grid(column=0, row=6, columnspan=6) # 开始按钮
root.mainloop()
到了这里,关于【tkinter 专栏】掷骰子游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!