Кнопка tkinter уничтожает фрейм и удаляет индекс из списка - PullRequest
0 голосов
/ 18 июня 2020

Я относительно новичок в tkinter, и я пытаюсь создать программу, чтобы показать стоимость акций. Я прошу пользователя ввести символ акции, который добавляется к списку акций и отображает некоторую информацию о запасе в кадре tkinter. Внутри фрейма у меня есть кнопка «Удалить запас», которую я хочу одновременно удалить из списка запасов и уничтожить этот фрейм. Вот мой соответствующий код:

current_stocks = []
stock_frames = []

def update(): #Update the Currently Displayed Frames
    print(stock_frames)
    for stock in current_stocks:
        list_index = current_stocks.index(stock)
        stock_frame = LabelFrame(root, text=stock, padx=5, pady=5)
        stock_frame.grid(row=list_index+1,column=0,columnspan=3)
        if stock_frame not in stock_frames:
            stock_frames.append(stock_frame)
        stock_info_lbl = Label(stock_frame, text=f'{stock} Current Price')
        stock_info_lbl.grid(row=0,column=0)
        graph_stock_btn = Button(stock_frame, text="Graph", command=graph_stock)
        graph_stock_btn.grid(row=0,column=1)
        remove_stock_btn = Button(stock_frame, text="Remove", command=lambda list_index=list_index: remove_stock(list_index))
        remove_stock_btn.grid(row=0,column=2)

def remove_stock(i): #Remove Stock From List and Destroy the Frame
    current_stocks.pop(i)
    stock_frames[i].destroy()
    stock_frames.pop(i)
    update()

Я передаю параметр индекса списка, чтобы удалить запас, потому что, насколько я могу видеть, позиция индекса current_stocks и stock_frames должна соответствовать одной и той же акции. Я пробовал использовать grid_forget () вместо destroy (), но это ничего не меняет. Я должен отметить, что пока у меня отображается только одна акция, я могу удалить ее совершенно нормально, однако, если я добавлю более одной акции, вещи начнут ломаться. Это заставляет меня думать, что ошибка как-то связана с этим:

    if stock_frame not in stock_frames:
        stock_frames.append(stock_frame)

Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 18 июня 2020

ваша интуиция верна относительно того, где находится ваш код проблемы c, он находится в if stock_frame not in stock_frames. Это всегда будет возвращать false, поскольку это сравнение объектов, и два LabelFrame не эквивалентны, даже если у них одинаковый текст.

Чтобы обойти это, вам нужно сравнить только имя в первом списке (current_stocks) и считайте само собой разумеющимся, что stock_frames имеет связанную запись, которую вы можете удалить.

более тщательным решением будет использование более ассоциативной структуры данных, такой как dict из stock_name --> tkinter_frame

Это будет выглядеть примерно так:

stocks = {
  "GE": None,  # A default case
  "SYM": tkinter.LabelFrame(...), # A populated value
  ...
}

, и вместо этого ваш метод удаления будет работать с этим словарем:

def remove_stock(stock_name): #Remove Stock From List and Destroy the Frame
    stock_frame = stocks[stock_name]
    # stock_frame could be None
    if stock_frame:
        stock_frames[i].destroy()
    del stocks[stock_name]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...