2015-10-06 45 views
0

我正在編寫一個在Linux和Windows下都可以使用的應用程序。Tkinter進度欄不能在Windows下工作

對於我使用Tkinter的GUI,但是當我嘗試在Windows上運行我的程序時遇到問題。在Linux上,我開發它,它工作得很好。

我用一個ttk進度條的頂層來顯示在程序/ GUI顯示之前加載數據的進度。 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上缺少進度條。

+0

第一步應該是創建一個[MCVE](http://stackoverflow.com/help/mcve)。這將a)讓您對問題有更深入的瞭解(並可能闡明解決方案),b)幫助我們重現問題。 –

+0

沒有實際的工作代碼,我們不能複製問題,這使得診斷非常困難。 –

+0

那麼代碼就在那裏。我不認爲我收集數據的代碼是必需的,只有一些行處理數據,然後是「self.top.frame.step(10)」這一行。任何其他與問題相關的代碼都在問題中。 – TobiasTomski

回答

0

自己找到解決方案。問題是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()