Python使用tkinter实现摇骰子小游戏功能的代码


Posted in Python onJuly 02, 2020

TKinter

Python 的 GUI 库非常多,之所以选择 Tkinter,一是最为简单,二是自带库,不需下载安装,随时使用,跨平台兼容性非常好,三则是从需求出发的,Python 在实际应用中极少用于开发复杂的桌面应用,毕竟,Python 的各种 GUI 工具包都“一般得很”,不具备优势。

贴吧看到的一个求助题,大致需求是:3个人摇骰子,每人摇3次,点数之和最大的获胜,支持玩家名称输入。我觉得这个题目挺有意思的,做了个界面程序,欢迎大家交流指正~

#!usr/bin/env python
# -*- coding: utf-8 -*-

# author: ***
# date: 2020/06/10

from tkinter import *
import tkinter as tk
import random
import time
from threading import Thread

root = Tk()
root.geometry('620x660')
root.title('摇骰子')
sigpic = PhotoImage(file='signature.png')
shake_cup = PhotoImage(file='touzi/box.png')
crown = PhotoImage(file='touzi/win.png')
readystate = 3
playing = False
used_name = set()
result_dict = dict()
remain = 3
esv_A = StringVar()
esv_B = StringVar()
esv_C = StringVar()

pi_list = list()
for i in range(1, 7):
 pi = PhotoImage(file=r'touzi/t%s.png' % i)
 pi_list.append(pi)


def set_name(cw, ew, nw):
 global readystate
 entryV = ew.get()
 if entryV:
  if entryV in used_name:
   default = nw['text']
   nw.config(text="名称已存在!")
   cw.config(state=tk.DISABLED)
   font_shake(nw, default)
   cw.config(state=tk.ACTIVE)
  else:
   used_name.add(entryV)
   nw.config(text=entryV)
   ew.config(state=tk.DISABLED)
   cw.config(state=tk.DISABLED)
   readystate -= 1
 if readystate == 0:
  for i in "ABC":
   eval('play_btn_%s.config(state=tk.ACTIVE, text="第一次机会")' % i)


def throw_touzi(pw, rw, nw):
 global playing
 global remain
 if pw['text']=="第一次机会":
  playing = True
  pbStack.remove(pw)
  for widget in pbStack:
   widget.config(state=tk.DISABLED)
  pw.config(state=tk.DISABLED, text='第二次机会')
 elif pw['text']=="第二次机会":
  pw.config(state=tk.DISABLED, text='第三次机会')
 else:
  playing = False
  remain -= 1
  pw.config(state=tk.DISABLED, text='play')
 thread = Thread(target=change_img, args=[pw, rw, nw])
 thread.start()


def change_img(pw, rw, nw):
 result_number = random.randint(1, 6)
 ranum_list = list()
 times = 5
 while times:
  ranum = random.randint(1, 6)
  if ranum not in ranum_list:
   ranum_list.append(ranum)
   times = times - 1
 for i in ranum_list:
  time.sleep(0.3)
  throw_label.config(image=pi_list[i-1])
 time.sleep(0.3)
 throw_label.config(image=pi_list[result_number-1])
 time.sleep(0.5)
 if rw['text'] == "结果":
  rw['text'] = str(result_number)
 else:
  rw['text'] = str(rw['text']) + "+%s" % result_number
 time.sleep(0.5)
 rw['text'] = eval(rw['text'])
 if pw['text'] != "play":
  pw.config(state=tk.ACTIVE)
 if playing == False:
  result_dict[nw['text']] = rw['text']
  for widget in pbStack:
   widget.config(state=tk.ACTIVE)
 if not remain:
  result_list = sorted(result_dict.items(), reverse=True, key=lambda rt: rt[1])
  if result_list[0][1] == result_list[1][1]:
   if result_list[1][1] == result_list[2][1]:
    throw_winner['text'] = ">> 平局 <<"
   else:
    winner = result_list[0][0] + ", " + result_list[1][0]
    throw_winner['text'] = "Winner: %s" % winner
  else:
   winner = result_list[0][0]
   throw_winner['text'] = "Winner: %s" % winner
  throw_label['image'] = crown
  reset_btn.config(state=tk.ACTIVE, text='重新开始', relief='raised')


def font_shake(nw, default):
 nw.config(foreground='red')
 for i in range(5):
  if i%2 == 0:
   time.sleep(0.05)
   nw.config(anchor='n')
  else:
   time.sleep(0.05)
   nw.config(anchor='s')
  root.update()
 nw.config(anchor='c')
 root.update()
 time.sleep(0.5)
 nw.config(text=default, foreground='black')


def restart():
 global readystate, used_name, result_dict, remain, pbStack
 throw_label['image'] = shake_cup
 readystate = 3
 used_name = set()
 result_dict = dict()
 remain = 3
 pbStack = {play_btn_A, play_btn_B, play_btn_C}
 reset_btn.config(state=tk.DISABLED, relief='flat', text='')
 for i in "ABC":
  eval('name_%s.config(text="player %s")' % (i, i))
  eval('entry_%s.config(state=tk.NORMAL)' % i)
  eval('esv_%s.set("")' % i)
  eval('confirm_btn_%s.config(state=tk.ACTIVE)' % i)
  eval('result_%s.config(text="结果")' % i)
 throw_winner['text'] = ""


box_frame_A = Frame(root)
box_frame_A.grid(column=1, ipadx=3)
name_A = Label(box_frame_A, text='player A', height=2)
name_A.pack()
signature_A = Label(box_frame_A, image=sigpic)
signature_A.pack()
play_btn_A = Button(box_frame_A, text='play', command=lambda : throw_touzi(play_btn_A, result_A, name_A))
play_btn_A.pack(side=BOTTOM, pady=3)
result_A = Label(box_frame_A, text='结果')
result_A.pack(side=BOTTOM)
entry_A = Entry(box_frame_A, textvariable=esv_A)
entry_A.pack(side=LEFT, padx=5)
confirm_btn_A = Button(box_frame_A, text='确定', command=lambda : set_name(confirm_btn_A, entry_A, name_A))
confirm_btn_A.pack(side=LEFT)

center_frame = Frame(root)
center_frame.grid(row=1, column=1, pady=20)
throw_label = Label(center_frame, image=shake_cup)
throw_label.pack()
throw_winner = Label(center_frame)
throw_winner.pack()
reset_btn = Button(center_frame, state=tk.DISABLED, relief='flat', command=restart)
reset_btn.pack()

box_frame_B = Frame(root)
box_frame_B.grid(row=3, padx=10)
name_B = Label(box_frame_B, text='player B', height=2)
name_B.pack()
signature_B = Label(box_frame_B, image=sigpic)
signature_B.pack()
play_btn_B = Button(box_frame_B, text='play', command=lambda : throw_touzi(play_btn_B, result_B, name_B))
play_btn_B.pack(side=BOTTOM)
result_B = Label(box_frame_B, text='结果')
result_B.pack(side=BOTTOM)
entry_B = Entry(box_frame_B, textvariable=esv_B)
entry_B.pack(side=LEFT, padx=5)
confirm_btn_B = Button(box_frame_B, text='确定', command=lambda : set_name(confirm_btn_B, entry_B, name_B))
confirm_btn_B.pack(side=LEFT)


box_frame_C = Frame(root)
box_frame_C.grid(row=3, column=2, padx=10)
name_C = Label(box_frame_C, text='player C', height=2)
name_C.pack()
signature_C = Label(box_frame_C, image=sigpic)
signature_C.pack()
play_btn_C = Button(box_frame_C, text='play', command=lambda : throw_touzi(play_btn_C, result_C, name_C))
play_btn_C.pack(side=BOTTOM)
result_C = Label(box_frame_C, text='结果')
result_C.pack(side=BOTTOM)
entry_C = Entry(box_frame_C, textvariable=esv_C)
entry_C.pack(side=LEFT, padx=5)
confirm_btn_C = Button(box_frame_C, text='确定', command=lambda : set_name(confirm_btn_C, entry_C, name_C))
confirm_btn_C.pack(side=LEFT)

if __name__ == '__main__':
 pbStack = {play_btn_A, play_btn_B, play_btn_C}
 for i in "ABC":
  eval('play_btn_%s.config(state=tk.DISABLED)' % i)
 root.mainloop()

程序界面截图:

1.初始界面

Python使用tkinter实现摇骰子小游戏功能的代码

2.就绪界面

Python使用tkinter实现摇骰子小游戏功能的代码

3.结果界面

Python使用tkinter实现摇骰子小游戏功能的代码

总结

到此这篇关于Python使用tkinter实现摇骰子小游戏功能的代码的文章就介绍到这了,更多相关Python实现摇骰子小游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python合并两个字典的常用方法与效率比较
Jun 17 Python
Python selenium如何设置等待时间
Sep 15 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
python docx 中文字体设置的操作方法
May 08 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
python3爬虫怎样构建请求header
Dec 23 Python
Python for循环与range函数的使用详解
Mar 23 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
python实现四人制扑克牌游戏
Apr 22 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 #Python
python脚本和网页有何区别
Jul 02 #Python
keras:model.compile损失函数的用法
Jul 01 #Python
win10安装python3.6的常见问题
Jul 01 #Python
Python代码需要缩进吗
Jul 01 #Python
导致python中import错误的原因是什么
Jul 01 #Python
详细分析Python垃圾回收机制
Jul 01 #Python
You might like
PHP 彩色文字实现代码
2009/06/29 PHP
解析php中的escape函数
2013/06/29 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
Python CSV模块使用实例
2015/04/09 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Python学习入门之区块链详解
2017/07/25 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
Python中如何添加自定义模块
2020/06/09 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
远程调用的原理
2014/07/05 面试题
旅游节目策划方案
2014/05/26 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
考试后的感想
2015/08/07 职场文书
element多个表单校验的实现
2021/05/27 Javascript
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python