ttk.Progressbar с использованием Python 3.1.4 tkinter 8.5 не запускается - PullRequest
1 голос
/ 06 сентября 2011

Я написал некоторый код на Python 3.1 (очень простой, потому что я не программист), и я пытаюсь добавить в него графический интерфейс, используя tkinter 8.5 и python 3.1.4.Проблема в том, что индикатор выполнения не запускается.Вот часть кода:

def transformation(Xn,Yn,Zn,const):

     infile = filedialog.askopenfile('r')
     outfile = filedialog.asksaveasfile('w')      

     pbar.start()

     for line in infile.readlines():                                 
              inlist = line.split(" ")
              inlist = [float(i) for i in inlist] 

              l = (Xn+Yn+Zn)/const**2

              Xm = inlist[0] + Xn*l
              Ym = inlist[1] + Yn*l
              Zm = inlist[2] + Zn*l

              outlist=[0,0,0]  
              outlist[0] = inlist[0] + 2*(Xm-inlist[0])
              outlist[1] = inlist[1] + 2*(Ym-inlist[1])
              outlist[2] = inlist[2] + 2*(Zm-inlist[2])

              outdata = str('%.4f' %outlist[0])+" "+str('%.4f' %outlist[1])+" "+str('%.4f' %outlist[2])+"\n"

              outfile.writelines(outdata)


     infile.close()    
     outfile.close() 

     pbar.stop()

Функция вызывается кнопкой.Я даю все файлы, необходимые для работы программы.Расчет успешно завершен, но панель никогда не запускается.Есть идеи?

Спасибо, AlexTh

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Панель запускается, вы просто ее не видите, потому что у вас нет возможности перерисовать интерфейс. К тому времени, когда экран перерисовывается, вы уже остановили индикатор выполнения. Перерисовки происходят в ответ на события перерисовки, и эти события обрабатываются циклом событий. Пока ваш код находится в цикле, который читает данные, вы препятствуете запуску цикла событий.

Вам понадобится либо: а) использовать поток или отдельный процесс для выполнения ввода-вывода, чтобы не вызывать голодание цикла событий, б) вам нужно разбить свою обработку на небольшие куски, которые можно выполнять во время каждой итерации цикл обработки событий, или c) вызывать update_idletasks во время каждой итерации цикла; этот метод обрабатывает «неактивные» события, которые включают обновления экрана.

Google для "tkinter долгосрочного расчета" для многих советов.

0 голосов
/ 28 сентября 2011

Вам необходимо обновить индикатор выполнения с помощью шага или набора или изменить значение переменной IntVar, которая прикреплена к индикатору выполнения.

Это может помочь.В этом примере запускается главное окно, в котором можно открыть несколько индикаторов выполнения, которые увеличиваются в цикле с помощью автоматического метода.В этом небольшом примере ваш цикл сроков служит цели автоматического метода.

импорт tkinter как tk из tkinter import ttk import time

class main_window:

def __init__(self):
    self.pbars = []

    self.parent = tk.Tk()
    self.parent.title('multiprocessing progess bar')

    frame = ttk.Labelframe(self.parent)
    frame.pack(pady=10, padx=10)

    btn = tk.Button(frame, text="Cancel")
    btn.bind("<Button-1>", self.cancel)
    btn.grid(row=0, column=1, pady=10)

    btn = tk.Button(frame, text="progress_bar")
    btn.bind("<Button-1>", self.pbar)
    btn.grid(row=0, column=2, pady=10)

    btn = tk.Button(frame, text="increment")
    btn.bind("<Button-1>", self.increment)
    btn.grid(row=0, column=3, pady=10)

    self.parent.mainloop()


def pbar(self, event):

    count= len(self.pbars)
    name="producer %d" % count

    print (count*10)
    self.pbars.append(pbar_dialog(self.parent, title=name, count=count*10))
    pbar.automatic()

def cancel(self, event):
   self.parent.destroy()

def increment(self, event):
   for pbar in self.pbars:
       pbar.step(10)

classpbar_dialog:

toplevel=None
pbar_count = 0

def __init__(self, parent, count=0, title=None):
    self.pbar_value = count
    self.title=title

    pbar_dialog.pbar_count += 1

    if not pbar_dialog.toplevel:
        pbar_dialog.toplevel= tk.Toplevel(parent)

    self.frame = ttk.Labelframe(pbar_dialog.toplevel, text=title)
    #self.frame.pack()
    self.pbar = ttk.Progressbar(self.frame, length=300, variable=self.pbar_value)
    self.pbar.grid(row=0, column=1, columnspan=2, padx=5, pady=5)

    btn = tk.Button(self.frame, text="Cancel")
    btn.bind("<Button-1>", self.cancel)
    btn.grid(row=0, column=3, pady=10)
    self.frame.pack()

    self.pbar.step(count)

def set(self,value):
    self.pbar_value=value

def step(self,increment=1):
    self.pbar.step(increment)

def cancel(self, event):
   self.destroy()

def destroy(self):
    self.frame.destroy()
    pbar_dialog.pbar_count -= 1
    if pbar_dialog.pbar_count == 0:
        pbar_dialog.toplevel.destroy()

def automatic(self): 
    for i in range(self.pbar_value, 100):
        time.sleep(1)
        #self.step()
        print(self.title, i)
        self.set(i)

если имя == ' main ':

main_window()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...