首页 > 解决方案 > Tkinter 窗口未完全加载

问题描述

我试图有一个显示进度的进度窗口,以及在后台发生的任务。一切都按预期工作,除了窗口部分加载到屏幕上(它的多少取决于每次运行)。这是代码的相关部分:

def loading(): #Displays loading progress while setting up the exam
    global load, progress      
    load = Toplevel()
    load.title("Loading")
    load.attributes('-topmost', True)
    load.overrideredirect(True)
    lab = Label(load, text = ("Preparing Your Exam, Please Wait!\nPlease DO NOT Open any Other Window.\n"
                              +"Doing so may lead to immidiate Termination."))
    lab.grid(row = 0, column = 1, padx = 20, pady = 20)
    progress=Progressbar(load,orient=HORIZONTAL,length=200,mode='determinate')
    progress.grid(row = 1, column = 1, padx = 20, pady = 20)
    log = Label(load, image = logo)
    log.image = logo
    log.grid(row = 0, column = 0, rowspan = 2, padx = 20, pady = 20)
    w_req, h_req = load.winfo_width(), load.winfo_height()
    w_form = load.winfo_rootx() - load.winfo_x()
    w = w_req + w_form*2
    h = h_req + (load.winfo_rooty() - load.winfo_y()) + w_form
    x = (load.winfo_screenwidth() // 2) - (w // 2)
    y = (load.winfo_screenheight() // 2) - (h // 2)
    load.geometry(f'{w_req}x{h_req}+{x}+{y}')

以下是调用后发生的情况loading

loading()
conv_th = Thread(target = Convert).start()

Convert函数转换和处理图像,我没有分享它,因为它可能不相关。

我认为,这可能是因为它没有足够的时间来完全加载,但我无法真正弄清楚是什么导致程序以这种方式运行。任何帮助将不胜感激!

更新:即使conv_th = Thread(target = Convert).start()省略,也会看到此行为,这意味着函数中可能存在问题loading()

标签: pythonpython-3.xmultithreadingtkintertkinter-layout

解决方案


所以,我最终自己解决了这个问题。我说的是我认为最有可能的原因,如果我给出的原因不正确或有其他解决方案,请纠正我。

这部分代码,

w_req, h_req = load.winfo_width(), load.winfo_height()
w_form = load.winfo_rootx() - load.winfo_x()
w = w_req + w_form*2
h = h_req + (load.winfo_rooty() - load.winfo_y()) + w_form
x = (load.winfo_screenwidth() // 2) - (w // 2)
y = (load.winfo_screenheight() // 2) - (h // 2)

在窗口完全加载之前执行得太早,因此在此之前加载的任何数量都被视为尺寸,然后设置值。

load.update_idletasks()在上述代码部分之前添加命令解决了问题。谢谢@martineau,您的评论对解决这个问题非常有帮助。


推荐阅读