当前位置: 首页 > news >正文

Python打字练习

代码解析

导入模块和定义单词列表

import tkinter as tk
import randomsample_words = ["apple", "banana", "cherry", "date", "fig", "grape", "kiwi", "lemon", "mango", "orange", "papaya", "quince", "ugli", "vanilla", "yam"
]
  • 导入'tkinter'库用于创建 GUI
  • 导入'random'库用于随机选择单词 
  • 定义'sample_words'列表包含游戏中可能出现的单词

TypingGame 类的初始化

class TypingGame:def __init__(self, root):self.root = rootself.root.title("打字练习")  # 修改窗口标题self.canvas = tk.Canvas(self.root, width=800, height=600, bg="white")self.canvas.pack()self.user_input = tk.StringVar()self.words = []self.labels = []self.word_y_positions = []self.speed = 2  # 掉落速度self.game_over = False  # 游戏状态self.create_widgets()self.new_round()
  • 初始化游戏类,设置窗口标题和画布 
  • 创建'user_input'变量用于存储用户输入
  • 初始化'words'、'labels'和'word_y_positions'列表
  • 设置'speed'变量控制单词下落速度
  • 初始化'game_over'状态
  • 调用'create_widgets'方法创建控件,并开始新一轮游戏

创建控件

    def create_widgets(self):self.entry = tk.Entry(self.root, textvariable=self.user_input, width=50)self.entry.pack(pady=10)self.entry.bind("<KeyRelease>", self.check_input)self.result_label = tk.Label(self.root, text="", wraplength=400)self.result_label.pack(pady=10)self.new_round_button = tk.Button(self.root, text="New Round", command=self.new_round)self.new_round_button.pack(pady=10)# 将输入法锁定为英语self.root.bind('<FocusIn>', self.set_english_input)
  • 创建输入框、结果标签和新一轮按钮,并将它们放置在窗口中
  • 绑定'KeyRelease'事件到'check_input'方法,监听用户输入
  • 绑定'FocusIn'事件到'set_english_input'方法,以确保输入法锁定为英语

设置输入法为英语

    def set_english_input(self, event):self.root.tk.call('tk', 'scaling', 1.0)  # 假定的命令以确保输入法锁定为英语
  • 绑定窗口获取焦点时设置输入法为英语

新一轮游戏

    def new_round(self):num_words = random.randint(1, 5)  # 随机选择1到5个单词self.words = random.sample(sample_words, num_words)  # 选择不重复的单词self.user_input.set("")self.result_label.config(text="")self.word_y_positions = [0 for _ in self.words]self.game_over = Falsefor label in self.labels:self.canvas.delete(label)self.labels = []used_positions = []for word in self.words:while True:x_position = random.randint(50, 750 - len(word) * 15)  # 确保单词不会超出边界y_position = 0if not any(abs(x_position - pos[0]) < len(word) * 15 and abs(y_position - pos[1]) < 30 for pos in used_positions):used_positions.append((x_position, y_position))breaklabel = self.canvas.create_text(x_position, y_position, text=word, font=("Helvetica", 24), fill="black")self.labels.append(label)self.entry.config(state='normal')self.entry.focus()self.drop_words()
  • 随机选择1到5个不重复的单词
  • 清空输入框和结果标签,重置单词位置和游戏状态
  • 删除旧的标签并创建新的标签,确保单词不会重叠
  • 调用'drop_words'方法开始单词下落

单词下落

    def drop_words(self):if not self.game_over:for i, label in enumerate(self.labels):self.word_y_positions[i] += self.speedself.canvas.coords(label, self.canvas.coords(label)[0], self.word_y_positions[i])if self.word_y_positions[i] >= 600:self.result_label.config(text=f"Game Over! The word was: {self.words[i]}")self.game_over = Trueself.entry.config(state='disabled')returnself.root.after(50, self.drop_words)
  • 如果游戏未结束,所有单词按速度下落
  • 如果单词下落超过画布高度,显示游戏结束信息并禁用输入框
  • 使用'root.after'方法定时调用'drop_words'方法实现动画效果

检查用户输入

    def check_input(self, event):if self.game_over:returninput_text = self.user_input.get()for index, word in enumerate(self.words):if word.startswith(input_text):correct_text = ""for i, char in enumerate(input_text):if i < len(word) and char == word[i]:correct_text += charelse:breakremaining_text = word[len(correct_text):]self.canvas.itemconfig(self.labels[index], text=f"{correct_text}{remaining_text}")self.canvas.itemconfig(self.labels[index], fill="green" if correct_text else "black")else:self.canvas.itemconfig(self.labels[index], fill="black")if input_text == word:self.canvas.delete(self.labels[index])self.words.pop(index)self.labels.pop(index)self.word_y_positions.pop(index)self.user_input.set("")  # 清空输入框if not self.words:self.result_label.config(text="Correct! Starting new round...")self.new_round()return
  • 如果游戏结束,直接返回
  • 获取用户输入并遍历所有单词,检查输入是否与单词开头匹配
  • 将匹配部分的单词变为绿色
  • 如果用户输入完整单词,删除该单词并清空输入框
  • 如果所有单词都被正确输入,开始新一轮游戏

主程序

if __name__ == "__main__":root = tk.Tk()game = TypingGame(root)root.mainloop()
  • 创建主窗口并实例化'TypingGame'
  • 进入'tkinter'主循环,开始游戏

全部代码

import tkinter as tk
import random# 一些示例单词供用户练习
sample_words = ["apple", "banana", "cherry", "date", "fig", "grape", "kiwi", "lemon", "mango", "orange", "papaya", "quince", "ugli", "vanilla", "yam"
]class TypingGame:def __init__(self, root):self.root = rootself.root.title("打字练习")  # 修改窗口标题self.canvas = tk.Canvas(self.root, width=800, height=600, bg="white")self.canvas.pack()self.user_input = tk.StringVar()self.words = []self.labels = []self.word_y_positions = []self.speed = 2  # 掉落速度self.game_over = False  # 游戏状态self.create_widgets()self.new_round()def create_widgets(self):self.entry = tk.Entry(self.root, textvariable=self.user_input, width=50)self.entry.pack(pady=10)self.entry.bind("<KeyRelease>", self.check_input)self.result_label = tk.Label(self.root, text="", wraplength=400)self.result_label.pack(pady=10)self.new_round_button = tk.Button(self.root, text="New Round", command=self.new_round)self.new_round_button.pack(pady=10)# 将输入法锁定为英语self.root.bind('<FocusIn>', self.set_english_input)def set_english_input(self, event):self.root.tk.call('tk', 'scaling', 1.0)  # 假定的命令以确保输入法锁定为英语,如果需要可以进一步研究具体命令def new_round(self):num_words = random.randint(1, 5)  # 随机选择1到5个单词self.words = random.sample(sample_words, num_words)  # 选择不重复的单词self.user_input.set("")self.result_label.config(text="")self.word_y_positions = [0 for _ in self.words]self.game_over = Falsefor label in self.labels:self.canvas.delete(label)self.labels = []used_positions = []for word in self.words:while True:x_position = random.randint(50, 750 - len(word) * 15)  # 确保单词不会超出边界y_position = 0if not any(abs(x_position - pos[0]) < len(word) * 15 and abs(y_position - pos[1]) < 30 for pos in used_positions):used_positions.append((x_position, y_position))breaklabel = self.canvas.create_text(x_position, y_position, text=word, font=("Helvetica", 24), fill="black")self.labels.append(label)self.entry.config(state='normal')self.entry.focus()self.drop_words()def drop_words(self):if not self.game_over:for i, label in enumerate(self.labels):self.word_y_positions[i] += self.speedself.canvas.coords(label, self.canvas.coords(label)[0], self.word_y_positions[i])if self.word_y_positions[i] >= 600:self.result_label.config(text=f"Game Over! The word was: {self.words[i]}")self.game_over = Trueself.entry.config(state='disabled')returnself.root.after(50, self.drop_words)def check_input(self, event):if self.game_over:returninput_text = self.user_input.get()for index, word in enumerate(self.words):if word.startswith(input_text):correct_text = ""for i, char in enumerate(input_text):if i < len(word) and char == word[i]:correct_text += charelse:breakremaining_text = word[len(correct_text):]self.canvas.itemconfig(self.labels[index], text=f"{correct_text}{remaining_text}")self.canvas.itemconfig(self.labels[index], fill="green" if correct_text else "black")else:self.canvas.itemconfig(self.labels[index], fill="black")if input_text == word:self.canvas.delete(self.labels[index])self.words.pop(index)self.labels.pop(index)self.word_y_positions.pop(index)self.user_input.set("")  # 清空输入框if not self.words:self.result_label.config(text="Correct! Starting new round...")self.new_round()returnif __name__ == "__main__":root = tk.Tk()game = TypingGame(root)root.mainloop()

相关文章:

Python打字练习

代码解析 导入模块和定义单词列表 import tkinter as tk import randomsample_words ["apple", "banana", "cherry", "date", "fig", "grape", "kiwi", "lemon", "mango", &quo…...

Pytorch添加自定义算子之(10)-mmdeploy编译流程

整体参考 一、mmcv的编译安装 见上一篇 opencv的安装 $env:OpenCV_DIR = "D:\git_clone\opencv\build" # 我这里下载解压之后的地址 $env:path = "$env:OpenCV_DIR\x64\vc15\bin;" + $env:path $env:path = "D:\git_clone\opencv\build\OpenCVConf…...

大数据面试题之Flink(4)

Flink广播流 Flink实时topN 在实习中一般都怎么用Flink Savepoint知道是什么吗 为什么用Flink不用别的微批考虑过吗 解释一下啥叫背压 Flink分布式快照 Flink SQL解析过程 Flink on YARN模式 Flink如何保证数据不丢失 Flink广播流 Apache Flink 中的广播流&…...

C#实战|账号管理系统:通用登录窗体的实现。

哈喽,你好啊,我是雷工! 本节记录登录窗体的实现方法,比较有通用性,所有的项目登录窗体实现基本都是这个实现思路。 一通百通,以下为学习笔记。 01 登录窗体的逻辑 用户在登录窗输入账号和密码,如果输入账号和密码信息正确,点击【登录】按钮,则跳转显示主窗体,同时在固…...

php简单商城小程序系统源码

&#x1f6cd;️【简单商城小程序】&#x1f6cd;️ &#x1f680;一键开启&#xff0c;商城搭建新体验&#x1f680; 你还在为繁琐的商城搭建流程头疼吗&#xff1f;现在&#xff0c;有了简单商城系统小程序&#xff0c;一切变得轻松又快捷&#xff01;无需复杂的编程知识&a…...

NativeMemoryTracking查看java内存信息

默认该功能是禁用的&#xff0c;因为会损失5-10%的性能 开启命令 -XX:NativeMemoryTrackingdetail 打印命令 jcmd 45064 VM.native_memory summary scaleMB > NativeMemoryTracking.log 具体的日志信息 ➜ ~ ➜ ~ jcmd 45064 VM.native_memory summary scaleMB 45064…...

建智慧医院核心:智能导航系统的功能全析与实现效益

在数字化转型的浪潮中&#xff0c;智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂&#xff0c;传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统&#xff0c;作为医疗数字化转型的关键组成部分&#xff0c;正逐…...

数据库基础之:函数依赖

函数依赖在数据库设计中是非常关键的概念&#xff0c;用于描述关系数据库中数据项之间的相关性。下面我将通过几个例子来说明函数依赖的几种类型&#xff1a;完全函数依赖、部分函数依赖和传递函数依赖。 完全函数依赖 考虑一个关系模式 Student&#xff0c;包含属性 Student…...

Newport太阳光模拟器MSOL-UV-X使用说明手侧

Newport太阳光模拟器MSOL-UV-X使用说明手侧...

pandas读取CSV格式文件生成数据发生器iteration

背景 数据集标签为csv文件格式&#xff0c;有三个字段column_hander [‘id’, ‘boneage’, ‘male’]&#xff0c;需要自己定义数据集。文件较大&#xff0c;做一个数据发生器迭代更新数据集。 实现模板 在Pandas中&#xff0c;可以使用pandas.read_csv函数读取CSV文件&…...

SpringBoot 启动流程四

SpringBoot启动流程四 前面这个创建对象是初始化SpringApplication对象 是加载了SpringBoot程序的所有相关配置 我们接下来要将这个run方法 run过程是一个运行 初始化容器 我们看我们的运行结果是得到一个ConfigurableApplicationContext对象 package com.bigdata1421.star…...

实现桌面动态壁纸(二)

目录 前言 一、关于 WorkerW 工作区窗口 二、关于窗口关系 2.1 窗口以及窗口隶属关系 2.2 桌面管理层窗口组分简析 2.3 厘清两个概念的区别 2.4 关于设置父窗口 三、编写代码以供在 Vista 上实现 3.1 方法二&#xff1a;子类化并自绘窗口背景 四、初步分析桌面管理层…...

JavaEE——计算机工作原理

冯诺依曼体系&#xff08;VonNeumannArchitecture&#xff09; 现代计算机&#xff0c;大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算与逻辑判断 存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制存储&#xff09; 输入…...

并发、多线程和HTTP连接之间有什么关系?

一、并发的概念 并发是系统同时处理多个任务或事件的能力。在计算中&#xff0c;这意味着系统能够在同一时间段内处理多个任务&#xff0c;而不是严格按照顺序一个接一个地执行它们。并发提高了系统的效率和资源利用率&#xff0c;从而更好地满足用户的需求。在现代应用程序中&…...

展开说说:Android服务之startService源码解析

通过上一篇文章我们掌握了Android四种的基本使用&#xff0c;本篇从源码层面总结一下startService的执行过程。 本文依然按着是什么&#xff1f;有什么&#xff1f;怎么用&#xff1f;啥原理&#xff1f;的步骤来分析。 1、是什么 上一篇总结了“Service是Android系统中的四…...

Java + MySQL 实现存储完整 Json

Java MySQL 实现存储完整 Json 一、应用场景二、数据库配置三、后端代码配置1、maven 依赖2、实体类3、Service 实现类4、xml 文件 四、测试1、新增接口2、查询接口3、数据表内容 一、应用场景 将前端传过来的 Json 完整存储到 MySQL 中&#xff0c;涉及技术栈为 Java、MyBat…...

解决刚申请下来的AWS EC2,无法用finalshell连接的问题

在AWS的命令页面创建一个root用户 切换到root 模式,输入密码 su root 不知道密码的可以使用一下命令来设置root用户的密码&#xff1a; su passwd root 再切换到root用户 su 修改配置文件 输入 vim /etc/ssh/sshd_config进入文件&#xff0c;键入’i’ &#xff0c;进行…...

如何在PD虚拟机中开启系统的嵌套虚拟化功能?pd虚拟机怎么用 Parallels Desktop 19 for Mac

PD虚拟机是一款可以在Mac电脑中运行Windows系统的应用软件。使用 Parallels Desktop for Mac 体验 macOS 和 Windows 的最优性能&#xff0c;解锁强大性能和无缝交互。 在ParallelsDesktop&#xff08;PD虚拟机&#xff09;中如何开启系统的嵌套虚拟化功能&#xff1f;下面我们…...

vue中实现button按钮的重复点击指令

// 注册一个全局自定义指令 v-debounce Vue.directive(debounce, {// 当被绑定的元素插入到 DOM 中时...inserted: function (el, binding) {let timer;el.addEventListener(click, () > {clearTimeout(timer);timer setTimeout(() > {binding.value(); // 调用传给指令…...

智能与伦理:Kimi与学术道德的和谐共舞

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 Kimi&#xff0c;由月之暗面科技有限公司开发的智能助手&#xff0c;擅长中英文对话&#xff0c;能处理多种文档和网页内容。在论文写作中&#xff0c;Kimi可提供资料查询、信息整理、语…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...