簡體   English   中英

在 Tkinter Python 中的第一次迭代后,銷毀函數沒有有效地銷毀幀

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM