在 Python Tkinter 中,如何在 mainloop 窗口打开后运行代码? [复制]

Posted

技术标签:

【中文标题】在 Python Tkinter 中,如何在 mainloop 窗口打开后运行代码? [复制]【英文标题】:In Python Tkinter, how do I run code after mainloop window opens? [duplicate] 【发布时间】:2020-04-18 08:52:56 【问题描述】:

我想创建一个小动画,其中文本出现在旧的单色终端(如屏幕)上,就好像有人在打字一样。但是,我在 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()

这是我到目前为止想出的:/

【问题讨论】:

你试过用更大的参数sleep来测试它吗?可能是main 运行所需的时间太短,以至于在主窗口呈现之前它已经准备好结果。尝试 5 秒,看看会发生什么。 @pavel 这不起作用。 sleep 阻止所有渲染发生。 【参考方案1】:

您需要在睡觉后使用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()

【讨论】:

不幸的是,窗口仍然只在文本完全写入后才会出现......问题可能出在我使用的文本编辑器上吗?我在 IDLE 控制台上运行我的代码? 我终于解决了。只需编写 update() 方法即可修复它。非常感谢您的帮助^^【参考方案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()

注意:我稍微更改了您的动画以创建一个无限循环,其中字符串被逐个字符地无休止地打印,到达末尾时插入一个新行。只是为了好玩...

【讨论】:

以上是关于在 Python Tkinter 中,如何在 mainloop 窗口打开后运行代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 tkinter 在 python 中嵌入 python 解释器框架?

python tkinter如何设置组件在窗口中的位置,比如说一个按钮,我希望这个按钮在窗口的左边,上边………

python中tkinter treeview如何获取选中的条目

如何在 Python 中使用 tkinter 选择目录并存储位置

如何在 Codeanywhere.com 上的 Python 中使用 tkinter 模块

python tkinter Label 图形