Как обновить или уничтожить рамку, созданную в canvas в tkinter python? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть графический интерфейс, в котором я создал холст, и у меня есть две рамки, созданные внутри него и использующие canvas.create_window . Один сверху с четырьмя кнопками. По нажатию кнопки я должен создатькадр с некоторыми виджетами до первого кадра.Итак, теперь я хочу, чтобы предыдущий кадр был разрушен (или обновлен, или очищен, или удален), пока я переключаюсь между кнопками. Теперь кадры накладываются друг на друга. Поэтому ниже мой код,

from tkinter import *
#Creating root window
root = Tk()
root.geometry("1000x1000")
#Still don't know how it works but some how made it work :P :P
root.grid_rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=0)
#Creaed canvas for setting up a scroll bar
canv=Canvas(root,width=850, height=650, background='blue')
vsb = Scrollbar(root, orient="vertical", command=canv.yview)
canv.config(yscrollcommand=vsb.set)
vsb.grid(row=1,column=1,sticky="ns")
canv.config(scrollregion=(0, 0,600,1000))
canv.grid(row=1, column=0)
canv.bind('<Configure>',canv.config(scrollregion=canv.bbox('all')))
#Frame for the top push buttons
mainframe1 = Frame(root, height = 20,width= 250,bg = 'white')
canvas_frame = canv.create_window((4, 4),window=mainframe1,anchor="nw")
b1 = Button(mainframe1,text = "butt 1",width = 24, height = 1,command=lambda: buttonClick(1))
b2 = Button(mainframe1,text = "butt 2",width = 24, height = 1,command=lambda: buttonClick(2))
b3 = Button(mainframe1,text = "butt 3",width = 24, height = 1,command=lambda: buttonClick(3))
b4 = Button(mainframe1,text = "Butt 4",width = 24, height = 1,command=lambda: buttonClick(4))
b1.grid(row=0, column=0, padx=15, pady=10)
b2.grid(row=0, column=1, padx=15, pady=10)
b3.grid(row=0, column=2, padx=15, pady=10)
b4.grid(row=0, column=3, padx=15, pady=10)
#Method to work based on Button click
def buttonClick(num):
    if num == 1:
        #Creating Frame inside Canvas
        mainframe2 = Frame(root, height = 200,width= 250,bg = 'white')
        canvas_frame = canv.create_window((80,100),window = mainframe2,anchor="nw")
        label = Label(mainframe2,text="frame for butt 1",font=('Courier',-20,'bold'))
#label.grid_rowconfigure(1,weight=1)
#label.columnconfigure(1,weight=1)
        label.grid(row=0,column=3)
        #Create a Tkinter variable
        varmonth = StringVar()
        varyear = StringVar()
        varmonth.set('January')  # set the default option
        varyear.set('2017')
       #Option Menu for Dropdown list boxes
        #For Month
        popupMenu = OptionMenu(mainframe2, varmonth, 'January', 'February', 'March', 'April', 'May','June','July','August','Septempber','October','November','December')
        Label(mainframe2, text="Select Month",font=('Courier',-15,'bold')).grid(row=2, column=1,sticky='e',padx=15,pady=15)
        popupMenu.grid(row=2, column=2,padx=20,sticky="ew")
        #For year
        popupMenu = OptionMenu(mainframe2, varyear, '2017','2018','2019')
        Label(mainframe2, text="Select Year",font=('Courier',-15,'bold')).grid(row=2, column=7,padx=20,pady=25)
        popupMenu.grid(row=2, column=8,padx=15,pady=20)
        #For Generate Report Button
        buttongreport = Button(mainframe2,text = 'Generate Sales report',width = 24, height = 1,command=lambda: buttonClick(gr))
        buttongreport.grid(row=8, column=3,columnspan=2, padx=10, pady=10)

    elif(num==2):
        mainframe3 = Frame(root, height=200, width=250, bg='white')
        canvas_frame = canv.create_window((80, 100), window=mainframe3, anchor="nw")
        label = Label(mainframe3, text="Frame for butt 2", font=('Courier', -20, 'bold'))
        # label.grid_rowconfigure(1,weight=1)
        # label.columnconfigure(1,weight=1)
        label.grid(row=0, column=3)
        # Create a Tkinter variable
        varmonth = StringVar()
        varyear = StringVar()
        varmonth.set('January')  # set the default option
        varyear.set('2017')

        popupMenu = OptionMenu(mainframe3, varmonth, 'January', 'February', 'March', 'April', 'May', 'June', 'July',
                               'August', 'Septempber', 'October', 'November', 'December')
        Label(mainframe3, text="Select Month", font=('Courier', -15, 'bold')).grid(row=2, column=1, sticky='e', padx=15,
                                                                                   pady=15)
        popupMenu.grid(row=2, column=2, padx=20, sticky="ew")

        popupMenu = OptionMenu(mainframe3, varyear, '2017', '2018', '2019')
        Label(mainframe3, text="Select Year", font=('Courier', -15, 'bold')).grid(row=2, column=7, padx=20, pady=25)
        popupMenu.grid(row=2, column=8, padx=15, pady=20)

        buttongreport = Button(mainframe3, text='Generate Sales report', width=24, height=1,
                               command=lambda: buttonClick(gr))
        buttongreport.grid(row=8, column=3, columnspan=2, padx=10, pady=10)
    elif(num==3):
        mainframe4 = Frame(root, height=200, width=250, bg='white')
        canvas_frame = canv.create_window((80, 100), window=mainframe4, anchor="nw")
        label = Label(mainframe4, text=" Frame for Butt 4", font=('Courier', -20, 'bold'))
        # label.grid_rowconfigure(1,weight=1)
        # label.columnconfigure(1,weight=1)
        label.grid(row=0, column=2)
        # Create a Tkinter variable
        varmonth = StringVar()
        varyear = StringVar()
        varmonth.set('1: January to April')  # set the default option
        varyear.set('2017')

        popupMenu = OptionMenu(mainframe4, varmonth, '1: January to April', '2: May to August', '3: Septempber to December')
        Label(mainframe4, text="Select Quarter", font=('Courier', -15, 'bold')).grid(row=2, column=1, sticky='e', padx=15,
                                                                                   pady=15)
        popupMenu.grid(row=2, column=2, padx=20, sticky="ew")

        popupMenu = OptionMenu(mainframe4, varyear, '2017', '2018', '2019')
        Label(mainframe4, text="Select Year", font=('Courier', -15, 'bold')).grid(row=2, column=7, padx=20, pady=25)
        popupMenu.grid(row=2, column=8, padx=15, pady=20)

        buttongreport = Button(mainframe4, text='Generate Sales report', width=24, height=1,
                               command=lambda: buttonClick(gr))
        buttongreport.grid(row=8, column=2, padx=10, pady=10)

root.mainloop()

Я написал код процедурным способом. Извините за длинный код.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы можете использовать метод frame.destroy().

destroy(), удалит рамку и все ее дочерние элементы также будут уничтожены.

0 голосов
/ 13 февраля 2019

Вы можете использовать canvas.delete(...) для удаления отображаемого в данный момент кадра при каждом нажатии кнопки.Но вам нужно объявить глобальную переменную для хранения текущего кадра:

open_frame = None

Затем измените buttonClick(...):

def buttonClick(num):
    global open_frame
    if open_frame:
        canv.delete(open_frame)
    if num == 1:
        ...
        open_frame = canv.create_window(...)
        ...
    elif num == 2:
        ...
        open_frame = canv.create_window(...)
        ...
    elif num == 3:
        ...
        open_frame = canv.create_window(...)
        ...
...