Python打字练习

代码解析

导入模块和定义单词列表

import tkinter as tk
import random

sample_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 = root
        self.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 = False

        for 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 = 0
                if 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))
                    break
            label = 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.speed
                self.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 = True
                    self.entry.config(state='disabled')
                    return
            self.root.after(50, self.drop_words)
  • 如果游戏未结束,所有单词按速度下落
  • 如果单词下落超过画布高度,显示游戏结束信息并禁用输入框
  • 使用'root.after'方法定时调用'drop_words'方法实现动画效果

检查用户输入

    def check_input(self, event):
        if self.game_over:
            return

        input_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 += char
                    else:
                        break
                remaining_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 = root
        self.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 = False

        for 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 = 0
                if 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))
                    break
            label = 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.speed
                self.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 = True
                    self.entry.config(state='disabled')
                    return
            self.root.after(50, self.drop_words)

    def check_input(self, event):
        if self.game_over:
            return

        input_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 += char
                    else:
                        break
                remaining_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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/764086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目范围管理(信息系统项目管理师)

需求管理计划是对项目的需求进行定义、确定、记载、核实管理和控制的行动指南。制定需求管理计划&#xff0c;规划如何分析、记录和管理需求&#xff0c;这样才是较为稳妥的方法在信息系统集成项目中&#xff0c;需求管理贯穿于整个过程&#xff0c;他的最基本的任务就是明确需…

破解电脑卡顿难题,将数据优化,5分钟提升运行速度

当电脑变得缓慢且反应迟钝时&#xff0c;工作效率和娱乐体验都会大打折扣。而电脑卡顿是由于系统资源占用过多、磁盘空间不足等原因引起的。因此&#xff0c;我们经常需要寻找优化措施&#xff0c;提升电脑的运行速度。文章整理了4个优化方法&#xff0c;帮助你破解卡顿难题&am…

Linux下编程之内存检查

前言 我们在进行编程时&#xff0c;有时不免会无意中写出一些容易导致内存问题&#xff08;可能一时表象上正常&#xff09;的代码&#xff0c;导致的后果肯定是不好的&#xff0c;就像一颗颗“哑弹”&#xff0c;令人心慌。网上推荐的辅助工具很多&#xff0c;此篇文章…

机器学习——强化学习中的“策略π”的个人思考

这两天回顾了《西瓜书》中的最后一章——“强化学习”&#xff0c;但是忽然发现之前对于本章中的“策略π”的理解有些偏差&#xff0c;导致我在看值函数公式时有些看不明白。对此&#xff0c;我在网上查了一些资料&#xff0c;但是大部分人都是一笔带过&#xff0c;或者是照本…

Day8: 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

题目232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; class MyQueue { public:MyQueue() {}void push(int x) { // 出栈input.push(x);}int pop() {// 如果出栈为空&#xff0c;把入栈元素全都转移到出栈if (output.empty()) {while (!input.empty()) {int itop i…

基于小波同步压缩变换与集成深度学习的情绪识别

摘要 本研究设计了一种基于小波同步压缩变换(WSST)驱动优化集成深度学习(DL)的自动多类情绪识别(AMER)系统&#xff0c;用于识别样本依赖(subject-dependent)和样本独立(subject-independent)两种模式下的人类情感。使用WSST方法将1-D脑电(EEG)信号转换为2-D时频表征(TFR)&…

2024年6月总结及随笔之打卡网红点

1. 回头看 日更坚持了547天。 读《人工智能时代与人类未来》更新完成读《AI未来进行式》开更并更新完成读《AI新生&#xff1a;破解人机共存密码》开更并持续更新 2023年至2024年6月底累计码字1267912字&#xff0c;累计日均码字2317字。 2024年6月码字90659字&#xff0c;…

hadoop分布式云笔记系统-计算机毕业设计源码15725

摘 要 随着信息技术的飞速发展&#xff0c;人们对于数据的存储、管理和共享需求日益增长。传统的集中式存储系统在处理大规模数据时面临着性能瓶颈和扩展性问题。而 Hadoop 作为一种分布式计算框架&#xff0c;为解决这些问题提供了有效的解决方案。 本研究旨在设计并实现一种…

昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录 Python 库及 MindSpore 相关模块和类的导入 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 Python 库及 MindSpore 相关模块和类的导入 Python 中的 numpy 库被成功导入&#xff0c;并简称为 np。numpy 在科学计算领域应用广泛&#x…

2、SSD基本技术

发展史 上文中说SSD是以闪存为介质的存储设备&#xff0c;这只能算是现代SSD的特点&#xff0c;而不能算是定义。 HDD是磁存储&#xff0c;SSD是电存储&#xff1b;HDD的特点导致寻址到不同扇区其性能存在明显差异&#xff0c;比如寻址下个扇区和上个扇区&#xff1b;而SSD寻…

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOP SpringBoot与AOP 使用AOP实现用户接口访问日志功能 添加AOP场景启动器 <!--添加AOP场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</…

第十四届蓝桥杯省赛C++A组F题【买瓜】题解(AC)

70pts 题目要求我们在给定的瓜中选择一些瓜&#xff0c;可以选择将瓜劈成两半&#xff0c;使得最后的总重量恰好等于 m m m。我们的目标是求出至少需要劈多少个瓜。 首先&#xff0c;我们注意到每个瓜的重量最多为 1 0 9 10^9 109&#xff0c;而求和的重量 m m m 也最多为…

3.2ui功能讲解之graph页面

本节重点介绍 : graph页面target页面flags页面status页面tsdb-status页面 访问地址 $ip:9090 graph页面 autocomplete 可以补全metrics tag信息或者 内置的关键字 &#xff0c;如sum聚合函数table查询 instante查询&#xff0c; 一个点的查询graph查询调整分辨率 resolutio…

中原汉族与北方游牧民族舞蹈文化在这段剧中表现得淋漓尽致,且看!

中原汉族与北方游牧民族舞蹈文化在这段剧中表现得淋漓尽致&#xff0c;且看&#xff01; 《神探狄仁杰》之使团喋血记是一部深入人心的历史侦探剧&#xff0c;不仅以其曲折离奇的案情和狄仁杰的睿智形象吸引观众&#xff0c;更以其对唐代文化的精准再现而备受赞誉。#李秘书讲写…

云计算【第一阶段(23)】Linux系统安全及应用

一、账号安全控制 1.1、账号安全基本措施 1.1.1、系统账号清理 将非登录用户的shell设为/sbin/nologin锁定长期不使用的账号删除无用的账号 1.1.1.1、实验1 用于匹配以/sbin/nologin结尾的字符串&#xff0c;$ 表示行的末尾。 &#xff08;一般是程序用户改为nologin&…

JavaScript——对象的创建

目录 任务描述 相关知识 对象的定义 对象字面量 通过关键字new创建对象 通过工厂方法创建对象 使用构造函数创建对象 使用原型(prototype)创建对象 编程要求 任务描述 本关任务&#xff1a;创建你的第一个 JavaScript 对象。 相关知识 JavaScript 是一种基于对象&a…

Spring Boot配置文件properties/yml/yaml

一、Spring Boot配置文件简介 &#xff08;1&#xff09;名字必须为application,否则无法识别。后缀有三种文件类型&#xff1a; properties/yml/yaml&#xff0c;但是yml和yaml使用方法相同 &#xff08;2&#xff09; Spring Boot 项⽬默认的配置文件为 properties &#xff…

kafka线上问题:rebalance

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米。今天,我们来聊聊一个在大数据处理领域常见但又令人头疼的问题——Kafka消费组内的重平衡(rebalance)。这可是阿里巴巴面试中的经…

惠海 H6912 升压恒流芯片IC 支持2.6-40V升12V24V36V48V60V100V 10A 摄影灯 太阳能灯 UV灯 杀菌灯

1.产品描述 H6912是一款外围电路简洁的宽调光比升压调光LED恒流驱动器&#xff0c;可适用于2.6-40V输入 电压范围的LED恒流照明领域。H6912可以实现高精度的恒流效果&#xff0c;输出电流恒流精度≤士3%&#xff0c;电压工作范围为2.6-40V.可以轻松满足锂电池及中低压的应用需…

第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)

解题思路 这道题目要求我们判断给定的飞机是否都能在它们的油料耗尽之前降落。为了寻找是否存在合法的降落序列&#xff0c;我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方法&#xff0c;尝试所有可能的降落顺序。 首先&#xff0c;我们需要理解题目中的条件。每架…