user3787620
user3787620

Reputation: 33

Avoid screen overlap in Tkinter

I'm using Tkinter to make a MenuBar with some functions, and I would like to display them in the same window below the MenuBar. Below codes are able to do so. But the problem is when I switch function back and forth, it overlaps on the previous function display, that you can still see the label(or Entry), and be able to type on the Entry of the previous function.

Is there a way to refresh the display each time before running a function? Something like cls.

import Tkinter
from Tkinter import Tk, Frame, Menu
from Tkinter import IntVar, BOTH
class App(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)            
        self.parent = parent        
        self.initUI()

    def initUI(self):      
        self.parent.title("Test")        
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)        
        fileMenu = Menu(menubar)     
        menubar.add_cascade(label="Discrepancy", menu=fileMenu)
        fileMenu.add_command(label="View current case", command=self.view)
        fileMenu.add_command(label="OK Process", command=self.OK)        

    def view(self):
        self.pack(fill=BOTH, expand=1)
        self.var = IntVar()
        Tkinter.Label(self,text="RMA", relief=Tkinter.RIDGE).grid(row=0, column=0, sticky=Tkinter.W)
        Tkinter.Label(self, text="SN", relief=Tkinter.RIDGE).grid(row=0, column=1, sticky=Tkinter.W)

    def OK(self):
        self.pack(fill=BOTH, expand=1)
        self.var = IntVar()

        Tkinter.Label(self,text="RMA").grid(row=0)
        Tkinter.Label(self, text="SN").grid(row=1)
        Tkinter.Entry(self, width=50).grid(row=0, column=1,pady=4)
        Tkinter.Entry(self, width=50).grid(row=1, column=1,pady=4)

def main():

    root = Tk()
    root.geometry("1280x720")
    app = App(root)
    root.mainloop()  

if __name__ == '__main__':
    main() 

Upvotes: 0

Views: 1822

Answers (1)

furas
furas

Reputation: 143098

Use grid_forget() to hide elements.

You can add elements in new Frame and then you will have to use grid_forget() only for this frame.

You can even create all widgets at the beginning and then use grid_forget() to hide and grid(...) to show again.


EDIT:

import Tkinter
from Tkinter import Tk, Frame, Menu
from Tkinter import IntVar, BOTH
class App(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)            
        self.parent = parent        
        self.initUI()

    def initUI(self):      
        self.parent.title("Test")        
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)        
        fileMenu = Menu(menubar)     
        menubar.add_cascade(label="Discrepancy", menu=fileMenu)
        fileMenu.add_command(label="View current case", command=self.view)
        fileMenu.add_command(label="OK Process", command=self.OK)

        self.var = IntVar()

        self.view_label1 = Tkinter.Label(self, text="RMA", relief=Tkinter.RIDGE)
        self.view_label2 = Tkinter.Label(self, text="SN", relief=Tkinter.RIDGE)

        self.ok_label1 = Tkinter.Label(self,text="RMA")
        self.ok_label2 = Tkinter.Label(self, text="SN")

        self.ok_entry1 = Tkinter.Entry(self, width=50)
        self.ok_entry2 = Tkinter.Entry(self, width=50)

        self.pack(fill=BOTH, expand=1)

    def view(self):
        self.ok_label1.grid_forget()
        self.ok_label2.grid_forget()
        self.ok_entry1.grid_forget()
        self.ok_entry2.grid_forget()

        self.view_label1.grid(row=0, column=0, sticky=Tkinter.W)
        self.view_label2.grid(row=0, column=1, sticky=Tkinter.W)

    def OK(self):
        self.view_label1.grid_forget()
        self.view_label2.grid_forget()

        self.ok_label1.grid(row=0)
        self.ok_label2.grid(row=1)
        self.ok_entry1.grid(row=0, column=1, pady=4)
        self.ok_entry2.grid(row=1, column=1, pady=4)

def main():

    root = Tk()
    root.geometry("1280x720")
    app = App(root)
    root.mainloop()

if __name__ == '__main__':
    main() 

EDIT: with Frame

import Tkinter
from Tkinter import Tk, Frame, Menu
from Tkinter import IntVar, BOTH
class App(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)            
        self.parent = parent        
        self.initUI()

    def initUI(self):      
        self.parent.title("Test")        
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)        
        fileMenu = Menu(menubar)     
        menubar.add_cascade(label="Discrepancy", menu=fileMenu)
        fileMenu.add_command(label="View current case", command=self.view)
        fileMenu.add_command(label="OK Process", command=self.OK)

        self.var = IntVar()

        self.frame_view = Frame(self)
        self.view_label1 = Tkinter.Label(self.frame_view, text="RMA", relief=Tkinter.RIDGE)
        self.view_label2 = Tkinter.Label(self.frame_view, text="SN", relief=Tkinter.RIDGE)
        self.view_label1.grid(row=0, column=0, sticky=Tkinter.W)
        self.view_label2.grid(row=0, column=1, sticky=Tkinter.W)
        #self.frame_view.pack(fill=BOTH, expand=1)

        self.frame_ok = Frame(self)
        self.ok_label1 = Tkinter.Label(self.frame_ok, text="RMA")
        self.ok_label2 = Tkinter.Label(self.frame_ok, text="SN")
        self.ok_entry1 = Tkinter.Entry(self.frame_ok, width=50)
        self.ok_entry2 = Tkinter.Entry(self.frame_ok, width=50)
        self.ok_label1.grid(row=0)
        self.ok_label2.grid(row=1)
        self.ok_entry1.grid(row=0, column=1, pady=4)
        self.ok_entry2.grid(row=1, column=1, pady=4)
        #self.frame_ok.pack(fill=BOTH, expand=1)

        self.pack(fill=BOTH, expand=1)

    def view(self):
        self.frame_ok.grid_forget()

        self.frame_view.grid()

    def OK(self):
        self.frame_view.grid_forget()

        self.frame_ok.grid()


def main():

    root = Tk()
    root.geometry("1280x720")
    app = App(root)
    root.mainloop()

if __name__ == '__main__':
    main() 

Upvotes: 1

Related Questions