我已经编写了一些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
答案 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()