Python Tkinter — удаление элемента из списка, когда я не знаю его индекса

#python #tkinter

#python #tkinter

Вопрос:

Я новичок в python, и в настоящее время я изучаю циклы в Tkinter и пытаюсь создать графический интерфейс pin-кода. Я хочу, чтобы при нажатии кнопки пробела назад «<» последний элемент, добавленный в список «Введенный PIN-код», удалялся, а 1 звездочка удалялась из TxtWindow? Мне интересно, есть ли в python какой-то особый способ удалить последний элемент, добавленный в список, когда я не знаю, сколько элементов будет в списке. Заранее спасибо, мой код приведен ниже

 import tkinter as tk
window = tk.Tk()
def PinEntry(x):
    global u
    global counter
    if u == 1:
        TxtWindow.delete("1.0", "end")
        u =  u 1
    if EntertedPin == DefaultPin:
            window.destroy()  
    if x in range (len(EntryKeyList)):
        EntertedPin.append (EntryKeyList [x])
        TxtWindow.insert (tk.END, "*")
        counter = counter  1
        
        if x == 2:
            EntertedPin.clear()
            TxtWindow.delete("1.0", "end")
            TxtWindow.insert (tk.END, "Enter Pin")
            u = 1
            coutner = 0
        if x == 0:
            EntertedPin.clear()
            TxtWindow.delete("1.0", "end")
            TxtWindow.insert (tk.END, "Enter Pin")
            u = 1
            counter = 0
        
        if x == 12:
            # Delete last number in the list and remove one asterix from the TxtWindow
        
        
EntertedPin = []
DefaultPin = [1,2,3,0]
u = 1
counter = -1
TxtWindow = tk.Text(window, relief = "sunken", width = 10, height = 1)
TxtWindow.insert (tk.END, "Enter Pin")
TxtWindow.grid (row = 1, column = 2)
x = 1
y = 1
a = 5
b = 4
c = 1
d = 3
e = 1
f = 2
g = 1
EntryKeyList = ["CLR", 0, "ENT", 1, 2, 3, 4, 5, 6, 7, 8, 9, "<" ]
for i in range (13):
    KeypadBtn = tk.Button(window, width = 5, height = 3, text = EntryKeyList[i], command = lambda x=i: PinEntry(x))
    if y <=3:
        KeypadBtn.grid  (row = a , column = x )
        x = x  1
        y=y  1
    elif y <= 6:
        KeypadBtn.grid  (row = b , column = c )
        c = c  1
        y=y 1
    elif y <= 9:
        KeypadBtn.grid  (row = d , column = e )
        e = e  1
        y=y 1


  elif y <=12:
        KeypadBtn.grid  (row = f , column = g )
        g = g  1
        y=y 1
    else:
        KeypadBtn.grid (row = 1, column = 3)
        
window.mainloop()
 

Комментарии:

1. Используется EntertedPin.pop() для удаления последнего элемента из списка.

2. Лучше использовать Entry или Label вместо Text для отображения вывода и связать StringVar с ним (например pin ). Затем вы можете обновить его, pin.set("*"*len(EntertedPin)) если PIN-код не пуст, в противном pin.set("Enter Pin") случае.

Ответ №1:

Команды, которые вы ищете

 TxtWindow.delete("end-2c", "end")
mylist=mylist[:-1] or mylist.pop()
 

Но код неверен. Пробел не может добавить «x» в виджет.

 def PinEntry(x):
    global u
    global counter
    global EntertedPin
    global DefaultPin
    
    if u == 1:
        TxtWindow.delete("1.0", "end")
        u =  u 1
    
    
    if x in range (len(EntryKeyList)):        
        
        if x == 12:
            # Delete last number in the list and remove one asterix from the TxtWindow
            EntertedPin=EntertedPin[:-1]            
            TxtWindow.delete("end-2c", "end")
        
        # If the button is not number:
        else: 
            if x == 2:
                EntertedPin.clear()
                TxtWindow.delete("1.0", "end")
                TxtWindow.insert (tk.END, "Enter Pin")
                u = 1
                coutner = 0
            
            
            elif x == 0:
                EntertedPin.clear()
                TxtWindow.delete("1.0", "end")
                TxtWindow.insert (tk.END, "Enter Pin")
                u = 1
                counter = 0
            EntertedPin.append (EntryKeyList [x])
            TxtWindow.insert (tk.END, "*")
            counter = counter  1
    
    if EntertedPin == DefaultPin:
            window.destroy()  
 

Комментарии:

1. Вместо того чтобы копировать список, почему бы просто не позвонить mylist.pop() ?

2. Я часто использую индексацию, так что это моя привычка. Возможно, pop() лучше и элегантнее для этой задачи.