Убрать предыдущие ВИДЖЕТЫ при выборе опций из Menubar в TKINTER - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть строка меню, которая имеет 2 варианта

[1] ДОБАВИТЬ ДАННЫЕ

[2] ОБНОВЛЕНИЕ ДАННЫХ

Когда я выбираю опцию, виджеты загружаются в окно. Когда я выбираю другой вариант после этого, предыдущие виджеты остаются, а новые виджеты перекрываются. Как мне сохранить окно и уничтожить существующие виджеты над ним. Я не прикрепил исходный код к другим параметрам меню из-за его размера, однако фрагмент кода повторяет реальный сценарий.

Я пытался destroy () exit () и вызов функции снова

from tkinter import *
root = None
data = None
def _add(dt):
      global data
      data = dt
      print(data, 'ADDED')

def _edit(new_dt):
      global data
      data = new_dt
      print('UPDATED')
      print("DATA =", data)

def cust_add():
      global root
      global data
      lbl = Label(root,text="ADD NAME:")
      ent = Entry(root)
      btn = Button(root, text='ADD', command=lambda: _add(ent.get()))
      lbl.pack()
      ent.pack()
      btn.pack()

def cust_edit():
      global root
      global data
      lbl = Label(root, text="UPDATE NAME:")
      ent = Entry(root)
      btn = Button(root, text="UPDATE", command=lambda: _edit(ent.get()))
      lbl.pack()
      ent.pack()
      btn.pack()


def homepage():
      global root
      root = Tk()
      root.geometry('300x400')
      root.title('CAR  FLEET  MANAGEMENT  SYSTEM')
      back_image = PhotoImage(file='icons/background3.png')
      back_label = Label(root, image=back_image)
      back_label.place(x=0, y=0, relwidth=1, relheight=1)
      menus = Menu()
      cst = Menu(menus, tearoff=FALSE)
      cst.add_command(label="Add New Customer", command=cust_add)
      cst.add_command(label="Change Customer Details", command=cust_edit)
      menus.add_cascade(label='CUSTOMERS', menu=cst)
      root.config(menu=menus)
      root.mainloop()
homepage()

1 Ответ

0 голосов
/ 01 ноября 2019

Если я правильно понимаю, что вы хотите правильно. Вероятно, лучше создать два фрейма для Add Customer и Update Customer. Затем покажите и скройте их по мере необходимости. Таким образом, виджеты создаются один раз и используются по мере необходимости. Я пытался изменить ваш код как можно меньше.

Я использовал grid и grid_remove, чтобы скрыть и показать. Я не смог найти pack_remove. Редактировать: Ниже изменено использование pack_forget (), которое в этом простом случае работает нормально.

import tkinter as tk

root = None
data = None
def _add(dt):
    global data
    data = dt
    print(data, 'ADDED')

def _edit(new_dt):
    global data
    data = new_dt
    print('UPDATED')
    print("DATA =", data)

def homepage():
    global root

    def cust_edit():
        # c_add.grid_remove()    Old grid version replaced by pack version
        # c_upd.grid()            
        c_add.pack_forget()       # Hide Add Customer
        c_upd.pack()              # Show Update Customer

    def cust_add():
        # c_upd.grid_remove()     # Grid version removed.
        # c_add.grid()            
        c_upd.pack_forget()       # Hide Update Customer
        c_add.pack()              # Show Add Customer    

    root = tk.Tk()
    root.geometry('300x400')
    root.title('CAR  FLEET  MANAGEMENT  SYSTEM')

    c_add = tk.Frame(root)
    tk.Label(c_add,text="ADD NAME:").pack()
    a_ent = tk.Entry(c_add)
    a_btn = tk.Button(c_add, text='ADD', command=lambda: _add(a_ent.get()))
    a_ent.pack()
    a_btn.pack()

    c_upd = tk.Frame(root)
    tk.Label(c_upd,text="UPDATE NAME:").pack()
    u_ent = tk.Entry(c_upd)
    u_btn = tk.Button(c_upd, text='UPDATE', command=lambda: _edit(u_ent.get()))
    u_ent.pack()
    u_btn.pack()

    menus = tk.Menu()
    cst = tk.Menu(menus, tearoff=tk.FALSE)
    cst.add_command(label="Add New Customer", command=cust_add)
    cst.add_command(label="Change Customer Details", command=cust_edit)
    menus.add_cascade(label='CUSTOMERS', menu=cst)
    root.config(menu=menus)
    root.mainloop()
homepage()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...