Python GUI案例之看图猜成语开发(完结篇)
Python GUI案例之看图猜成语(完结篇)
- 看图猜成语小程序开发(完结篇)
- 总结
- 完整代码
Python GUI案例之看图猜成语开发(第一篇)
Python GUI案例之看图猜成语开发(第二篇)
Python GUI案例之看图猜成语开发(第三篇)
看图猜成语小程序开发(完结篇)
素材提取:https://download.csdn.net/download/qq_59142194/85827790
总结
到了这里也就完全地结束了,浅谈一下我的感受吧!
最开始我想开发这个看图猜成语的小程序时,还是从一个Python接单群里面看到的一个单子(需求大概就像是这样开发与这个差不多的功能吧)说起。我想可能是一个大一、二左右学生的一项作业吧,但是当时我也忙着准备期末考试,然后我就这样白白地看着这个单子离我而去,难受!!!(话说回来,进那些接单群差不多也有5个月了还是没有接到过一个单子,当然是我太菜了,我看到的单子中也就10个单子中有2、3个能做的吧,哈哈哈),所以那次的单子对我来说还是比较可惜的。骇,不说这个了!!!
对于这次我写的这个小程序来说,还是花了差不多有两天的时间吧!在写这个功能来说也没什么太大的困难,只要把ttkbootstrap里面用到的组件这些用法了解清楚后,也就是在实现这些功能的逻辑上有一点的困难吧!多想会儿也就能理清逻辑了。
然后就是对我写的代码风格的一些评价吧,我自己觉得是真的存在很大问题的。在写代码的过程中关于类的使用没有理解清楚,变量、方法这些的命名都是我平感觉写的,哈哈哈! 我只是在想怎么怎么实现这些功能以及功能之间的逻辑关系,但是没有注重代码风格的规范,所以有看这篇博文代码的朋友还请手下留情。在后面继续学习敲代码的过程会逐渐地注重开发的严谨性,写代码的规范性以及还要更好地简化代码,减少冗余,形成代码优美之风。哈哈哈!!!
但是话也说回来,我的代码之间的逻辑与功能的实现也是挺可以的,至少我测试了十几次也都没有问题。这点也是不错的吧,不是都说,人和代码只要有一个能跑就行了吗,哈哈哈(手动狗头保命)。
好了,文笔有限,发挥不下去了,就这样了吧!
对了,如果有需要源码及所用到的图片素材在上面那个链接里不能下载的话,也可以私信我拿取!!!
”微风吹动了窗外的梧桐树,阳光从玻璃窗里投过来,好像照着我心上的梦想。而梦想是凌晨拿起笔的坚持,是掀开被子的毫不犹豫和冷水扑面的清醒,是六点看到旭日东升的惊艳和笔记绽放的光。“在未来的时间里让我们一起来用双手敲出梦想吧!
加油!加油!加油!
完整代码
import ttkbootstrap as ttk
import sys,os,random,threading,time,datetime
from ttkbootstrap.constants import *
from ttkbootstrap.dialogs import Messagebox,Queryboxclass ttkbootstrapWindow:# 实例化创建应用程序窗口root = ttk.Window(title="看图猜成语", themename="litera", resizable=(False, False))# 让窗口居中def window_middle(self,windowwidth,windowheight):screenwidth = self.root.winfo_screenwidth()screenheight = self.root.winfo_screenheight()locx = int((screenwidth - windowwidth) / 2)locy = int((screenheight - windowheight) / 2)self.root.geometry("{}x{}+{}+{}".format(windowwidth, windowheight, locx, locy))# 显示窗口def window_displaymodule(self):self.root.mainloop()# 看图猜成语
class guessIdiomsFromPictures(ttkbootstrapWindow):def __init__(self):super().__init__()self.index()self.window_displaymodule()# 首页内容def index(self):self.window_middle(windowwidth=960,windowheight=540) #窗口大小宽x高(960 x 540),默认居中self.index_frame = ttk.Frame(self.root)self.index_frame.pack(fill=BOTH,expand=YES)self.bg_img = ttk.PhotoImage(file='./sucai/index_bg.png')self.bg_img_Label = ttk.Label(self.index_frame, image=self.bg_img)self.bg_img_Label.pack(fill=BOTH,expand=YES)self.title_lable = ttk.Label(self.index_frame,text=' 看图猜成语', font=('华文行楷',56,'italic'),cursor='watch', background='#E7CBB5', bootstyle=WARNING,width=14)self.begin_button_img = ttk.PhotoImage(file='./sucai/beginGame.png')self.entry_nickname = ttk.Entry(self.index_frame, show=None, font=('微软雅黑', 16))self.begin_button = ttk.Button(self.index_frame, bootstyle=(SUCCESS, "outline-toolbutton"),image=self.begin_button_img,command=self.begin_game)self.exit_button_img = ttk.PhotoImage(file='./sucai/exitGame.png')self.exit_button = ttk.Button(self.index_frame, bootstyle=(SUCCESS, "outline-toolbutton"),image=self.exit_button_img,command=self.exit_game)self.index_move()# 页面组件移动def index_move(self):def run(rate):rate += 5button_posy = 540 - rate*1.5self.begin_button.place(x=270,y=button_posy)self.exit_button.place(x=480,y=button_posy+10)if rate < 80:self.title_lable.place(x=190, y=rate)self.title_lable.after(60,run ,rate % 80)elif 80<= rate < 150:self.title_lable.after(60, run, rate % 150)else:ttk.Label(self.bg_img_Label, text='请输入昵称:', cursor='watch', bootstyle=DARK).place(x=250, y=212)self.entry_nickname.insert('0', "暴龙战士之王")self.entry_nickname.place(x=340, y=200, width=360, height=50)run(0)# 验证昵称是否为空def index_verify(self):self.nickname = self.entry_nickname.get().strip()if self.nickname:return Trueelse:return False# 开始游戏def begin_game(self):try:if not self.index_verify():Messagebox.show_info(message="请先输入您的昵称!")returnself.index_frame.destroy()game_modeSelection_page(self.nickname)except:pass# 退出游戏def exit_game(self):sys.exit()#游戏模式选择页面
class game_modeSelection_page(ttkbootstrapWindow):def __init__(self,nickname):super().__init__()self.nickname = nicknameself.page()def page(self):self.window_middle(500,300)self.frame = ttk.Frame(self.root)self.frame.pack(fill=BOTH, expand=YES)self.bg = ttk.PhotoImage(file='./sucai/bg2.png')ttk.Label(self.frame,anchor='nw', image=self.bg).pack()l1 = ttk.Label(self.frame,text='训练模式', font=('华文行楷', 32),relief=RAISED,cursor='hand2',bootstyle=WARNING,background='#324762')l1.place(x=150,y=60)l1.bind("<Button-1>",self.game_train_mode)l2 = ttk.Label(self.frame, text='闯关模式', font=('华文行楷', 32),relief=RAISED,cursor='hand2',bootstyle=SUCCESS,background='#324762')l2.place(x=150, y=140)l2.bind("<Button-1>", self.game_chuangguan_mode)def game_train_mode(self,event):self.frame.destroy()game_train_page(self.nickname)def game_chuangguan_mode(self,event):# 默认10个关卡(initialvalue=10)number = Querybox.get_integer(prompt="请设置关卡数量:",title="自定义关卡数量 ",initialvalue=10,minvalue=0,maxvalue=50)if number:self.frame.destroy()game_chuangguan_page(self.nickname,number)#在游戏两种模式中有相同写法的组件
class game_same_components(ttkbootstrapWindow):def __init__(self):super().__init__()def same_page(self,nickname):self.nickname = nicknameself.window_middle(960, 540)self.canvas = ttk.Canvas(self.root)self.canvas.pack(fill=BOTH, expand=YES)self.bg = ttk.PhotoImage(file='./sucai/bg3.png')self.canvas.create_image(0, 35, anchor='nw', image=self.bg)self.canvas.create_rectangle(0, 0, 960, 35, fill='#F4F4F4', outline='#F4F4F4')nickname_lable = ttk.Label(self.canvas, text=f'欢迎:【{self.nickname}】玩家上线', font=20, bootstyle=INFO,background='#F4F4F4')nickname_lable.place(x=960, y=4)def nickname_lable_move(rate):rate += 5nickname_lable.place(x=960 - rate, y=4)if rate < 960:nickname_lable.after(50, nickname_lable_move, rate % 960)nickname_lable_move(0)self.return_button_img = ttk.PhotoImage(file='./sucai/return.png')self.return_button = ttk.Button(self.canvas, bootstyle=(LIGHT, "outline-toolbutton"), image=self.return_button_img,command=self.return_game_modeSelection_page)self.return_button.place(x=0, y=35)def return_game_modeSelection_page(self):self.canvas.destroy()game_modeSelection_page(self.nickname)#游戏训练模式页面
class game_train_page(game_same_components):def __init__(self,nickname):super().__init__()self.nickname = nicknameself.game_page()loading_img_times = 0 # 记录加载图片次数answer_times = 0 # 记录回答总次数answer_correct_times = 0 # 记录回答正确次数#游戏页面def game_page(self):self.same_page(self.nickname)self.canvas.create_rectangle(200, 100, 535, 435)self.answer_idiom_entry = ttk.Entry(self.canvas, show=None, font=('微软雅黑', 32),bootstyle=DANGER)self.answer_idiom_entry.place(x=580,y=190,height=100,width=300)self.answer_idiom_entry.bind("<Return>", lambda event: self.answer())self.answer_idiom_button_img = ttk.PhotoImage(file='./sucai/ensure.png')answer_idiom_button = ttk.Button(self.canvas, bootstyle=(LIGHT, "outline-toolbutton"),image=self.answer_idiom_button_img,command=self.answer)answer_idiom_button.place(x=635,y=310)see_idiom_button = ttk.Button(self.canvas,text='查看', bootstyle=(PRIMARY, "outline-toolbutton"),command=self.see_answer)see_idiom_button.place(x=480, y=470)self.accuracy_lable1 = ttk.Label(self.canvas,text='正确率:',font=('华文行楷', 20),background='#D3E0E8')self.accuracy_lable1.place(x=600, y=120)self.accuracy_lable2 = ttk.Label(self.canvas, text="0.0%", font=('华文行楷', 20),bootstyle=DANGER,background='#D3E0E8')self.accuracy_lable2.place(x=750, y=120)self.loading_idiom_img()#加载成语图片def loading_idiom_img(self):self.loading_img_times += 1self.idiom = random.choice(os.listdir('./看图猜成语'))self.idiom_result = self.idiom.split('.')[0]print('答案:',self.idiom_result)self.idiom_img = ttk.PhotoImage(file=f'./看图猜成语/{self.idiom}')lm = ttk.Label(self.canvas,image=self.idiom_img)lm.place(x=215,y=115)guanqia_lable = ttk.Label(self.canvas, font=('华文行楷', 32),background='#48A6B0')guanqia_lable.place(x=300,y=450)guanqia_lable.config(text=f'第 {self.loading_img_times} 关')#查看答案def see_answer(self):Messagebox.show_info(message=self.idiom_result)def answer(self):if self.answer_idiom_entry.get().strip():self.answer_times += 1if self.answer_idiom_entry.get().strip() == self.idiom_result:Messagebox.show_info(message="恭喜,回答正确!!!")self.loading_idiom_img()self.answer_idiom_entry.delete(0,'end')self.answer_correct_times += 1else:if not Messagebox.yesno(message="回答错误!!!\n是否继续回答?") == 'Yes':self.loading_idiom_img()self.answer_idiom_entry.delete(0, 'end')self.accuracy_lable2.config(text=f'{round(self.answer_correct_times / self.answer_times, 2) * 100}%')#游戏闯关模式页面
class game_chuangguan_page(game_same_components):CLICKTIMES = 0 #点击次数TRUEANSWER = '' #答案IDX = 1 #第几关,默认第1关def __init__(self, nickname,number):super().__init__()self.nickname = nicknameself.idiom_list = random.sample(os.listdir('./看图猜成语'), number) #随机初始化选取20张图片,用于设置20个关卡self.game_page()def game_page(self):self.same_page(self.nickname)self.canvas.create_rectangle(150, 100, 485, 435)self.guanqia_lable = ttk.Label(self.canvas,text='第? / ?关', font=('华文行楷', 32), background='#48A6B0') #显示关卡数self.guanqia_lable.place(x=200, y=40)self.lm = ttk.Label(self.canvas) #用于配置图片self.lm.place(x=165, y=115)self.result_label = ttk.Label(self.canvas,text='', font=('华文行楷', 32), background='#A1F8EE', bootstyle=DANGER) # 用于显示答案的结果self.result_label.place(x=40,y=135,height=300)ttk.Button(self.canvas,text='重选', bootstyle=(SUCCESS, "outline-toolbutton"),command=self.update_label).place(x=550,y=470,width=90,height=60) # 重选按钮self.create_selection_result_label()self.create_option_text_label()self.loading_idiom_img()self.recording_time()# 创建四个用于选择结果的标签def create_selection_result_label(self):self.answer_list = []for i in range(4):label = ttk.Label(self.canvas, text='', font=("微软雅黑", 35), background='', width=2, cursor='hand2')label.place(x=130 + i * 100, y=450)self.answer_list.append(label)# 创建用于选择的内容标签def create_option_text_label(self):def click_label(event):if self.CLICKTIMES < 4:self.CLICKTIMES += 1label_text = event.widget["text"] # 得到标签上的文本self.answer(label_text)self.label_oop_list = []# 设置4行4列的标签for i in range(4):for j in range(4):label = ttk.Label(self.canvas, text='', font=("微软雅黑", 35), background='#FFFAE3', width=2,cursor='hand2')label.place(x=510 + j * 100, y=90 + i * 95)label.bind("<Button-1>", click_label)self.label_oop_list.append(label)# 加载成语图片def loading_idiom_img(self,):self.idiom = self.idiom_list[self.IDX - 1].split('.')[0]print('答案:', self.idiom)disturb_text_list = [self.GBK2312() for i in range(12)] # 随机生成12个干扰汉字disturb_text_list.extend([i for i in self.idiom])for label_oop in self.label_oop_list:text = random.choice(disturb_text_list)disturb_text_list.remove(text)label_oop.configure(text=text)self.guanqia_lable.config(text=f'第 {self.IDX} / {len(self.idiom_list)}关')self.idiom_img = ttk.PhotoImage(file=f'./看图猜成语/{self.idiom}.png')self.lm.configure(image=self.idiom_img)def answer(self,label_text):self.answer_list[self.CLICKTIMES - 1].configure(text=label_text)self.TRUEANSWER += label_textif len(self.TRUEANSWER) == 4:if self.TRUEANSWER == self.idiom:t = threading.Thread(target=self.dispaly_answer_result,args=('回\n答\n正\n确',))t.setDaemon(True)t.start()self.IDX += 1if self.IDX > len(self.idiom_list):Messagebox.show_info(message=f"恭喜您已通过!!!\n耗时为:{self.time_}")self.flag = Falseself.return_game_modeSelection_page()returnself.update_label()self.loading_idiom_img()else:t = threading.Thread(target=self.dispaly_answer_result, args=('回\n答\n错\n误',))t.setDaemon(True)t.start()# 显示回答结果是否正确def dispaly_answer_result(self,text):self.result_label.configure(text=text)time.sleep(3)try: self.result_label.configure(text='')except Exception as e: print(e)# 重选def update_label(self):self.CLICKTIMES = 0self.TRUEANSWER = ''for i in self.answer_list:i.destroy()self.create_selection_result_label()# 随机生成一个汉字def GBK2312(self, ):head = random.randint(0xb0, 0xf7)body = random.randint(0xa1, 0xfe)val = f'{head:x}{body:x}'str = bytes.fromhex(val).decode('gb2312')return str# 记录通关所耗时def recording_time(self):self.flag = True # 定义一个信号量,用于当我们完成游戏通过时,run()结束循环time_label = ttk.Label(self.canvas,text='时长:00:00:00', font=("华文行楷", 15), background='#DAEFE6',bootstyle=DANGER)time_label.place(x=730,y=50)start_time = datetime.datetime.now()def run():if self.flag:time_label.after(1000, run)update_time = datetime.datetime.now() - start_timeself.time_ =f'时长:{update_time}'.split('.')[0]time_label.configure(text=self.time_) # 不显示时长的毫秒值run()if __name__ == '__main__':guessIdiomsFromPictures()
Python GUI案例之看图猜成语开发(完结篇)相关推荐
- Python GUI案例之看图猜成语开发(第三篇)
Python GUI案例之看图猜成语(第三篇) 前言 看图猜成语小程序开发(第三篇) 游戏闯关模式页面 Python GUI案例之看图猜成语开发(第一篇) Python GUI案例之看图猜成语开发(第 ...
- Python GUI案例之看图猜成语开发(第二篇)
Python GUI案例之看图猜成语(第二篇) 前言 看图猜成语小程序开发(第二篇) 游戏选择模式页面 游戏训练模式页面 Python GUI案例之看图猜成语开发(第一篇) Python GUI案例之 ...
- python微信小程序看图猜成语源码flask
wx供重浩:创享日记 对话框发送:python成语 获取完整源码源文件+说明文档+配置教程等 启动Idiom/flask下的venv虚拟环境,运行python manage.py runserver命 ...
- python例程:《看图猜成语》程序
目录 <看图猜成语>程序使用说明 主要代码展示 源码下载路径 <看图猜成语>程序使用说明 启动Idiom/flask下的venv虚拟环境,运行python manage.py ...
- python看图猜成语_看图猜成语200个图答案 看图猜成语图片答案大全
看图猜成语2游戏v1.40苹果版 类型:ios休闲益智大小:100M语言:中文 评分:10.0 标签: 立即下载 看图猜成语200个图答案 看图猜成语图片答案大全.看图猜成语是一款很受欢迎的休闲猜谜类 ...
- 看图猜成语小程序源码+详细搭建教程
本小程序可开通流量主 ,后台可以自行设置关卡.等级.也可以一键部署, 开通流量主之后实现躺赚,你懂得. 个人号也可以开通,审核一次性必过. 类目选择 教育 小程序源码下载地址:(8条消息) 看图猜成语 ...
- (已更新)看图猜成语小程序源码+详细搭建教程
本小程序后台可以自行设置关卡.等级.也可以一键部署, 个人号也可以开通,审核一次性必过. 类目选择 教育 小程序源码下载地址:(已更新)看图猜成语小程序源码+详细搭建教程-小程序文档类资源-CSDN下 ...
- 学计算机可以用算盘吗,看图猜成语黑板学生算盘计算机答案玩法经验分享
看图猜成语黑板学生算盘计算机答案玩法经验分享是小编今天给各位玩家老爷到来的内容,这道题是什么呢,4张不同形式的表达效果,每张图所指的方向都是同一点,还不了解的玩家跟着小编一起看看接下来的分析吧,希望能 ...
- 【游戏系列】用vue做个看图猜成语游戏吧
前几年看图猜成语一类游戏风靡一时,很多人玩这个游戏,我当时也是其中之一,如今当了一个没多少头发的程序员,有时间的时候,也会去研究一下以前的那些小游戏 vue怎么创建项目这里就不介绍了,后面有时间再写一 ...
- Andoird看图猜成语的小游戏
前言 最近没什么事情,在微信上看见看图猜成语的游戏,于是自己也写了一个来玩.源码放在了文章底部. 先来看下效果图 Gif的画质就将就这样吧 我们先来分析一下 我们主要的就是这3个地方 1.就是一个im ...
最新文章
- 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建
- oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
- OAF_OAF增删改-新增的实现(案例)
- matlab频响优化,MATLAB中关于频响图函数最优化的程序问题
- 谷歌云试图抢占SAP软件云市场;企业上云迎来“黄金时代”;IBM和SAP帮助金融机构加快采用云技术……...
- 搞懂 Java HashMap 源码
- hadoop2.6.2分布式环境搭建
- Python入门--局部变量,全局变量,作用域,LEGB规则
- EntityFramework 连接数据库出错
- 百度网盘断点续传下载工具IDM
- 【准备篇】1.Simulink-F28335自动代码生成开发环境搭建
- Android 长按Menu键的监听
- android获取系统签名,Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名...
- Flask项目之手机端租房网站的实战开发(一)
- CANoe 入门 _CAPL编程
- eNSP命令大全(所有命令)
- [spm操作] 什么是mask,如何做mask(未完)
- Python 3网络爬虫开发实战
- 《深入理解Android内核设计思想》已陆续在全国各大书店及网上书店上市,感谢大家一直以来的支持~~
- 神经元谈到深度神经网络