【内部资料】python实现的打字机效果
作者:野牛程序员:2023-12-20 14:19:22python阅读 2904
python实现的打字机效果
import tkinter as tk import time class Typewriter: def __init__(self, initial_text): self.text = initial_text def add_text(self, new_text): self.text += new_text def generate_text(self, max_tokens, temperature): generated_text = f"新文本: {self.text}" return generated_text[:max_tokens] class TypewriterGUI: def __init__(self, master): self.master = master self.master.title("Typewriter Effect") # 设置窗口大小和位置在屏幕中央 window_width = 360 window_height = 640 screen_width = master.winfo_screenwidth() screen_height = master.winfo_screenheight() x_position = (screen_width - window_width) // 2 y_position = (screen_height - window_height) // 2 self.master.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 12)) # 指定思源黑体字体 self.text.pack(pady=20) self.typewriter = Typewriter("ChatGPT 是一个强大的语言模型,它能够生成与输入上下文一致的文本。") self.typewriter.add_text("它基于深度学习和自然语言处理技术。") self.generate_button = tk.Button(master, text="生成文本", command=self.generate_text) self.generate_button.pack(pady=10) def generate_text(self): generated_text = self.typewriter.generate_text(max_tokens=500, temperature=0.7) # 增加 max_tokens self.text.delete(1.0, tk.END) # 清空Text组件内容 self.animate_text(generated_text) def animate_text(self, generated_text): self.typewriter.index = 0 # 重置文本生成位置 self.update_text(generated_text) def update_text(self, generated_text): if self.typewriter.index < len(generated_text): self.text.insert(tk.END, generated_text[self.typewriter.index]) self.typewriter.index += 1 self.text.see(tk.END) # 将光标移到文本末尾 self.master.after(100, lambda: self.update_text(generated_text)) # 每隔50毫秒更新一次 # 创建Tkinter窗口 root = tk.Tk() app = TypewriterGUI(root) # 启动主循环 root.mainloop()
在Tkinter中,要调整打字速度,可以修改after
方法中的时间间隔。after
方法用于在一定的时间后执行指定的函数。在这里,它用于定期更新文本,以模拟打字的效果。
在update_text
方法中,可以修改以下行:
self.master.after(50, lambda: self.update_text(generated_text))
其中的50
是时间间隔,单位是毫秒。可以根据需要调整这个值来控制打字的速度。较小的值会使打字速度更快,较大的值会使打字速度更慢。例如,将它改为100
表示每100毫秒更新一次,速度会减缓。
self.master.after(100, lambda: self.update_text(generated_text))
在这个例子中,可以根据实际需要调整时间间隔,找到适合打字速度。
在Tkinter中,Text
组件用于显示文本,光标的显示和控制通常是由Text
组件自动处理的。可以通过设置insert
方法来控制光标的位置。
在代码中,光标的位置由insert
方法来控制。例如,在animate_text
方法中,可以在插入文本后设置光标位置:
def animate_text(self, generated_text): self.typewriter.index = 0 # 重置文本生成位置 self.update_text(generated_text) self.text.mark_set(tk.INSERT, "1.0") # 将光标设置到文本开头
在这个例子中,self.text.mark_set(tk.INSERT, "1.0")
将光标设置到文本的开头。可以根据需要修改mark_set
方法的参数,以设置光标到想要的位置。
如果你希望光标一直保持在文本的末尾,可以在update_text
方法中设置:
def update_text(self, generated_text): if self.typewriter.index < len(generated_text): self.text.insert(tk.END, generated_text[self.typewriter.index]) self.typewriter.index += 1 self.text.see(tk.END) # 将光标移到文本末尾 self.master.after(50, lambda: self.update_text(generated_text))
在这个例子中,self.text.see(tk.END)
将光标移到文本末尾。可以根据需要调整这些代码,以满足显示和光标控制需求。
下面的代码时 深绿色背景金黄色字体
import tkinter as tk import time class Typewriter: def __init__(self, initial_text): self.text = initial_text def add_text(self, new_text): self.text += new_text def generate_text(self, max_tokens, temperature): generated_text = f"新文本: {self.text}" return generated_text[:max_tokens] class TypewriterGUI: def __init__(self, master): self.master = master self.master.title("Typewriter Effect") # 设置窗口大小和位置在屏幕中央 window_width = 360 window_height = 640 screen_width = master.winfo_screenwidth() screen_height = master.winfo_screenheight() x_position = (screen_width - window_width) // 2 y_position = (screen_height - window_height) // 2 self.master.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") # 设置深绿色背景 self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 12), bg="#006400", fg="#FFD700") # 深绿色底,金黄色字 self.text.pack(pady=20) self.typewriter = Typewriter("ChatGPT 是一个强大的语言模型,它能够生成与输入上下文一致的文本。") self.typewriter.add_text("它基于深度学习和自然语言处理技术。") self.generate_button = tk.Button(master, text="生成文本", command=self.generate_text) self.generate_button.pack(pady=10) def generate_text(self): generated_text = self.typewriter.generate_text(max_tokens=500, temperature=0.7) # 增加 max_tokens self.text.delete(1.0, tk.END) # 清空Text组件内容 self.animate_text(generated_text) def animate_text(self, generated_text): self.typewriter.index = 0 # 重置文本生成位置 self.update_text(generated_text) def update_text(self, generated_text): if self.typewriter.index < len(generated_text): self.text.insert(tk.END, generated_text[self.typewriter.index]) self.typewriter.index += 1 self.text.see(tk.END) # 将光标移到文本末尾 self.master.after(120, lambda: self.update_text(generated_text)) # 每隔50毫秒更新一次 # 创建Tkinter窗口 root = tk.Tk() app = TypewriterGUI(root) # 启动主循环 root.mainloop()
最终代码:
import tkinter as tk class Typewriter: def __init__(self, initial_text): self.text = initial_text def add_text(self, new_text): self.text += new_text def generate_text(self, max_tokens, temperature): generated_text = f"{self.text}" return generated_text[:max_tokens] class TypewriterGUI: def __init__(self, master): self.master = master self.master.title("野牛程序员") # 设置窗口大小和位置在屏幕中央 window_width = 360 window_height = 640 screen_width = master.winfo_screenwidth() screen_height = master.winfo_screenheight() x_position = (screen_width - window_width) // 2 y_position = (screen_height - window_height) // 2 self.master.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") # 设置深绿色背景 self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 12), bg="#006400", fg="#FFD700") self.text.pack(pady=20, fill=tk.BOTH, expand=True) self.typewriter = Typewriter(" \\n") self.typewriter = Typewriter(" \\n") code = [ "", "", "c++输入十个数输出最大值", "#include <iostream>", "using namespace std;", "int main() {", " int num;", " int maxNum = INT_MIN;", " for (int i = 0; i < 10; ++i) {", " cout << \\"请输入第\\" << i + 1 << \\"个数: \\";", " cin >> num;", " // 更新最大值", " if (num > maxNum) {", " maxNum = num;", " }", " }", " // 输出最大值", " cout << \\"最大值是: \\" << maxNum << endl;", " return 0;", "}" ] for line in code: self.typewriter.add_text(line+'\\n') # self.typewriter.add_text("岁月匆匆逝光阴,沧桑之间已半生。\\n") # 增加文本以确保写满屏幕 # self.typewriter.add_text("少不更事激情燃,青涩年月如梦幻。\\n") # self.typewriter.add_text("半生经历皱纹起,岁月长河不曾停。\\n") # self.typewriter.add_text("曾经豪情梦不尽,如今岁月愈加深。\\n") # self.typewriter.add_text("人生如梦何处寻,中年往事如流云。\\n") # self.typewriter.add_text("携手迎风起航船,坚定信念向前行。\\n") # self.typewriter.add_text("岁月虽老心永少,梦想引领逐浪涌。\\n") # self.typewriter.add_text("今日之路胜昔艰,中年新篇再启航。\\n") # self.typewriter.add_text("勇敢追梦披风雨,砥砺前行魅力长。\\n") # 直接启动动画 self.animate_text() # 启动主循环 self.master.mainloop() def animate_text(self): generated_text = self.typewriter.generate_text(max_tokens=1500, temperature=0.7) # 增加 max_tokens self.typewriter.index = 0 # 重置文本生成位置 self.update_text(generated_text) def update_text(self, generated_text): char = generated_text[self.typewriter.index] self.text.insert(tk.END, char) # 将视图移动到文本的最底部 self.text.yview_moveto(1.0) self.typewriter.index += 1 if self.typewriter.index < len(generated_text): self.master.after(20, lambda: self.update_text(generated_text)) # 每隔20毫秒更新一次 # 创建Tkinter窗口 root = tk.Tk() app = TypewriterGUI(root)
修改后的代码:
import tkinter as tk class Typewriter: def __init__(self, initial_text): self.text = initial_text def add_text(self, new_text): self.text += new_text def generate_text(self, max_tokens, temperature): generated_text = f"{self.text}" return generated_text[:max_tokens] class TypewriterGUI: def __init__(self, master): self.master = master self.master.title("野牛程序员") # 设置窗口大小和位置在屏幕中央 window_width = 360 window_height = 640 # window_width = 1000 # window_height = 900 screen_width = master.winfo_screenwidth() screen_height = master.winfo_screenheight() x_position = (screen_width - window_width) // 2 y_position = (screen_height - window_height) // 2 self.master.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") # 设置深绿色背景 # self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 12), bg="#006400", fg="#FFD700") self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 13), bg="black", fg="#00FF00") # self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 18), bg="black", fg="#00FF00") self.text.pack(pady=20, fill=tk.BOTH, expand=True) self.typewriter = Typewriter(" \\n") self.typewriter = Typewriter(" \\n") code = [ "c语言中如何用scanf输入数组", "", "#include <stdio.h>", "int main() {", " int size;", " // 获取数组大小", " printf(\\"请输入数组大小: \\");", " scanf(\\"%d\\", &size);", "", " // 声明一个大小为size的数组", " int array[size];", "", " // 输入数组元素", " printf(\\"请输入数组元素:\\\\n\\");", " for (int i = 0; i < size; ++i) {", " scanf(\\"%d\\", &array[i]);", " }", "", " // 输出数组元素", " printf(\\"输入的数组元素为: \\");", " for (int i = 0; i < size; ++i) {", " printf(\\"%d \\", array[i]);", " }", "", " return 0;", "}", ] for line in code: self.typewriter.add_text(line+'\\n') # self.typewriter.add_text("岁月匆匆逝光阴,沧桑之间已半生。\\n") # 增加文本以确保写满屏幕 # 直接启动动画 self.animate_text() # 启动主循环 self.master.mainloop() def animate_text(self): generated_text = self.typewriter.generate_text(max_tokens=1500, temperature=0.7) # 增加 max_tokens self.typewriter.index = 0 # 重置文本生成位置 self.update_text(generated_text) def update_text(self, generated_text): char = generated_text[self.typewriter.index] self.text.insert(tk.END, char) # 将视图移动到文本的最底部 self.text.yview_moveto(1.0) self.typewriter.index += 1 self.text.see(tk.END) # 将光标移到文本末尾 if self.typewriter.index < len(generated_text): self.master.after(100, lambda: self.update_text(generated_text)) # 每隔20毫秒更新一次 # 创建Tkinter窗口 root = tk.Tk() app = TypewriterGUI(root)
下面的代码添加了用空格控制暂停及开始:
import tkinter as tk class Typewriter: def __init__(self, initial_text): self.text = initial_text self.index = 0 # 用于跟踪当前显示的字符位置 def add_text(self, new_text): self.text += new_text def generate_text(self, max_tokens, temperature): generated_text = f"{self.text}" return generated_text[:max_tokens] class TypewriterGUI: def __init__(self, master): self.master = master self.master.title("野牛程序员") # 设置窗口大小 window_width = 360 window_height = 640 # 获取屏幕宽高 screen_width = master.winfo_screenwidth() screen_height = master.winfo_screenheight() # 计算窗口位置 x_position = (screen_width - window_width) // 2 y_position = (screen_height - window_height) // 2 # 设置窗口的几何位置 master.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") # 创建文本框 self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 13), bg="black", fg="#00FF00") self.text.pack(pady=20, fill=tk.BOTH, expand=True) # 创建Typewriter对象 self.typewriter = Typewriter(" \\n") # 初始化显示的代码 code = [ "c语言中如何用scanf输入数组", "", "#include <stdio.h>", "int main() {", " int size;", " // 获取数组大小", " printf(\\"请输入数组大小: \\");", " scanf(\\"%d\\", &size);", "", " // 声明一个大小为size的数组", " int array[size];", "", " // 输入数组元素", " printf(\\"请输入数组元素:\\\\n\\");", " for (int i = 0; i < size; ++i) {", " scanf(\\"%d\\", &array[i]);", " }", "", " // 输出数组元素", " printf(\\"输入的数组元素为: \\");", " for (int i = 0; i < size; ++i) {", " printf(\\"%d \\", array[i]);", " }", "", " return 0;", "}", ] for line in code: self.typewriter.add_text(line + '\\n') self.animation_paused = False # 绑定空格键,控制暂停和继续 master.bind("<space>", self.toggle_animation) # 启动动画 self.animate_text() master.mainloop() def toggle_animation(self, event): # 切换动画暂停状态 self.animation_paused = not self.animation_paused if not self.animation_paused: self.animate_text() def animate_text(self): # 生成文本并更新显示 generated_text = self.typewriter.generate_text(max_tokens=1500, temperature=0.7) self.update_text(generated_text) def update_text(self, generated_text): if self.animation_paused: return char = generated_text[self.typewriter.index] self.text.insert(tk.END, char) self.typewriter.index += 1 self.text.see(tk.END) if self.typewriter.index < len(generated_text): # 递归调用更新文本 self.master.after(100, self.update_text, generated_text) # 创建Tkinter窗口 root = tk.Tk() app = TypewriterGUI(root)
添加默认字体解决空格少了的问题代码:
import tkinter as tk from tkinter import font as tkFont class Typewriter: def __init__(self, initial_text): self.text = initial_text self.index = 0 # 用于跟踪当前显示的字符位置 def add_text(self, new_text): self.text += new_text def generate_text(self, max_tokens, temperature): generated_text = f"{self.text}" return generated_text[:max_tokens] class TypewriterGUI: def __init__(self, master): self.master = master self.master.title("野牛程序员") # 设置窗口大小 window_width = 360 window_height = 640 # window_width = 1000 # window_height = 900 # 获取屏幕宽高 screen_width = master.winfo_screenwidth() screen_height = master.winfo_screenheight() # 计算窗口位置 x_position = (screen_width - window_width) // 2 y_position = (screen_height - window_height) // 2 # 设置窗口的几何位置 master.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") # 创建文本框 default_font = tkFont.nametofont("TkDefaultFont") default_font.configure(size=12) # 设置字体大小 self.text = tk.Text(master, wrap=tk.WORD, font=default_font, bg="black", fg="#00FF00") # self.text = tk.Text(master, wrap=tk.WORD, font=None, bg="black", fg="#00FF00") # self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 13), bg="black", fg="#00FF00") # self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 12), bg="#006400", fg="#FFD700") # self.text = tk.Text(master, wrap=tk.WORD, font=("思源黑体", 18), bg="black", fg="#00FF00") self.text.pack(pady=20, fill=tk.BOTH, expand=True) # 创建Typewriter对象 self.typewriter = Typewriter(" \\n") # 初始化显示的代码 code = [ "C语言任意n位数逆序输出", "", "#include <stdio.h>", "#include <stdlib.h>", "", "// 定义链表节点", "struct Node {", " int data;", " struct Node* next;", "};", "", "// 函数声明", "struct Node* reverseList(struct Node* head);", "void printList(struct Node* head);", "", "int main() {", " // 创建链表", " struct Node* head = NULL;", " struct Node* second = NULL;", " struct Node* third = NULL;", "", " head = (struct Node*)malloc(sizeof(struct Node));", " second = (struct Node*)malloc(sizeof(struct Node));", " third = (struct Node*)malloc(sizeof(struct Node));", "", " head->data = 1;", " head->next = second;", "", " second->data = 2;", " second->next = third;", "", " third->data = 3;", " third->next = NULL;", "", " printf(\\"原始链表: \\");", " printList(head);", "", " // 反转链表", " head = reverseList(head);", "", " printf(\\"逆序后的链表: \\");", " printList(head);", "", " // 释放内存", " free(head);", " free(second);", " free(third);", "", " return 0;", "}", "", "// 反转链表", "struct Node* reverseList(struct Node* head) {", " struct Node* prev = NULL;", " struct Node* current = head;", " struct Node* next = NULL;", "", " while (current != NULL) {", " next = current->next;", " current->next = prev;", " prev = current;", " current = next;", " }", "", " head = prev;", " return head;", "}", "", "// 输出链表", "void printList(struct Node* head) {", " struct Node* temp = head;", " while (temp != NULL) {", " printf(\\"%d \\", temp->data);", " temp = temp->next;", " }", " printf(\\"\\\\n\\");", "}", ] for line in code: self.typewriter.add_text(line + '\\n') # print(line + '\\n') self.animation_paused = False # 绑定空格键,控制暂停和继续 master.bind("<space>", self.toggle_animation) # 启动动画 self.animate_text() master.mainloop() def toggle_animation(self, event): # 切换动画暂停状态 self.animation_paused = not self.animation_paused if not self.animation_paused: self.animate_text() def animate_text(self): # 生成文本并更新显示 generated_text = self.typewriter.generate_text(max_tokens=1500, temperature=0.7) self.update_text(generated_text) def update_text(self, generated_text): if self.animation_paused: return char = generated_text[self.typewriter.index] self.text.insert(tk.END, char) self.typewriter.index += 1 self.text.see(tk.END) if self.typewriter.index < len(generated_text): # 递归调用更新文本 self.master.after(100, self.update_text, generated_text) # 创建Tkinter窗口 root = tk.Tk() app = TypewriterGUI(root)
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:python画函数图像
- 下一篇:c语言中π的引用方式