我创建了学生组织者,我添加的最后一项功能是从列表框中删除学生。如果我删除列表框中间的一些学生,则会出现此问题。它工作一次,然后我就不能删除取代已删除学生的学生。我认为它是索引的东西,但我无法确切地知道它是什么。 每次我在列表框中使用鼠标点击学生时,都会激活加载功能。
from tkinter import *
from tkinter import ttk
import sqlite3
from PIL import Image, ImageTk
import tkinter.filedialog
class StudentManager :
db_conn = 0
theCursor = 0
curr_student = 0
def setup_db(self):
self.db_conn = sqlite3.connect('student.db')
self.theCursor = self.db_conn.cursor()
try:
self.db_conn.execute("CREATE TABLE if not exists Students(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FName TEXT NOT NULL, LName TEXT NOT NULL, Telefon TEXT NOT NULL, Wiek TEXT NOT NULL, PName TEXT NOT NULL);")
self.db_conn.commit()
except sqlite3.OperationalError:
print("ERROR : Table not created")
def dodaj_student(self):
self.db_conn.execute("INSERT INTO Students (FName, LName, Telefon, Wiek, PName)" +
"VALUES ('" +
self.imie_value.get() + "', '" +
self.nazwisko_value.get() + "', '" +
self.telefon_value.get() + "', '" +
self.wiek_value.get() + "', '" +
self.imierodzica_value.get() + "')")
self.imie.delete(0, "end")
self.nazwisko.delete(0, "end")
self.telefon.delete(0, "end")
self.wiek.delete(0, "end")
self.imierodzica.delete(0, "end")
self.update_listbox()
def load_student(self, event=None):
lb_widget = event.widget
index = str(lb_widget.curselection()[0] + 1) #????
index2 = str(lb_widget.curselection()[0])
self.curr_student = index
self.curr_student2 = index2
try:
result = self.theCursor.execute("SELECT ID, FName, LName, Telefon, Wiek, PName FROM Students WHERE ID=" + index)
for row in result:
stud_id = row[0]
stud_fname = row[1]
stud_lname = row[2]
stud_telefon = row[3]
stud_wiek = row[4]
stud_pname = row[5]
self.imie_value.set(stud_fname)
self.nazwisko_value.set(stud_lname)
self.telefon_value.set(stud_telefon)
self.wiek_value.set(stud_wiek)
self.imierodzica_value.set(stud_pname)
except sqlite3.OperationalError:
print("The Table Doesn't Exist")
except:
print("2 : Couldn't Retrieve Data From Database")
def update_listbox(self):
self.list_box.delete(0, END)
try:
result = self.theCursor.execute("SELECT ID, FName, LName, Telefon, Wiek, PName FROM Students")
for row in result:
stud_id = row[0]
stud_fname = row[1]
stud_lname = row[2]
stud_telefon = row[3]
stud_wiek = row[4]
stud_pname = row[5]
self.list_box.insert(stud_id,
stud_fname + " " +
stud_lname + " " +
stud_telefon + " " +
stud_wiek + " " +
stud_pname)
except sqlite3.OperationalError:
print("The Table Doesn't Exist")
except:
print("1: Couldn't Retrieve Data From Database")
def delete_student(self):
try:
self.db_conn.execute("DELETE FROM Students WHERE ID=" + self.curr_student)
self.db_conn.commit()
except sqlite3.OperationalError:
print("Data couldn't be Deleted")
self.imie.delete(0, "end")
self.nazwisko.delete(0, "end")
self.telefon.delete(0, "end")
self.wiek.delete(0, "end")
self.imierodzica.delete(0, "end")
self.update_listbox()
def __init__(self, root):
self.window_is_open = False
self.notatnik_window = False
root.title("Student Manager")
root.geometry("340x480")
# ------ 1st Row ------
imie_label = Label(root, text="Imie")
imie_label.grid(row=0, column=0, padx=10, pady=10, sticky=W)
self.imie_value = StringVar(root, value="")
self.imie = ttk.Entry(root,
textvariable=self.imie_value)
self.imie.grid(row=0, column=1, padx=10, pady=10, sticky=W)
nazwisko_label = Label(root, text="Nazwisko")
nazwisko_label.grid(row=1, column=0, padx=10, pady=10, sticky=W)
self.nazwisko_value = StringVar(root, value="")
self.nazwisko = ttk.Entry(root,
textvariable=self.nazwisko_value)
self.nazwisko.grid(row=1, column=1, padx=10, pady=10, sticky=W)
telefon_label = Label(root, text="Telefon")
telefon_label.grid(row=2, column=0, padx=10, pady=10, sticky=W)
self.telefon_value = StringVar(root, value="")
self.telefon = ttk.Entry(root,
textvariable=self.telefon_value)
self.telefon.grid(row=2, column=1, padx=10, pady=10, sticky=W)
wiek_label = Label(root, text="Wiek")
wiek_label.grid(row=3, column=0, padx=10, pady=10, sticky=W)
self.wiek_value = StringVar(root, value="")
self.wiek = ttk.Entry(root,
textvariable=self.wiek_value)
self.wiek.grid(row=3, column=1, padx=10, pady=10, sticky=W)
imierodzica_label = Label(root, text="Imie rodzica")
imierodzica_label.grid(row=4, column=0, padx=10, pady=10, sticky=W)
self.imierodzica_value = StringVar(root, value="")
self.imierodzica = ttk.Entry(root,
textvariable=self.imierodzica_value)
self.imierodzica.grid(row=4, column=1, padx=10, pady=10, sticky=W)
self.submit_button = ttk.Button(root, width=23,
text="Dodaj",
command = lambda: self.dodaj_student())
self.submit_button.grid(row=5, column=0, padx=10, pady=10, sticky=W)
self.edit_button = ttk.Button(root, width=23,
text="Edytuj",
command = lambda: self.update_student())
self.edit_button.grid(row=5, column=1, padx=10, pady=10, sticky=W)
self.more_button = ttk.Button(root, width=23,
text="Wiecej",
command = lambda: self.more_student())
self.more_button.grid(row=6, column=0, padx=10, pady=10, sticky=W)
self.delete_button = ttk.Button(root, width=23,
text="Usun",
command = lambda: self.delete_student())
self.delete_button.grid(row=6, column=1, padx=10, pady=10, sticky=W)
scrollbar = Scrollbar(root)
self.list_box = Listbox(root)
self.list_box.bind('<<ListboxSelect>>', self.load_student)
self.list_box.insert(1, "Students Here")
self.list_box.grid(row=7, column=0, columnspan=5, padx=10, pady=10, sticky=W+E)
self.setup_db()
self.update_listbox()
root = Tk()
studManager = StudentManager(root)
root.mainloop()