当前位置:首页python > 正文

【内部资料】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
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击