是否可以在tkinter中暂停渲染?

2024-10-03 19:22:35 发布

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

我有一个包含大量小部件的GUI,每个小部件都有许多设置。另外,我必须打很多电话才能得到所有的设置。因此,设置GUI需要几秒钟的时间。现在,GUI开始渲染,而我仍在设置它。这看起来很可怕,而且会减慢完成最终表格的速度

有没有办法告诉tkinter停止渲染,直到GUI完全设置完毕,然后恢复渲染

我知道在WinForms中这样做是可能的。在这种情况下,我只需调用SuspendLayout()就可以在更改它时停止它的渲染。{}是否有类似的机制

编辑--

@martineau-以下是一些测试代码,让您更好地了解我正在尝试做什么

from array import *
from threading import Thread
import tkinter as tk
from tkinter import *
import time

arr=[]
isInit = False

def BuildGUI(value):
    """Draw out inital widgets """
    global isInit    
    rows, cols = (8, 8)
    root = Tk()
    for i in range(rows):
        col = []
        for j in range(cols):
            led = Label(root, text="",  bg="#000000", height = 2, width = 3)
            led.grid(row=j, column=i)
            col.append(led)
        arr.append(col)
    print(arr)
    isInit = True
    #wait for events
    root.mainloop()

class AnimTest:
    """ Animation Library"""
    def begin(self):
        if isInit == False:
            x = Thread(target=BuildGUI, args=(1,))
            x.daemon = True
            x.start()
            while isInit == False:
                print("initializing...")

    def clear(self):
        for x in range(0,8):
            for y in range(0,8):
                self.set_pixel(x, y, 0)
        #this happens at the start of drawing a new frame
        #i want to suspend rendering here

    def set_pixel(self, dispValY, dispValX, mode):
        pxl = arr[dispValX][dispValY] 
        if mode == 0: pxl.config(bg="#000000")
        else: pxl.config(bg="#00FF00")
        #this is used to draw out the fram

    def write_display(self):
        pass
        #i want everything to be rendered when 
        #this is called.

def runTest():
    anim = AnimTest()
    anim.begin()
    x = 0
    y = 2
    dx = dy = 1
    while True:
        x = x + dx
        if (x <= 0 or x >= 7): dx = -dx
        y = y + dy
        if (y <= 0 or y >= 7):dy = -dy
        anim.clear()
        anim.set_pixel(x,y,1)
        anim.write_display()
        time.sleep(1/60)
    
if __name__ == '__main__':
    runTest()

此测试代码应显示一个反弹点的动画。这个特别的动画看起来没那么糟糕。但当我尝试制作更复杂的图像时,它看起来非常浮华

我希望它在调用clear()时暂停渲染,在调用write_display()时恢复渲染


Tags: infromimportselfforiftkinterdef
1条回答
网友
1楼 · 发布于 2024-10-03 19:22:35

在调用updatemainloop()正在运行并允许继续之前,Tkinter无法呈现任何内容。换句话说,默认情况是在创建UI的代码完成UI定义之前不呈现任何内容

如果您发现自己在定义UI的过程中调用了update,但不想更新屏幕,那么最好的解决方案是在窗口准备就绪之前退出该窗口,或者在窗口和所有其他小部件之间添加一个框架,然后将框架添加到窗口作为最后一步

相关问题 更多 >