[英]Destroy function not destroying a frame efficiently after the first iteration in Tkinter Python
我已经构建了一个代码,用于在 for 循环中的每次迭代中保存计算数据,并将结果存储在 3 个不同的 csv 文件中。 这些保存的结果在另一个 python 代码中读取,该代码使用 GUI tkinter 在包含三个不同框架的窗口上显示结果。 这三帧完美地每 3 秒更新一次。
我在三个框架中的每一个上都添加了一个“关闭”按钮,按下该按钮时应仅销毁/关闭特定框架。 在第一次迭代中,当我在三个框架中的任何一个上按下关闭按钮时,框架的破坏/关闭都完成了。 但是,随着时间的推移,当超过 1 次迭代完成时,关闭按钮不会立即关闭。
例如,假设已经完成了 3 次迭代和计算,所以当我按下关闭按钮时,它会在第四次按下时关闭,在按下它之前,帧将显示上一次迭代中显示的 PREVIOUS 结果..如何编辑? 我在下面附上了我的代码。
import random
from tkinter import*
import tkinter as tk
import csv
import numpy as np
import time
base = tk.Tk()
base.geometry("500x300")
frame1 = tk.LabelFrame(base, text="MVs ", width=240, height=330, bd=15)
frame2 = tk.LabelFrame(base, text="CVs ", width=240, height=330, bd=15)
frame3 = tk.LabelFrame(base, text="DVs ", width=240, height=330, bd=15)
def MVs():
#read files from saved excel sheets
MV=np.empty(8)
with open("MVs.csv","r") as csv_file:
count=0
csv_reader=csv.reader(csv_file)
for row in csv_reader:
i=row[0]#change from string to float type
MV[count]=i #update y array
count +=1 # increment of 1 to get the number of total values
MV=MV.reshape(8,1)
frame1 = tk.LabelFrame(base, text="MVs", width=240, height=330, bd=15)
frame1.grid(row=1, column=0, padx=8)
#Display row titles
def exit_btn():
frame1.destroy()
#frame1.update()
btn1_c=Button(frame1,text="Close",command=exit_btn).grid(column=1,columnspan=1,row=10,rowspan=1, sticky=W)
Label(frame1,text="Tc Measured").grid(column=0,columnspan=1,row=2,rowspan=1, sticky=W)
Label(frame1,text="Tc Optimum").grid(column=0,columnspan=1,row=3,rowspan=1, sticky=W)
Label(frame1,text="Tc Cost").grid(column=0,columnspan=1,row=4,rowspan=1, sticky=W)
Label(frame1,text="Tc Weight").grid(column=0,columnspan=1,row=5,rowspan=1, sticky=W)
Label(frame1,text="Q Measured").grid(column=0,columnspan=1,row=6,rowspan=1, sticky=W)
Label(frame1,text="Q Optimum").grid(column=0,columnspan=1,row=7,rowspan=1, sticky=W)
Label(frame1,text="Q Cost").grid(column=0,columnspan=1,row=8,rowspan=1, sticky=W)
Label(frame1,text="Q Weight").grid(column=0,columnspan=1,row=9,rowspan=1, sticky=W)
for i in range(8):
Label(frame1,text= str(round(MV[i,0],5))).grid(column=1 ,columnspan=1,row=i+2,rowspan=1, sticky=W)
def CVs():
CV=np.empty(8)
with open("CVs.csv","r") as csv_file:
count=0
csv_reader=csv.reader(csv_file)
for row in csv_reader:
i=row[0]#change from string to float type
CV[count]=i #update y array
count +=1 # increment of 1 to get the number of total values
CV=CV.reshape(8,1)
frame2 = tk.LabelFrame(base, text="CVs", width=240, height=330, bd=15)
frame2.grid(row=1, column=3, padx=8)
def exit_btn():
frame2.destroy()
# frame2.update()
#Display row titles
btn2_c=Button(frame2,text="Close",command=exit_btn).grid(column=3,columnspan=1,row=10,rowspan=1, sticky=W)
Label(frame2,text="T Measured").grid(column=3,columnspan=1,row=2,rowspan=1, sticky=W)
Label(frame2,text="T Optimum").grid(column=3,columnspan=1,row=3,rowspan=1, sticky=W)
Label(frame2,text="T Revenue").grid(column=3,columnspan=1,row=4,rowspan=1, sticky=W)
Label(frame2,text="T Weight").grid(column=3,columnspan=1,row=5,rowspan=1, sticky=W)
Label(frame2,text="Ca Measured").grid(column=3,columnspan=1,row=6,rowspan=1, sticky=W)
Label(frame2,text="Ca Optimum").grid(column=3,columnspan=1,row=7,rowspan=1, sticky=W)
Label(frame2,text="Ca Revenue").grid(column=3,columnspan=1,row=8,rowspan=1, sticky=W)
Label(frame2,text="Ca Weight").grid(column=3,columnspan=1,row=9,rowspan=1, sticky=W)
for i in range(8):
Label(frame2,text= str(round(CV[i,0],5))).grid(column=4 ,columnspan=1,row=i+2,rowspan=1, sticky=W)
def DVs():
dist=np.empty(1)
with open("disturbance.csv","r") as csv_file:
count=0
csv_reader=csv.reader(csv_file)
for row in csv_reader:
i=row[0]#change from string to float type
dist[count]=i #update y array
count +=1 # increment of 1 to get the number of total values
dist=dist.reshape(1,1)
frame3 = tk.LabelFrame(base, text="DVs ", width=240, height=330, bd=15)
frame3.grid(row=1, column=5, padx=8)
def exit_btn():
frame3.destroy()
# frame3.update()
btn3_c=Button(frame3,text="Close",command=exit_btn).grid(column=5,columnspan=1,row=3,rowspan=1, sticky=W)
Label(frame3,text="Q Loss").grid(column=5,columnspan=1,row=2,rowspan=1, sticky=W)
Label(frame3,text= str(round(dist[0,0],3))).grid(column=6 ,columnspan=1,row=2,rowspan=1, sticky=W)
btn1=Button(base,text='MVs',command=MVs)
btn2=Button(base,text='CVs',command=CVs)
btn3=Button(base,text='DVs',command=DVs)
btn1.grid(row=0,column=0)
btn2.grid(row=0,column=3)
btn3.grid(row=0,column=5)
i=0
show=True
#show results
while(show==True):
#base.after(i, MVs) #in ms
frame1.after(i, MVs)
#frame1.after(i+100,frame1.destroy)
#base.after(i, CVs) #in ms
frame2.after(i, CVs)
#frame2.after(i+100,frame2.destroy)
#base.after(i, DVs) #in ms
frame3.after(i, DVs)
#frame3.after(i+100,frame3.destroy)
base.update()#update display
i=i+3000
base.mainloop()
我找到了解决这个问题的方法。 然而,新的问题出现了..
基本上,我在 MVs 函数中定义了 frame1。 我删除了它并只在开始时保留它。 对 frame2 和 frame3 进行了相同的方法。 这样,当我按下关闭按钮时,相应的框架会立即关闭。 但是,现在当我关闭 frame1 时,例如,当我再次按下 MVs 按钮时,frame1 不会再次打开。 它给了我一个错误:
_tkinter.TclError: bad window path name ".!labelframe"
如果我不按关闭按钮,则不会发生此问题。 因此,问题肯定来自破坏和关闭框架。
我在这里附上了我编辑过的代码:
import random
from tkinter import*
import tkinter as tk
import csv
import numpy as np
import time
base = tk.Tk()
base.geometry("500x300")
frame1 = tk.LabelFrame(base, text="MVs ", width=240, height=330, bd=15)
frame1.grid(row=1, column=0, padx=8)
frame2 = tk.LabelFrame(base, text="CVs ", width=240, height=330, bd=15)
frame2.grid(row=1, column=3, padx=8)
frame3 = tk.LabelFrame(base, text="DVs ", width=240, height=330, bd=15)
frame3.grid(row=1, column=5, padx=8)
z=False
def MVs():
#read files from saved excel sheets
global z
global frame1
if z==True:
frame1 = tk.LabelFrame(base, text="MVs", width=240, height=330, bd=15)
frame1.grid(row=1, column=0, padx=8)
MV=np.empty(8)
with open("MVs.csv","r") as csv_file:
count=0
csv_reader=csv.reader(csv_file)
for row in csv_reader:
i=row[0]#change from string to float type
MV[count]=i #update y array
count +=1 # increment of 1 to get the number of total values
MV=MV.reshape(8,1)
#Display row titles
def exit_btn():
z=True
frame1.destroy()
frame1.update()
if z==False:
Label(frame1,text="Tc Measured").grid(column=0,columnspan=1,row=2,rowspan=1, sticky=W)
Label(frame1,text="Tc Optimum").grid(column=0,columnspan=1,row=3,rowspan=1, sticky=W)
Label(frame1,text="Tc Cost").grid(column=0,columnspan=1,row=4,rowspan=1, sticky=W)
Label(frame1,text="Tc Weight").grid(column=0,columnspan=1,row=5,rowspan=1, sticky=W)
Label(frame1,text="Q Measured").grid(column=0,columnspan=1,row=6,rowspan=1, sticky=W)
Label(frame1,text="Q Optimum").grid(column=0,columnspan=1,row=7,rowspan=1, sticky=W)
Label(frame1,text="Q Cost").grid(column=0,columnspan=1,row=8,rowspan=1, sticky=W)
Label(frame1,text="Q Weight").grid(column=0,columnspan=1,row=9,rowspan=1, sticky=W)
for i in range(8):
Label(frame1,text= str(round(MV[i,0],5))).grid(column=1 ,columnspan=1,row=i+2,rowspan=1, sticky=W)
btn1_c=Button(frame1,text="Close",command=exit_btn).grid(column=1,columnspan=1,row=10,rowspan=1, sticky=W)
def CVs():
global z
global frame2
if z==True:
frame2 = tk.LabelFrame(base, text="CVs", width=240, height=330, bd=15)
frame2.grid(row=1, column=3, padx=8)
CV=np.empty(8)
with open("CVs.csv","r") as csv_file:
count=0
csv_reader=csv.reader(csv_file)
for row in csv_reader:
i=row[0]#change from string to float type
CV[count]=i #update y array
count +=1 # increment of 1 to get the number of total values
CV=CV.reshape(8,1)
#frame2 = tk.LabelFrame(base, text="CVs", width=240, height=330, bd=15)
#frame2.grid(row=1, column=3, padx=8)
def exit_btn():
z=True
frame2.destroy()
frame2.update()
#Display row titles
Label(frame2,text="T Measured").grid(column=3,columnspan=1,row=2,rowspan=1, sticky=W)
Label(frame2,text="T Optimum").grid(column=3,columnspan=1,row=3,rowspan=1, sticky=W)
Label(frame2,text="T Revenue").grid(column=3,columnspan=1,row=4,rowspan=1, sticky=W)
Label(frame2,text="T Weight").grid(column=3,columnspan=1,row=5,rowspan=1, sticky=W)
Label(frame2,text="Ca Measured").grid(column=3,columnspan=1,row=6,rowspan=1, sticky=W)
Label(frame2,text="Ca Optimum").grid(column=3,columnspan=1,row=7,rowspan=1, sticky=W)
Label(frame2,text="Ca Revenue").grid(column=3,columnspan=1,row=8,rowspan=1, sticky=W)
Label(frame2,text="Ca Weight").grid(column=3,columnspan=1,row=9,rowspan=1, sticky=W)
for i in range(8):
Label(frame2,text= str(round(CV[i,0],5))).grid(column=4 ,columnspan=1,row=i+2,rowspan=1, sticky=W)
btn2_c=Button(frame2,text="Close",command=exit_btn).grid(column=3,columnspan=1,row=10,rowspan=1, sticky=W)
def DVs():
dist=np.empty(1)
with open("disturbance.csv","r") as csv_file:
count=0
csv_reader=csv.reader(csv_file)
for row in csv_reader:
i=row[0]#change from string to float type
dist[count]=i #update y array
count +=1 # increment of 1 to get the number of total values
dist=dist.reshape(1,1)
#frame3 = tk.LabelFrame(base, text="DVs ", width=240, height=330, bd=15)
#frame3.grid(row=1, column=5, padx=8)
def exit_btn():
frame3.destroy()
frame3.update()
btn3_c=Button(frame3,text="Close",command=exit_btn).grid(column=5,columnspan=1,row=3,rowspan=1, sticky=W)
Label(frame3,text="Q Loss").grid(column=5,columnspan=1,row=2,rowspan=1, sticky=W)
Label(frame3,text= str(round(dist[0,0],3))).grid(column=6 ,columnspan=1,row=2,rowspan=1, sticky=W)
btn1=Button(base,text='MVs',command=MVs)
btn2=Button(base,text='CVs',command=CVs)
btn3=Button(base,text='DVs',command=DVs)
btn1.grid(row=0,column=0)
btn2.grid(row=0,column=3)
btn3.grid(row=0,column=5)
i=0
show=True
#show results
while(show==True):
#base.after(i, MVs) #in ms
frame1.after(i, MVs)
#frame1.after(i+100,frame1.destroy)
#base.after(i, CVs) #in ms
frame2.after(i, CVs)
#frame2.after(i+100,frame2.destroy)
#base.after(i, DVs) #in ms
frame3.after(i, DVs)
#frame3.after(i+100,frame3.destroy)
base.update()#update display
i=i+3000
base.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.