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简单商城小程序系统源码
🛍️【简单商城小程序】🛍️ 🚀一键开启,商城搭建新体验🚀 你还在为繁琐的商城搭建流程头疼吗?现在,有了简单商城系统小程序,一切变得轻松又快捷!无需复杂的编程知识&a…...
NativeMemoryTracking查看java内存信息
默认该功能是禁用的,因为会损失5-10%的性能 开启命令 -XX:NativeMemoryTrackingdetail 打印命令 jcmd 45064 VM.native_memory summary scaleMB > NativeMemoryTracking.log 具体的日志信息 ➜ ~ ➜ ~ jcmd 45064 VM.native_memory summary scaleMB 45064…...
建智慧医院核心:智能导航系统的功能全析与实现效益
在数字化转型的浪潮中,智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂,传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统,作为医疗数字化转型的关键组成部分,正逐…...
数据库基础之:函数依赖
函数依赖在数据库设计中是非常关键的概念,用于描述关系数据库中数据项之间的相关性。下面我将通过几个例子来说明函数依赖的几种类型:完全函数依赖、部分函数依赖和传递函数依赖。 完全函数依赖 考虑一个关系模式 Student,包含属性 Student…...
Newport太阳光模拟器MSOL-UV-X使用说明手侧
Newport太阳光模拟器MSOL-UV-X使用说明手侧...
pandas读取CSV格式文件生成数据发生器iteration
背景 数据集标签为csv文件格式,有三个字段column_hander [‘id’, ‘boneage’, ‘male’],需要自己定义数据集。文件较大,做一个数据发生器迭代更新数据集。 实现模板 在Pandas中,可以使用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 方法二:子类化并自绘窗口背景 四、初步分析桌面管理层…...
JavaEE——计算机工作原理
冯诺依曼体系(VonNeumannArchitecture) 现代计算机,大多遵守冯诺依曼体系结构 CPU中央处理器:进行算术运算与逻辑判断 存储器:分为外存和内存,用于存储数据(使用二进制存储) 输入…...
并发、多线程和HTTP连接之间有什么关系?
一、并发的概念 并发是系统同时处理多个任务或事件的能力。在计算中,这意味着系统能够在同一时间段内处理多个任务,而不是严格按照顺序一个接一个地执行它们。并发提高了系统的效率和资源利用率,从而更好地满足用户的需求。在现代应用程序中&…...
展开说说:Android服务之startService源码解析
通过上一篇文章我们掌握了Android四种的基本使用,本篇从源码层面总结一下startService的执行过程。 本文依然按着是什么?有什么?怎么用?啥原理?的步骤来分析。 1、是什么 上一篇总结了“Service是Android系统中的四…...
Java + MySQL 实现存储完整 Json
Java MySQL 实现存储完整 Json 一、应用场景二、数据库配置三、后端代码配置1、maven 依赖2、实体类3、Service 实现类4、xml 文件 四、测试1、新增接口2、查询接口3、数据表内容 一、应用场景 将前端传过来的 Json 完整存储到 MySQL 中,涉及技术栈为 Java、MyBat…...
解决刚申请下来的AWS EC2,无法用finalshell连接的问题
在AWS的命令页面创建一个root用户 切换到root 模式,输入密码 su root 不知道密码的可以使用一下命令来设置root用户的密码: su passwd root 再切换到root用户 su 修改配置文件 输入 vim /etc/ssh/sshd_config进入文件,键入’i’ ,进行…...
如何在PD虚拟机中开启系统的嵌套虚拟化功能?pd虚拟机怎么用 Parallels Desktop 19 for Mac
PD虚拟机是一款可以在Mac电脑中运行Windows系统的应用软件。使用 Parallels Desktop for Mac 体验 macOS 和 Windows 的最优性能,解锁强大性能和无缝交互。 在ParallelsDesktop(PD虚拟机)中如何开启系统的嵌套虚拟化功能?下面我们…...
vue中实现button按钮的重复点击指令
// 注册一个全局自定义指令 v-debounce Vue.directive(debounce, {// 当被绑定的元素插入到 DOM 中时...inserted: function (el, binding) {let timer;el.addEventListener(click, () > {clearTimeout(timer);timer setTimeout(() > {binding.value(); // 调用传给指令…...
智能与伦理:Kimi与学术道德的和谐共舞
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 Kimi,由月之暗面科技有限公司开发的智能助手,擅长中英文对话,能处理多种文档和网页内容。在论文写作中,Kimi可提供资料查询、信息整理、语…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...
从0开始学习R语言--Day17--Cox回归
Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...
2025年全国I卷数学压轴题解答
第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos x − cos ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min t max x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…...
LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)
LSTM-XGBoost多变量时序预测(Matlab完整源码和数据) 目录 LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的多变量时序已经用腻了,审稿人也看烦了&#…...
