Search code examples
pythonpython-3.xtkintertk-toolkit

How to display the label ( text) value dynamically based on combo box selection value ( List box) in Tkinter?


I am new to tkinter application. The below code is working fine. Please help how to implement mentioned features.

  1. The dynamic value should be displayed above clear button or below the combo box ( Used pack is bottom )- Now working

  2. Clear the label value on combo box selection.

     import tkinter as tk
     from tkinter import ttk
     from tkinter import *
     from datetime import datetime
     # root window
     root = tk.Tk()
     root.geometry("500x350")
     root.resizable(False, False)
     root.title('Test')
     # Log Generator in frame
     Generator = tk.Frame(root)
     Generator.pack(padx=10, pady=10, fill='x', expand=True)
    
     def clear():
         combo.set('')
    
     # Function to print the index of selected option
     # in Combobox
     def get_log_file_name(*arg):
         date_Value = datetime.now().strftime("%Y_%m_%d_%I%M%S")
         output_file_name_value = "Log_"+date_Value
         if var.get() == "apple":
                 Label(Generator, text="The value at index: "+output_file_name_value+".txt", font=('Helvetica 12')).pack()
         else:
                 Label(Generator, text="The value at index: "+output_file_name_value+".html", font=('Helvetica 12')).pack()
    
     # Define Tuple of months
     months = ('apple','banana')
    
     # Create a Combobox widget
    
     label = ttk.Label(Generator, text="Selection_Option:",font=('Helvetica', 10, 'bold'))
     label.pack(fill='x', expand=True)
     var = StringVar()
     combo = ttk.Combobox(Generator, textvariable=var)
     combo['values'] = months
     combo['state'] = 'readonly'
     combo.pack(padx=5, pady=5)
    
     # Set the tracing for the given variable
     var.trace('w', get_log_file_name)
    
     # Create a button to clear the selected combobox 
     # text value
     button = Button(Generator, text="Clear", command=clear)
     button.pack(side=left)
    
     # Make infinite loop for displaying app on 
     # the screen
     Generator.mainloop()
    

enter image description here


Solution

  • The dynamic value should be displayed above clear button

    The second label could be outside of get_log_file_name() function.

    And also configure inside function. So you don't do duplicate Label widget, naming Label2

    Also the pack() must be split to prevent an error.

    To clear Label2 use .configure(text='')

    We will be using ttk. So don't do this from tkinter import *

    Code:

    import tkinter as tk
    from tkinter import ttk
    from datetime import datetime
    
    
    root = tk.Tk()
    root.geometry("500x350")
    root.resizable(False, False)
    root.title('Test')
     
    Generator = tk.Frame(root)
    Generator.pack(padx=10, pady=10, fill='x', expand=True)
    
    def clear():
        label2.configure(text='')
    
     
    def get_log_file_name(*arg):
        date_Value = datetime.now().strftime("%Y_%m_%d_%I%M%S")
        output_file_name_value = "Log_"+date_Value
        if var.get() == "apple":
            label2.configure(text="The value at index: "+output_file_name_value+".txt", font=('Helvetica 12')) 
        else:
            label2.configure(text="The value at index: "+output_file_name_value+".html", font=('Helvetica 12'))
    
    # Define Tuple of months
    months = ('apple','banana')
    
    # Create a Combobox widget
    label2 = ttk.Label(Generator)
    label2.pack()
    
    label = ttk.Label(Generator, text="Selection_Option:",font=('Helvetica', 10, 'bold'))
    label.pack(fill='x', expand=True)
    
    var = tk.StringVar()
    combo = ttk.Combobox(Generator, textvariable=var)
    combo['values'] = months
    combo['state'] = 'readonly'
    combo.pack(padx=5, pady=5)
    
    # Set the tracing for the given variable
    var.trace('w', get_log_file_name)
    
    # Create a button to clear the selected combobox 
    # text value
    button = ttk.Button(Generator, text="Clear", command=clear)
    button.pack(side='left')
    
    # Make infinite loop for displaying app on 
    # the screen
    Generator.mainloop()
    

    Screenshot for apple:

    enter image description here

    Screenshot for banana:

    enter image description here

    Screenshot to clear Label2:

    enter image description here