Tkinter进度栏在Windows下不起作用

托比亚斯·汤姆斯基(Tobias Tomski)

我正在编写一个将在Linux和Windows下使用的应用程序。

对于GUI,我正在使用Tkinter,但是当我尝试在Windows上运行程序时遇到了问题。在我开发它的Linux上,它可以正常工作。

在程序/ GUI出现之前,我使用了带有ttk进度栏的顶层来显示加载数据的进度。Windows上缺少此进度条。它不会引发错误,只是似乎不存在。它应该透明的地方,因此您可以看到顶层后面的窗口/桌面等。

任何想法为什么会发生这种情况?还有其他人有这个问题吗?

这是调用顶层的代码:

import Tkinter as tk
import ttk
import platform
import time

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.init_progbar()
        self.prog_data()
        self.top.destroy()

    #initializing progress bar, may be used with self.top
    def init_progbar(self):
        self.top = tk.Toplevel(self)
        self.top.frame = tk.Frame(self.top)
        self.top.frame.grid()
        self.top.frame.progbar = ttk.Progressbar(self.top.frame, \
            orient='horizontal', mode = 'determinate', length = '500')
        self.top.frame.progbar.grid()
        Window.center(self.top)

    #static method to center a toplevel window
    @staticmethod
    def center(toplevel, size=None):
        toplevel.update_idletasks()
        w = toplevel.winfo_screenwidth()
        h = toplevel.winfo_screenheight()
        if not size:
            size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
        x = w/2 - size[0]/2
        y = h/2 - size[1]/2
        toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))

    #dummy method - somethings done, then the value of the progress bar
    #is raised by 10
    def prog_data(self):
        for i in range(10):
            time.sleep(1)
            self.top.frame.progbar.step(10)
            self.top.update_idletasks()

def main():
    window = Window()
    window.mainloop()

if __name__=='__main__':
    main()

就像我之前说的那样,它可以在Linux下毫无问题地运行,只是在Windows上不起作用。

我在两个不同的Linux系统(openSUSE和Ubuntu)以及两台运行Windows的计算机(一台Windows 7和一台Windows 10)上进行了尝试。每次发生相同的问题-Windows上的进度栏都丢失。

托比亚斯·汤姆斯基(Tobias Tomski)

自己找到解决方案。问题在于Windows和Linux下的执行似乎有些不同。

在上例中进入主循环之前,Windows不会更新GUI。在Linux上,此问题的处理方式明显不同,从而可以确保正确执行。

为了清楚起见,我重新编写了示例代码,因此可以更清楚地了解需要更改的内容。检查注释以获取进一步的解释。

import Tkinter as tk
import ttk
import platform
import time

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.init_progbar()
        self.prog_data()
        self.top.destroy()

    #initializing progress bar, may be used with self.top.
    def init_progbar(self):
        #The frame here was unnecessary.
        self.top = tk.Toplevel(self)
        self.top.progbar = ttk.Progressbar(self.top, \
            orient='horizontal', mode = 'determinate', length = '500')
        self.top.progbar.grid()
        Window.center(self.top)

    #static method to center a toplevel window
    @staticmethod
    def center(toplevel, size=None):
        toplevel.update_idletasks()
        w = toplevel.winfo_screenwidth()
        h = toplevel.winfo_screenheight()
        if not size:
            size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
        x = w/2 - size[0]/2
        y = h/2 - size[1]/2
        toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))
        #This processes every pending geometry change and redraws the widget.
        self.update()

    #dummy method - somethings done, then the value of the progress bar
    #is raised by 10
    def prog_data(self):
        for i in range(10):
            time.sleep(1)
            self.top.frame.progbar.step(10)
            #Updates the whole GUI every time some data gets processed.
            self.update()

def main():
    window = Window()
    window.mainloop()

if __name__=='__main__':
    main()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章