【内部资料】python实现的打字机效果
作者:野牛程序员:2023-12-20 14:19:22python阅读 2994
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语言中π的引用方式
