在下面的代码我不能让图表更新一个特定的延迟,所以它看起来好像在线更新,我已经使用after方法调用一个函数,它会给它新的,但我仍然得到整个图表,我也试过time.sleep甚至不起作用
#!/usr/bin/python
from numpy import *
from Tkinter import *
import time
from functools import partial
class Gui():
def __init__(self,parent):
self.parent=parent
mL=[]
mV=[]
for i in range(0,10):
ml_val=10 + i*0.1
mv_val=1000 + i
mL.append(ml_val)
mV.append(mv_val)
frame = Frame(self.parent, width=900, height=900, bd=1)
frame.pack()
iframe5 = Frame(frame, bd=2,width=800, height=800, relief=RAISED)
iframe5.pack( pady=10, padx=5)
self.w = Canvas(iframe5, bg='white', width=600, height=510)
self.w.pack()
self.w.create_rectangle(1,1, 599, 509, fill="cyan")
self.w.create_line(50,460,50,70,fill="#222")
self.w.create_line(50, 460, 500, 460, fill="#222")
self.w.create_text(400,55,text="mL vs mV Graph")
self.w.create_text(390,75,text="mL : X - axis ")
self.w.create_text(390,95,text="mV : Y - axis ")
self.w.create_text(30,55,text="Y-Axis")
self.w.create_text(530,480,text="X-Axis")
y_range=450
x_range=90
self.y_plot=[]
self.x_plot=[]
for i in range(0,10):
self.w.create_text(20,y_range,text=mV[i])
self.w.create_text(x_range,480,text=mL[i])
self.x_plot.append(x_range)
self.y_plot.append(y_range)
self.w.create_line(40,y_range,50,y_range, fill="blue")
self.w.create_line(x_range,460,x_range,470, fill="blue")
y_range -=40
x_range +=40
# time.sleep(10)
for i in range(0,9):
root.after(1000, partial(self.create_graph,i))
time.sleep(1)
def create_graph(self,i):
self.w.create_line(self.x_plot[i],self.y_plot[i],self.x_plot[i+1],self.y_plot[i+1], fill="blue")
if __name__== "__main__":
root = Tk()
# root.attributes('-fullscreen',True)
app=Gui(root)
root.mainloop()
答案 0 :(得分:2)
对所有点使用after(1000, ...)
,您计划在__init__
完成后绘制1000毫秒,即它们全部在同一时间绘制。添加sleep
只会延迟__init__
完成的时间,从而缩短显示用户界面的时间。
相反,您应该在__init__
之后安排不同次的不同点:
def __init__(self, parent):
# other initialization code
for i in range(0, 9):
root.after(1000 * i, partial(self.create_graph, i))
或者,在after
的末尾添加一个__init__
来安排第一个点的绘制,并在after
方法中另外create_graph
绘制下一个点
def __init__(self, parent):
# other initialization code
# at the end, remove the for loop and instead call after
root.after(1000, partial(self.create_graph, 0, 9))
def create_graph(self, i, k):
self.w.create_line(self.x_plot[i],self.y_plot[i],self.x_plot[i+1],self.y_plot[i+1], fill="blue")
# call after again to schedule drawing more points
if i < k:
root.after(1000, partial(self.create_graph, i+1, 9))