ttk.Progressbar使用python 3.1.4 tkinter 8.5将无法启动

时间:2011-09-05 21:45:48

标签: progress-bar tkinter

我已经编写了一些python 3.1代码(非常简单,因为我没有程序员)而且我正在尝试使用tkinter 8.5和python 3.1.4将GUI放入其中。我遇到的问题是进度条无法启动。这是代码的一部分:

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 个答案:

答案 0 :(得分:1)

酒吧正在启动,您只是没有看到它,因为您没有给UI重绘的机会。当屏幕重绘时,您已停止进度条。重绘是为了响应重绘事件而发生的,并且这些事件由事件循环处理。当您的代码在循环中读取数据时,您将阻止事件循环运行。

您将需要a)使用线程或单独的进程来执行IO,以免使事件循环挨饿,b)您需要将处理分解为可以在每次迭代期间完成的小块。事件循环,或c)在循环的每次迭代期间调用update_idletasks;此方法处理“空闲”事件,包括屏幕刷新。

谷歌为“tkinter长时间运行计算”提供了大量建议。

答案 1 :(得分:0)

您需要使用步骤或设置更新进度条,或更改附加到进度条的IntVar变量的值。

这可能会有所帮助。此示例启动一个主窗口,可以打开多个进度条 通过自动方法循环递增。在这个小例子中,你的截止日期循环用于自动方法的目的。

将tkinter导入为tk 来自tkinter import ttk 进口时间

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)

class pbar_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_window()