Заранее спасибо за помощь.
Я создаю GUI, и одна его часть поставила меня в тупик - я создаю Combobox, используя Tkinter, и значения взяты из файла CSV - тогда я разрешаю пользователь выбирает одно из имен и удаляет этого человека, и это приводит к тому, что строка для этого пользователя в CSV-файле удаляется, а выпадающий список обновляется только для оставшихся пользователей - эта часть работает нормально - моя проблема возникает, когда я go удалить второго пользователя - мое значение get для Combobox всегда остается значением первого пользователя.
Я нуб python, которого вы быстро определите по моему коду, но я не смог найти решение того, что я делаю неправильно, которое, я уверен, очень простое.
Вот CSV-файл, из которого я читаю:
id,name,username,password,val1,val2
1,Billy,bsmith,GoodPassword,JZ4Z3ATP6,Test1
2,Amanda,asmith,GoodPassword1,NRROAZ6JP6,Test2
3,Sammy,ssmith,GoodPassword2,NRRZ3ATP6,Test3
Мой python код находится здесь:
from tkinter import *
from tkinter import ttk
import tkinter as tk
from tkinter import messagebox as msg
import os.path
from csv import reader, writer
import csv
import shutil
root = Tk()
root.title('Why am I an idiot')
labelFrame3 = ttk.LabelFrame(text = "Delete Button")
labelFrame3.grid(column = 0, row = 2, padx = 20, pady = 20)
def clicking(event):
to_delete = delete_combo.get()
print("CLICKING")
print(to_delete)
def read_connections_file(conns_dict):
conns = conns_dict
with open('file.csv', 'r') as read_obj:
csv_reader = reader(read_obj)
header = next(csv_reader)
# Check file as empty
if header != None:
# Iterate over each row after the header in the csv
for row in csv_reader:
# row variable is a list that represents a row in csv
conns[row[0]] = {'name':row[1], 'username':row[2], 'password':row[3], 'val1':row[4], 'val2':row[5]}
def get_button_names():
conns = {}
button_names = []
read_connections_file(conns)
for i in conns:
name_ = conns[i]["name"]
button_names.append(name_)
return button_names
buttons1 = get_button_names()
delete_combo = ttk.Combobox(labelFrame3, value=buttons1)
delete_combo.bind("<<ComboboxSelected>>", clicking)
delete_combo.grid(row=0, column=1, columnspan=3, padx=10, pady=10)
def clicking(event):
to_delete = delete_combo.get()
print("CLICKING")
print(to_delete)
def create_delete_dropdown():
buttons2 = get_button_names()
print(buttons2)
delete_combo = ttk.Combobox(labelFrame3, value=buttons2)
delete_combo.bind("<<ComboboxSelected>>", clicking)
delete_combo.grid(row=0, column=1, columnspan=3, padx=10, pady=10)
print("FUNC")
help = delete_combo.get()
print(help)
def delete_saved_button():
original = r'file.csv'
target = r'file.bak'
shutil.copyfile(original, target)
to_delete = delete_combo.get()
print(to_delete)
answer = msg.askyesno("Delete Button", ("Are you sure you want to Delete " + to_delete + "?"))
if answer == True:
conns = []
with open('file.csv', 'r') as read_obj:
csv_reader = reader(read_obj)
header = next(csv_reader)
# Check file as empty
if header != None:
# Iterate over each row after the header in the csv
for row in csv_reader:
# row variable is a list that represents a row in csv
conns.append({'id':row[0],'name':row[1], 'username':row[2], 'password':row[3], 'val1':row[4], 'val2':row[5]})
new_list = None
for item in conns:
if item['name'] == to_delete:
new_list = item
break
new_cons = conns.copy()
new_cons.remove(new_list)
i = 1
for d in new_cons:
d['id'] = i
i += 1
msg.showinfo("Button Deleted", (to_delete + " Button Deleted"))
csv_file_name = "file.csv"
with open(csv_file_name, 'w', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=header)
writer.writeheader()
for data in new_cons:
writer.writerow(data)
create_delete_dropdown()
# LabelFrame 3 Content
delete_label = ttk.Label(labelFrame3, text = "Delete Who?: ")
delete_label.grid(row=0, column=0)
deleteButton = tk.Button(master=labelFrame3, text="Delete", command=delete_saved_button)
deleteButton.grid(row=1, column=0)
root.mainloop()
Я оставил несколько утверждений для печати, чтобы попытаться помочь мне понять, что я делаю неправильно.
Если я сначала удалю Билли, он будет удален из CSV и выпадающего списка, который я s замечательно.
Если я затем выберу Аманду и попытаюсь удалить ее вторую, я получу ошибку - мой вывод из этой последовательности, включая мои операторы печати:
CLICKING
Billy
Billy
['Amanda', 'Sammy']
FUNC
CLICKING
Billy
Billy
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\reeno\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File ".\fucked.py", line 90, in delete_saved_button
new_cons.remove(new_list)
ValueError: list.remove(x): x not in list
Вот сценарий запустите:
![Gif Running Script](https://i.stack.imgur.com/73cFZ.gif)
Буду признателен, если вы сможете сообщить, что я делаю неправильно, или указать мне ресурс, который может дать мне ответ.
Помните, что я новичок, но я также хотел бы получить любые предложения по улучшению моего кода в целом.
Спасибо за вашу помощь !!