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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39212.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LDA主題分析的原理、步驟和實現

當然可以&#xff01;LDA 主題模型是一種強大的工具&#xff0c;用于從大量文本數據中發現隱藏的主題。讓我們更詳細地介紹它的原理、步驟和實現。 LDA原理 LDA是一種生成模型&#xff0c;它假設&#xff1a; 每個文檔是由若干主題組成的。每個主題是由若干詞匯組成的。 具…

vcpkg國內鏡像源替換

vcpkg國內鏡像源替換 一、從Gitee上下載vcpkg二、全局替換vcpkg/scripts文件下的字符三、回到vcpkg目錄下&#xff0c;執行bootstrap-vcpkg.bat文件&#xff0c;等待執行完畢四、全局替換vcpkg/ports文件下的字符 一、從Gitee上下載vcpkg git clone https://gitee.com/mirrors…

全國30省份各省資本存量數據固定資本形成總額永續盤存法(2000-2023年)

各省資本存量數據通過永續盤存法進行了詳細的計算&#xff0c;這一方法覆蓋了中國30個省份&#xff08;不包括西藏&#xff09;&#xff0c;提供從2000年起直至2023的資本存量數據集。包括原始數據、測算過程、最終的資本存量結果。 以2000年作為基期年份&#xff0c;依據…

電路筆記(PCB):電流容量(IPC-2221和IPC-2152)+阻抗匹配

電流容量 IPC-2221經驗公式 I K T b A c IK\times T^{b}\times A^{c} IKTbAc 這個公式用于估計PCB&#xff08;Printed Circuit Board&#xff0c;印刷電路板&#xff09;導線上的電流&#xff08;I&#xff09;&#xff0c;其中T和A分別表示溫度&#xff08;Temperature&a…

flex布局中子元素內容超出時,子元素本身出現滾動條實現方法

flex布局中子元素寬度平均分配&#xff0c;并且當子元素內容超出時&#xff0c;子元素本身出現滾動條實現方法&#xff1a; 將父元素設置為display: flex&#xff0c;以啟用Flexbox布局。將每個子元素的flex屬性設置為1&#xff0c;以使其寬度平均分配。設置子元素的overflow屬…

toRefs 和 toRef

文章目錄 toRefs 和 toReftoRefstoRef toRefs 和 toRef toRefs toRefs 把一個由reactive對象的值變為一個一個ref的響應式的值 import { ref, reactive, toRefs, toRef } from vue; let person reactive({name: 張三,age: 18, }); // toRefs 把一個由reactive對象的值變為一…

ComfyUI流程圖、文生圖、圖生圖步驟教學!

前言 leetcode , 209. 長度最小的子數組 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的子數組 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條件的子數組&#xff0c;返回 0 …

大廠都在“搶灘”歐洲杯,你該如何蹭上熱度?

2024歐洲杯戰至第三輪小組賽&#xff0c;德國、瑞士、西班牙、意大利已出線角逐1/8決賽。 云略統計&#xff0c;歐洲杯開戰至今&#xff0c;抖音上“歐洲杯”相關話題高達1000個&#xff0c;其中#誰是歐洲杯預言家 話題播放量高達7.57億&#xff0c;C羅、姆巴佩等國際巨星更是頻…

DB-100撕裂開關 JOSEF約瑟 合金接線端子,輕松接線

一、產品概述 型號&#xff1a;DB-100 主要用途&#xff1a;DB-100撕裂開關主要用于監測皮帶輸送機在運行過程中是否發生縱向撕裂&#xff0c;一旦發現撕裂情況&#xff0c;立即觸發報警或停機&#xff0c;以保護設備和生產線的安全運行。 二、技術特點 檢測原理&#xff1a;…

Snipaste截圖工具的下載

Snipaste是一款簡單而強大的桌面截圖工具&#xff0c;它不僅支持快速截圖&#xff0c;還提供了豐富的編輯和貼圖功能&#xff0c;極大地提升了用戶的工作效率。 網址&#xff1a;Snipaste 下載 1.進入文件夾解壓縮 2.解壓縮后打開雙擊運行 3.快捷鍵F1截圖 F3截圖固定桌面 …

springboot的雙親委派

雙親委派模型&#xff08;Parent Delegation Model&#xff09;是 Java 類加載機制中的一種設計模式&#xff0c;用于確保 Java 類加載的一致性和安全性。這個模型規定&#xff0c;當一個類加載器加載一個類時&#xff0c;它首先將加載請求委派給父類加載器處理&#xff0c;只有…

(linux基本操作)秒懂用戶組的管理

一、用戶與用戶組的概念 1、為什么要做用戶與用戶組管理 用戶和用戶組管理&#xff0c;就是添加用戶和用戶組&#xff0c;針對每個用戶設置不同的密碼。 問題&#xff1a;大家平時的筆記本電腦&#xff0c;會設置多個賬戶嗎&#xff1f;為什么&#xff1f; 服務器要添加多賬…

2024年6月總結及隨筆之打卡網紅點

1. 回頭看 日更堅持了547天。 讀《人工智能時代與人類未來》更新完成讀《AI未來進行式》開更并更新完成讀《AI新生&#xff1a;破解人機共存密碼》開更并持續更新 2023年至2024年6月底累計碼字1267912字&#xff0c;累計日均碼字2317字。 2024年6月碼字90659字&#xff0c;…

泰勒展開式在Android系統或應用程序中的應用

泰勒展開式在Android系統或應用程序中的應用 引言 泰勒展開式(Taylor Series)是高等數學中的一個重要工具,它允許我們將一個復雜函數表示為一個無窮多項式的和,從而近似計算函數值。在Android開發中,理解和應用泰勒展開式有助于優化涉及復雜數值計算的算法,提高應用程序…

MySQL 9.0創新版發布!功能又進化了!

作者&#xff1a;IT邦德 中國DBA聯盟(ACDU)成員&#xff0c;10余年DBA工作經驗&#xff0c; Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主&#xff0c;全網粉絲10萬 擅長主流Oracle、MySQL、PG、高斯及Greenplum備份恢復&#xff0c; 安裝遷移&#xff0c;性能優化、故障…

穩居C位的AIGC,真能讓人人都成“設計大神”?

在當今數字化時代&#xff0c;隨著人工智能技術的飛速發展&#xff0c;AIGC&#xff08;AI Generated Content&#xff0c;即人工智能生成內容&#xff09;已經逐漸成為設計領域的新寵。特別是在UI設計領域&#xff0c;AIGC的崛起引人注目&#xff0c;甚至有人宣稱&#xff0c;…

大數據、人工智能、云計算、物聯網、區塊鏈序言【大數據導論】

各位大佬好 &#xff0c;這里是阿川的博客&#xff0c;祝您變得更強 個人主頁&#xff1a;在線OJ的阿川 大佬的支持和鼓勵&#xff0c;將是我成長路上最大的動力 阿川水平有限&#xff0c;如有錯誤&#xff0c;歡迎大佬指正 本篇序言前 必看 【大數據導論】—大數據序言 這是…

使用Python實現深度學習模型:自監督學習與對抗性訓練

在深度學習中,自監督學習和對抗性訓練是兩種強大的技術。自監督學習通過設計預任務來生成偽標簽,減少對標注數據的依賴;對抗性訓練通過生成對抗樣本,提高模型的魯棒性。本文將詳細講解如何使用Python實現自監督學習與對抗性訓練,包括概念介紹、代碼實現和示例應用。 目錄…

vant的dialog觸發了其他overlay

原代碼: <!-- dialog --><van-dialog v-model"showTipsDialog" title"溫馨提示"><p>dialog內容</p></van-dialog><!-- overlay --><van-overlay style"display: flex" :show"showLoadingOverlay&q…

高通Android12啟動流程分析

參考鏈接 https://blog.csdn.net/kill150/article/details/129929641 https://blog.csdn.net/Harrison509/article/details/108659469 https://www.cnblogs.com/pngcui/p/4665106.html 系統啟動流程概覽 高通Android設備的啟動流程通常遵循以下步驟: PBL (Primary Boot Loa…