Reputation: 33
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
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