Окно tkinter динамически добавляет или удаляет строки виджетов ввода в зависимости от количества, указанного пользователем, обновляя после команды кнопки функцию. Функция отслеживает новое количество указанных строк по сравнению со старым числом и будет добавлять или вычитать строки в зависимости от нового указанного числа. Функция добавит строки снизу вниз, оставив все текущие строки виджета нетронутыми со значениями, если новое количество строк больше, чем старое количество строк. И наоборот, функция удалит строки снизу вверх, оставив все текущие строки виджета нетронутыми со значениями, если новое количество строк меньше старого. Код работает так, как ожидалось. Проблема в том, что при добавлении или вычитании строк в результирующем окне отображается только самая верхняя строка с виджетом ввода для указанного количества строк и кнопки, строки виджетов ввода и их значения не отображаются, если окно не свернуто, а затем развернуто. . После этого все выглядит как должно. Я добавил операторframe1.update() в цикл уничтожения виджета, но это не оказало никакого влияния. Любые предложения будут оценены по достоинству. Спасибо.
from tkinter import*
root = Tk()
def get_row_num(): # Add/remove rows
global num_rows_old
num_rows_new = int(nobs.get())
if num_rows_new - num_rows_old > 0:
for i in range(num_rows_old,num_rows_new):
# Add Frame 1 rows
#Frame 1 labels
label1 = Label(frame1, text='Column #1',pady=2)
label1.grid(row= 2, column=1)
label2 = Label(frame1, text='Column #2',pady=2)
label2.grid(row= 2, column=2)
#Frame row number label 1
label3 = Label(frame1, text=f'# {i+1}',pady=2)
label3.grid(row= 3+i, column=0)
#Frame 1 entry widgets
value1 = Entry(frame1,width=10)
value2 = Entry(frame1,width=10)
#Frame 1 grid locations
value1= value1.grid(row=i+3, column = 1)
value2 = value2.grid(row=i+3, column = 2)
else:
# Remove all Frame 1 rows including column headers
max_row,max_col = frame1.grid_size()
if num_rows_new < 1:
for row_count in range(num_rows_new, max_row):
for widget in frame1.grid_slaves(row =row_count+2):
widget.destroy()
else:
# Remove unused Frame 1 rows
for row_count in range(num_rows_new, max_row):
for widget in frame1.grid_slaves(row =row_count+3):
widget.destroy()
frame1.update() # Does not work
num_rows_old = num_rows_new # redfine new row num to old
# Row Number GUI
root.geometry("400x300")
frame1=Label(root, text='',padx=10, pady=10)
frame1.grid(row=3, column=0)
#Frame 1 Labels
label1 = Label(frame1, text='No of Rows = ',pady=2)
label1.grid(row=1, column=1)
#Frame 1 Entry widgets
nobs = Entry(frame1,width=10)
nobs.insert(0, int("0")) # Prefill No. of rows
#Frame 1 Grid location
nobs.grid(row=1, column = 2, padx=10)
num_rows_old = 0 # Define initial row num value for use in function
# Button for adding/removing rows
my_Button = Button(frame1, text="Enter No.of Rows", command=get_row_num)
my_Button.grid(row=1,column=3)
root.mainloop()
Подробнее здесь: https://stackoverflow.com/questions/791 ... ize-window
Tkinter не будет обновлять окно, если не свернуть/развернуть окно. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение