【问题标题】:Destroy function not destroying a frame efficiently after the first iteration in Tkinter Python在 Tkinter Python 中的第一次迭代后,销毁函数没有有效地销毁帧
【发布时间】:2020-03-24 16:20:57
【问题描述】:

我已经构建了一个代码,在 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()

【问题讨论】:

    标签: python user-interface tkinter destroy


    【解决方案1】:

    我找到了解决这个问题的方法。然而,一个新的问题出现了..

    基本上,我在 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()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多