2015-10-06 3 views
0

Я пишу приложение, которое будет использоваться как в Linux, так и в Windows.Tkinter progressbar не работает под Windows

Для графического интерфейса Я использую Tkinter, но у меня проблема при попытке запустить мою программу в Windows. В Linux, где я его разрабатывал, он работает отлично.

Я использовал toplevel с индикатором выполнения ttk, чтобы показать ход загрузки данных, прежде чем появится программа/GUI. Этот индикатор выполнения отсутствует в Windows. Это не порождает ошибку, похоже, ее там нет. Место, где он ДОЛЖЕН быть прозрачным, так что вы можете видеть окна/рабочий стол и т. Д. За верхним уровнем.

Любые идеи, почему это происходит? У кого-нибудь еще была эта проблема?

Вот код, который вызывает TopLevel:

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). Это будет а) дать вам более глубокое понимание проблемы (и, возможно, осветить решение), и б) помочь нам воспроизвести проблему. –

+0

без фактического рабочего кода мы не можем дублировать проблему, что затрудняет диагностику. –

+0

Ну код есть. Я не думаю, что код, где я собираю данные, необходим, есть только некоторые строки, которые обрабатывают данные, затем следует строка «self.top.frame.step (10)». Любой другой код относительно проблемы находится в этом вопросе. – TobiasTomski

ответ

0

Нашел решение самостоятельно. Проблема заключалась в том, что выполнение под Windows и Linux, похоже, немного отличается.

Windows не обновляет графический интерфейс пользователя, пока вы не заходите в mainloop в приведенном выше примере. Обработка этого вопроса явно отличается от 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()