在pythontkinter中,如何在mainloop窗口打开后运行代码?

2024-04-20 07:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个小的动画,文本出现在一个旧的单色终端一样的屏幕上,好像有人在打字。但是,我经常遇到在GUI窗口打开后运行代码的问题。当窗口打开或根本不显示时,文本总是已经存在。任何帮助都非常感激:)

string = "Hello World this is a Test String"

import random
import time
import tkinter as tk
from tkinter import *

vid = tk.Tk()
vid.title('Terminal')

text = Text( vid, width = 100, height = 50,  highlightthickness=1, bg='black', highlightbackground="black", font=('Courier', 14), fg='green')
text.pack()

def main():
for i in string:
    text.insert(END, i)
    time.sleep(0.2)

text.after(10, main)
vid.mainloop()

这就是我目前的想法:/


Tags: text文本import终端string屏幕timemain
2条回答

对事件驱动程序使用sleep通常不是一个好主意(tkinter是事件驱动的,就像大多数GUI库一样)。在这里,动画最好基于after方法:

import random
import tkinter as tk

string = "Hello World this is a Test String"

def animate(n=0):
  text.insert(tk.END, string[n])
  n += 1
  if n == len(string): # reached end of string 
    text.insert(tk.END, '\n') # insert newline
    n = 0 # and reset current char index
  text.after(200, lambda:animate(n)) # call function again in 200ms

vid = tk.Tk()
vid.title('Terminal')

text = tk.Text(vid, width=100, height=50, highlightthickness=1, bg='black',
            highlightbackground="black", font=('Courier', 14), fg='green')
text.pack()

vid.after(10, animate)
vid.mainloop()

注意:我稍微修改了你的动画,创建了一个无限循环,在这个循环中,字符串一个字符一个字符地打印,当到达末尾时插入新行。只是为了好玩。。。你知道吗

你需要在睡觉后使用update_idletasks()。以下内容适合我,如果您有任何其他问题,请告诉我:

string = "Hello World this is a Test String"

import random
import time
import tkinter as tk
from tkinter import *

vid = tk.Tk()
vid.title('Terminal')

text = Text( vid, width = 100, height = 50,  highlightthickness=1, bg='black', highlightbackground="black", font=('Courier', 14), fg='green')
text.pack()

def main():
    for i in string:
        text.insert(END, i)
        time.sleep(0.2)
        vid.update_idletasks()

vid.after(10, main)
vid.mainloop()

相关问题 更多 >