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学习笔记_数据排序方法
May 22 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
基于python-opencv3的图像显示和保存操作
Jun 27 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
python实现大学人员管理系统
Oct 25 Python
python实现图片上添加图片
Nov 26 Python
解决Python二维数组赋值问题
Nov 28 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
Python unittest生成测试报告过程解析
Sep 08 Python
基于tensorflow权重文件的解读
May 26 Python
Python装饰器的练习题
Nov 23 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 echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php session劫持和防范的方法
2013/11/12 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python笔记(2)
2012/10/24 Python
python从ftp下载数据保存实例
2013/11/20 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
python生成器generator用法实例分析
2015/06/04 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
Python实现把类当做字典来访问
2019/12/16 Python
python语言是免费还是收费的?
2020/06/15 Python
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
金士达面试非笔试
2012/03/14 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
社区戒毒工作方案
2014/06/04 职场文书
挂靠协议书
2015/01/27 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python
MYSQL 表的全面总结
2021/11/11 MySQL
Redis Lua脚本实现ip限流示例
2022/07/15 Redis