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 21 Python
Python中将字典转换为列表的方法
Sep 21 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
python队列原理及实现方法示例
Nov 27 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
pytorch 多分类问题,计算百分比操作
Jul 09 Python
python selenium xpath定位操作
Sep 01 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
Pandas数据类型之category的用法
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中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
python遍历文件夹下所有excel文件
2018/01/03 Python
python实现人机五子棋
2020/03/25 Python
如何利用Python 进行边缘检测
2020/10/14 Python
金融专业毕业生推荐信
2013/11/26 职场文书
高中美术教学反思
2014/01/19 职场文书
环保志愿者活动方案
2014/08/14 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
2014公司年终工作总结
2014/12/19 职场文书
2015年项目工作总结
2015/04/29 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Android实现图片九宫格
2022/06/28 Java/Android