Пытаясь найти способ заставить Tkinter Listbox иметь кнопку, которая удаляет соответствующий элемент в массиве - PullRequest
0 голосов
/ 18 октября 2019

Во-первых, это довольно сложная для объяснения проблема, но я воспользуюсь ею.

Я создал массив с некоторыми 'items' ипоместили эти элементы из этого массива (используя цикл for, чтобы независимо от того, сколько элементов может быть в массиве, который он все еще работает) в список, где вы можете выбрать один из элементов, которые нужно удалить. Однако, поскольку я использовал цикл for, элементы в списке не имеют номера, который я могу связать с ними, и поэтому я не могу удалить один элемент, который хочу.

Ниже приведен код, которым я являюсьиспользуя в данный момент:

from tkinter import *
import tkinter.messagebox as box
global num
num = 1

inventorylist = ["Item1","Item2","Item3","Item4"]

def remove():
   global i
   del inventorylist[i]
   situation_I()


def situation_IR():
   global num
   if num == 1:
       windowi.destroy()
       num = 2

   global windowir
   windowir = Tk()
   windowir.title( "IR" )

   listframe = Frame( windowir )
   listbox = Listbox( listframe )

   global i

   for i in range(len(inventorylist)):
       e = i+1
       listbox.insert(e, inventorylist[i])


   btn_ir_1 = Button( listframe, text = "Remove", command = remove )
   btn_ir_1.pack(side = RIGHT, padx = 5)

   listbox.pack(side = LEFT)

   listframe.pack(padx = 30, pady = 30)


   windowir.mainloop


def situation_I():
   global num

   if num == 2:
       windowir.destroy()
       num = 1

   global windowi
   windowi = Tk()
   windowi.title( "I" )

   Btn_i = Button( windowi, text = "Remove item", command = situation_IR )
   Btn_i.grid( row = 61, column = 76, columnspan = 50 )

   Label_i = Label( windowi, relief = "groove", width = 50 )
   Label_i.grid( row = 1, column = 76, rowspan = 50, columnspan = 100, padx = ( 10, 10 ) )

   all_lines = []

   for i in range(0, len(inventorylist), 3):
       line = ", ".join(inventorylist[i:i+3])
       all_lines.append(line)

   words = ",\n".join(all_lines)

   Label_i.configure( text = words )


   windowi.mainloop()



situation_I()

В данный момент он просто удаляет последний элемент в массиве, несмотря ни на что.

1 Ответ

0 голосов
/ 18 октября 2019

Это должно работать, используйте curselection(), чтобы найти индекс выбранного элемента, код приведен ниже, и я надеюсь, что это решит вашу проблему.

import tkinter as tk

class Root(tk.Tk):
    list = ['Item1', 'Item2', 'Item3', 'Item4']
    def __init__(self):
        super().__init__()
        box = tk.Listbox(self)
        btn = tk.Button(self, text = 'Remove', command = lambda: self.rmv(box))
        for item in Root.list: box.insert(tk.END, item)
        box.pack(side = 'top')
        btn.pack(side = 'bottom')

    def rmv(self, *args):
        box, = args
        try:
            ind = box.curselection()[0]
            del Root.list[ind] #To delete values in the list too. 
            box.delete(ind)
        except:
            pass

if __name__ == '__main__':
    Root().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...