Python Forum
[Tkinter] Dynamically Deleting Widget
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Tkinter] Dynamically Deleting Widget
#1
Hi I am using Tkinter and creating Labels ad Combobox Dynamically based on a query result.

While running the query again, i need to delete the widget i created. but i am getting Name error.

Attaching the code kindly help please,

def ColumnName(event):
    for label in Column_Label:
#        print(label)
        exec(label+'.grid_remove()')
#        exec(combobox+'.grid_remove()')
    try:
        no_of_record_label.grid_remove()
        no_of_record.grid_remove()
        button_run.grid_remove() 
    except:
        print("error")
    server=server_text.get()
    Database=Db_Name.get()
    connStr = (
    r"DRIVER={SQL Server Native Client 11.0};"
    r"SERVER="+server+";"
    r"Database="+Database+";"
    
    r"Integrated Security=true;Trusted_Connection=yes;")
    tablename=table_Name.get()
    cnxn = pyodbc.connect(connStr, autocommit=True)
    query=("""select COLUMN_NAME
                        FROM INFORMATION_SCHEMA.COLUMNS
                        WHERE TABLE_NAME = N'"""+tablename+"'" )
    print(query)
    crsr = cnxn.execute(query)
    row_num=2
    column_num=0
    Variable_Number=1
#    Db_Name=ttk.Combobox(frame)
    
    
#    for i in range(1,variable_Number)
#    exec('global Mask_Category1')
    for row in crsr.fetchall():
        Column_Names.append(str(row[0]))
        print(type(row[0]))
        exec('global Mask_Category'+str(Variable_Number))
        Mask_Combobox.append('Mask_Category'+str(Variable_Number))   
        Column_Label.append('Column_Label'+str(Variable_Number))
        test='Column_Label'+str(Variable_Number)+' = tk.Label(frame,text="'+row[0]+'")'
        test1='Column_Label'+str(Variable_Number)+'.grid(row='+str(row_num)+',column='+str(column_num)+')'
        exec(test+';'+test1)
        test='Mask_Category'+str(Variable_Number)+'=ttk.Combobox(frame)'
        test1='Mask_Category'+str(Variable_Number)+'.grid(row='+str(row_num)+',column=2)'
        print(test)
        exec(test+';'+test1)
#        Db_Name.config(values=list1)
        options=['Name','SSN']
        exec('Mask_Category'+str(Variable_Number)+'.config(values=options)')
#       test eval(test1)
        row_num+=1
        Variable_Number+=1
    print(Column_Names)
    no_of_record_label=tk.Label(frame,text="No of Records")
    no_of_record=tk.Entry(frame)
    no_of_record_label.grid(row=row_num,column=1)
    no_of_record.grid(row=row_num,column=2)
    row_num+=1
    print(Mask_Combobox)
    print(Column_Label)
    button_run=tk.Button(frame,text="Create Data",command=Final)
    button_run.grid(row=row_num,column=1,columnspan=2)
#    root1.mainloop()
    root.update_idletasks()
import tkinter as tk
from tkinter import ttk
import pyodbc
root=tk.Tk()
frame=tk.Frame(root)
frame.pack()
Column_Names=[]
Mask_Combobox=[]
Column_Label=[]
server_label=tk.Label(frame,text="Server Name")
server_text=tk.Entry(frame)
Db_Name=ttk.Combobox(frame)
button=tk.Button(frame,text="Get DB Name",command=DBName)
server_label.grid(row=0,column=0)
server_text.grid(row=0,column=1)
Db_Name.grid(row=0,column=2)
button.grid(row=0,column=3)
Db_Name.bind("<<ComboboxSelected>>", TableName)
root.mainloop()
Reply
#2
first, it's very unsafe to use exec, it can be used to create access to users computer by a good hacker.
I'm not going to dig into your code, but a few pointers. give the widget a name, or create in a list so that you have access to it from all functions (or methods). use the delete statement

This looks to be a good writeup: https://www.delftstack.com/howto/python-...r-widgets/
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyQt] dynamically resize custom widget fill remaining space ironcthulhu 1 11,354 Dec-31-2019, 09:45 PM
Last Post: Denni
  [WxPython] Dynamically Sized Widget CanadaGuy 3 3,914 Nov-12-2018, 02:55 AM
Last Post: Larz60+

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020