微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tkinter窗口无法完全加载

如何解决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,pady = 20)
    log = Label(load,image = logo)
    log.image = logo
    log.grid(row = 0,column = 0,rowspan = 2,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()函数中可能存在问题。

解决方法

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

这部分代码

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,您的评论对弄清这一点确实很有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。