Skip to content Skip to sidebar Skip to footer

Values Entered In The Dynamic Table (entry Widget Table) Is Not Appended In The List

Target of code is: create 8 row and 'n' column table [n =1,2,3 ...n] and get the inputs entered in table cells. Use it for further calculation Problem : The below code, i have used

Solution 1:

You did not return anything from EntryRow() function, so columns.append(EntryRow(...)) will append None to columns.

I have modified EntryRow() and extract_data() functions to use list to store those entries as below:

defEntryRow(left_wl, counter, dx):
    # use list to hold the Entry widgets
    entries = []
    for y in (130, 160, 220, 250, 310, 340, 370):
        entry = tk.Entry(left_wl)
        entry.place(x=dx, y=y)
        entries.append(entry)
    # return the list of Entriesreturn entries
defextract_data(columns):
    for row in columns:
        # pick the format you like more
        data_list.append(tuple(x.get() for x in row))
        data_dict[row[0].get()] = tuple(x.get() for x in row[1:])
        print(data_list)
        print(data_dict)

If you still prefer using something like row.entry_box_1.get(), just modify EntryRow() function as below:

from types import SimpleNamespace
...

defEntryRow(left_w1, counter, dx):
    row = SimpleNamespace()

    row.entry_box_1 = tk.Entry(left_wl)
    row.entry_box_2 = tk.Entry(left_wl)
    row.entry_box_3 = tk.Entry(left_wl)
    row.entry_box_4 = tk.Entry(left_wl)
    row.entry_box_5 = tk.Entry(left_wl)
    row.entry_box_6 = tk.Entry(left_wl)
    row.entry_box_7 = tk.Entry(left_wl)

    row.entry_box_1.place(x=dx, y=130)
    row.entry_box_2.place(x=dx, y=160)
    row.entry_box_3.place(x=dx, y=220)
    row.entry_box_4.place(x=dx, y=250)
    row.entry_box_5.place(x=dx, y=310)
    row.entry_box_6.place(x=dx, y=340)
    row.entry_box_7.place(x=dx, y=370)

    return row

And don't need to change extract_data().

Solution 2:

What you are trying to do would lend itself more to using the grid geometry manager instead of the placer geometry manager like you did.

Here's what it could look like:

import tkinter as tk
import tkinter.ttk as ttk

row_requester_window = tk.Tk()
row_requester_window.title('Table entry information')
row_requester_bg = ttk.Frame(row_requester_window, padding='15')
row_requester_bg.grid(column=0, row=0)

row_amount_question = ttk.Label(row_requester_bg, text='Please provide the number of rows needed:')
row_amount_question.grid(column=0, row=0, pady=15)

row_amount_value = tk.IntVar()
row_amount_answer = ttk.Entry(row_requester_bg, textvariable=row_amount_value, width=4)
row_amount_answer.grid(column=1, row=0)

row_amount_needed = 0defselect_nb_rows():
    global row_amount_needed
    row_amount_needed = row_amount_value.get()
    row_requester_window.destroy()

row_amount_decided = ttk.Button(row_requester_bg, text='OK', command=select_nb_rows)
row_amount_decided.grid(column=0, columnspan=2, row=1)

row_requester_window.mainloop()

table_window = tk.Tk()
table_window.title('Enter your data')
table_bg = ttk.Frame(table_window, padding='5')
table_bg.grid(column=0, row=1)

row_label_titles = 'ABCDEFGHIJ'
row_labels = [ttk.Label(table_bg, text=letter, width=3) for letter in row_label_titles]
for (current_row, current_label) inenumerate(row_labels, start=1):
    current_label.grid(column=0, row=current_row)

column_titles = [ttk.Label(table_bg, text=f'{number + 1}', width=18) for number inrange(row_amount_needed)]
for (current_column, current_label) inenumerate(column_titles, start=1):
    current_label.grid(column=current_column, row=0, pady=5)

entries_values = [
    [tk.StringVar() for _ inrange(row_amount_needed)]
    for _ inrange(10)
]
entries_rows = [
    [ttk.Entry(table_bg, width=18, textvariable=current_variable) for current_variable in current_row]
    for current_row in entries_values
]
for (current_row_nb, current_row) inenumerate(entries_rows, start=1):
    for (current_column_nb, current_entry) inenumerate(current_row, start=1):
        current_entry.grid(column=current_column_nb, row=current_row_nb)

table_window.mainloop()

print('Grid content:')
print(
    [
        [current_value.get() for current_value in current_row]
        for current_row in entries_values
    ]
)

Post a Comment for "Values Entered In The Dynamic Table (entry Widget Table) Is Not Appended In The List"