Python GUI案例之看图猜成语开发(第三篇)

2023-10-27

Python GUI案例之看图猜成语(第三篇)

Python GUI案例之看图猜成语开发(第一篇)
Python GUI案例之看图猜成语开发(第二篇)
Python GUI案例之看图猜成语开发(完结篇)


前言

我们将要实现这些功能:

  • 一,游戏首页页面:在首页页面里需要实现绘制一个看图猜成语文字的标题,定义两个按钮功能(开始游戏,退出游戏),还有一个输入游戏昵称的功能并且要对昵称进行验证是否为空,才能开始游戏;
  • 二,游戏选择模式页面:在首页点击开始游戏后,进入游戏的选择模式页面,分为训练模式和闯关模式两种;
  • 三,游戏训练模式页面:将成语图片加载后,只实现猜成语功能(一张图片,一个输入框,一个按钮)和回答的准确率;
  • 四,游戏闯关模式页面:将实现自定义有多少个关卡数,16个汉字提示(12个随机生成的干扰汉字),游戏通关记录所用的时间。

(素材提取:https://download.csdn.net/download/qq_59142194/85827790


看图猜成语小程序开发(第三篇)

终于来到第三篇了!!!


游戏闯关模式页面

在这里我们将实现自定义有多少个关卡数,16个汉字提示(12个随机生成的干扰汉字),游戏通关记录所用的时间,主要要注意下面3个的实现功能。

在这里插入图片描述

自定义关卡数
在自定义关卡数时(默认10关),我们需要在游戏选择模式页面中点击闯关模式后添加ttkbootstrap里面的一个查询框Querybox,然后根据提示输入关卡数后则将进入游戏闯关模式页面。

    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)

① 创建四个用于显示选择结果的标签,在这里还要定义一个self.answer_list 列表来装下生成的标签对象,以便后面在标签上配置文字configure()。

# 创建四个用于选择结果的标签
    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)

重选按钮,点击执行后就会将self.answer_list 列表里面的标签对象全部摧毁后重新创建。

 # 重选
    def update_label(self):
        self.CLICKTIMES = 0
        self.TRUEANSWER = ''
        for i in self.answer_list:i.destroy()
        self.create_selection_result_label()

② 创建用于选择文字内容的16个标签(4 x 4),其中将有12个干扰文字,并且在创建标签时还要为每一个标签对象绑定一个鼠标点击事件click_label(event)。

# 创建用于选择文字内容的标签
    def create_option_text_label(self):
        def click_label(event):
            if self.CLICKTIMES < 4:
                self.CLICKTIMES += 1
                label_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)

这里也比较重要的部分,变量IDX记录第几关,loading_idiom_img()方法里面的for循环则是为前面创建的16个文字标签配置文字(包括
正确的4个文字([i for i in self.idiom])和
12个干扰文字(disturb_text_list ))

    IDX = 1  # 第几关,默认第1关
    # 加载成语图片
    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 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

③ 记录时间,这里的写法与前面的动态移动原理都一样,都是由after()实现,间隔1秒刷新标签(time_label )一次。self.flag = True 为定义一个信号量,用于当我们完成游戏通过时,run()结束循环

# 记录通关所耗时
    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_time
                self.time_ =f'时长:{update_time}'.split('.')[0]
                time_label.configure(text=self.time_) # 不显示时长的毫秒值
        run()

提示回答是否正确,这里用了一点线程的知识,回答正确线程启动提示“回答正确”标签,3秒后将自动消失;回答错误,同理。

在这里插入图片描述

  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)

第三篇也就到这里吧!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python GUI案例之看图猜成语开发(第三篇) 的相关文章

随机推荐

  • HBase拆分策略

    转载自 http blog javachen com 2014 01 16 hbase region split policy html Region 概念 Region是表获取和分布的基本元素 由每个列族的一个Store组成 对象层级图如
  • 图像相关算法整理

    图像相关算法整理 1 HE算法 灰度直方图均衡算法 原理 将原始图像的灰度直方图从比较集中地某个灰度区间变成全部灰度范围内的均匀分布 步骤 1 遍历每一帧图像中的所有像素 记录每个灰度值出现的像素个数 2 统计每个灰度值占总像素的百分比 即
  • C语言占位符 格式占位符

    常用占位符 d i 代表整数 f 浮点数 s 字符串 c char p 指针 fL 长log e 科学计数法 g 小数或科学计数法 C语言中的格式占位符 a A 读入一个浮点值 仅C99有效 c 读入一个字符 d 读入十进制整数 i 读入十
  • Dev-C++使用教程,将你编写第一个C语言代码,实现输出Hello world

    安装好Dev C 软件 方法 步骤 1 打开安装好的Dev C 软件 初始界面如下 2 然后选择左上角文件 依次选择新建 gt 源代码 或者使用快捷键ctrl n 新建一个项目 就可以编写代码了 3 这里以输出Hello world 为例
  • java基础

    java命名规范 驼峰命名 见名知意 1 项目名全部小写 2 包名全部小写 以域名开头 3 类名首字母大写 如果类名由多个单词组成 每个单词的首字母都要大写 如 public class MyFirstClass 4 变量名 方法名首字母小
  • Learning to Navigate in Cities Without a Map 理解

    问题定义 在真实世界中进行无定位辅助 类似于人直觉长距离导航 输入为当前的视觉输入和目标地点 输出就是接下来应该怎么走 才能到达目的地 PS Navigation相比于planning来说更加粗糙 就是不需要具体到某个地点 而是一个大概的方
  • 06黑马数据结构笔记之栈的链式存储(简单)

    06黑马数据结构笔记之栈的链式存储 简单 1 思想 同样以挂钩的方式存储数据 但栈的链式存储与上一篇顺序存储有点区别 顺序存储在数组的尾部满足先进后出 所以每次对栈顶即数组尾部进行插入删除就可以满足 而栈的链式存储在链表的头满足先进后出 所
  • 中国矿业大学徐海学院最不常见的网络工程计算机毕业设计题目推荐50例

    之前有矿业大学徐海学院的童鞋在后台找我们 最近要准备毕业设计了 不会选题 希望可以帮忙给一些毕业设计题目 我整整花了一周把之前做的答辩通过的毕业设计成品进行整理 并精选一些容易实现且不会刷下来的题目列举下 网络工程毕业设计题目推荐1 10题
  • 错误记录:Invalid bound statement (not found)

    场景 在跟随某课程学习 SpringBoot 使用 Mybatis 时出现该错误 查阅各种博客 基本上都说是某个参数配置错误 但仔细检查后 并没有发现任何错误 解决方法 后面偶然间发现某位博主的文件存放路径与视频课程中不同 尝试将 xml
  • mybatis mysql 乐观锁_MyBatis实现乐观锁和悲观锁

    使用mysql做数据库 mybatis做orm的系统中 mybatis的乐观锁和悲观锁实际上就是mysql的乐观锁和悲观锁 实例中使用springboot整合mybatis 一并记录了 添加依赖 mysql mysql connector
  • Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

    前言 大家早好 午好 晚好吖 欢迎光临本文章 今天来分享一下如何使用Python突破某网游游戏JS加密限制 进行逆向解密 实现自动登录 逆向目标 目标 某 7 网游登录 主页 aHR0cHM6Ly93d3cuMzcuY29tLw 接口 aH
  • vscode炫酷写代码插件Power Mode

    老规矩先看下效果 第一 扩展栏搜索 Power Mode 安装 安装完了别忘了重启 第二 文件 gt 首选项 gt 设置 gt 点击在setting json中编辑 powermode enabled true 是否开启 powermode
  • 爱线段树的好孩子[POI2014]KAR-Cards

    There are nn cards arranged on a table in a certain order Two integers are written on each card one per side the obverse
  • 解决cannot remove ''Operation not permitted

    删除某文件出现cannot remove XXX Operation not permitted lsattr 查看隐藏属性 root iZ2zehlrwqqmoadnuv8ts7Z home wwwroo wwwroot default
  • verilog中#是什么意思?#有什么作用?

    在使用verilog语言进行硬件描述时 你是否也经常用到 这个符号 那么你是否关心过这个符号到底是什么意思呢 它的作用是什么呢 1 可用作参数的传递 我们在进行verilog编程时经常会遇到如下一样的代码块 module study tes
  • -bash: zkServer.sh: command not found

    解决办法 zkServer sh start
  • qt 旋转子窗口 基于QGraphicsView 实现

    感谢 Qt 示例里边的 Box 示例 上图 不要被吓哭哦 X轴旋转 XY轴一起旋转 XYZ轴一起旋转 YZ轴一起旋转 Y轴旋转 XZ轴一起旋转 Z轴旋转 GIF的图有点略多 大家谅解谅解 上代码 http pan baidu com s 1
  • 学习注意力机制【1】

    目录 注意力机制介绍 自注意力机制三个步骤 1 计算注意力分数 Attention Scores 2 计算注意力权重 Attention Weights 3 得到加权和 Weighted Sum 自注意力机制Q K V 注意力机制介绍 At
  • 【JavaWeb】视频播放/下载

    如题 最近和同事联调接口时 收到反馈 ios低版本的视频播放不了 经网上查找其他大佬的解决方案修改 解决了该问题 话不多说 直接上代码 public static void downShowVideo HttpServletRequest
  • Python GUI案例之看图猜成语开发(第三篇)

    Python GUI案例之看图猜成语 第三篇 前言 看图猜成语小程序开发 第三篇 游戏闯关模式页面 Python GUI案例之看图猜成语开发 第一篇 Python GUI案例之看图猜成语开发 第二篇 Python GUI案例之看图猜成语开发