Bonjour, mes frères,Ça fait longtemps!J'ai été trop occupé ces derniers temps,Donc encore une double fracture~
Cousin est presque diplômé de l'Université,Après un semestrePythonJe ne peux pas écrire sur le système de gestion des étudiants,C'est une honte pour moi,Lui apprendre et ne pas apprendre,Et laissez - moi lui écrire,J'ai envie de deux gifles,Il a fini par écrire pour lui,Qui a fait de lui mon cousin,Il faut quand même l'aider!
C'est fini. Mets - le là. , Alors Partagez - le aujourd'hui. !
Pas grand - chose à dire, Commençons tout de suite !
Importer d'abord les modules dont nous avons besoin
from main import MainPage
Page de connexion
Lier le tableau à l'objet instance
self.root = master
self.page Papier peint Afficher une zone rectangulaire sur l'écran,Plus souvent utilisé comme conteneur.
self.page = tk.Frame(self.root)
self.page.pack()
self.root.geometry("300x180")
tkinter Variables variables fournies ,Définir le nom d'utilisateur et le mot de passe.
self.username = tk.StringVar()
self.password = tk.StringVar()
Créer unlabel
Disposition de la grille
tk.Label(self.page).grid(row=0, column=0)
# textvariable Ce paramètre est tkinter Les variables de chaîne à l'intérieur sont liées à L'espace est lié
tk.Label(self.page, text="Comptes").grid(row=1, column=0, stick=tk.E, pady=10)
tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=tk.W, pady=10)
tk.Label(self.page, text="Mot de passe").grid(row=2, column=0, stick=tk.E, pady=10)
tk.Entry(self.page, textvariable=self.password).grid(row=2, column=1, stick=tk.W, pady=10)
command Accepter une fonction Exécuter la logique de connexion
tk.Button(self.page, text="Connexion", command=self.login_check).grid(row=3, column=0, stick=tk.W, pady=10)
tk.Button(self.page, text="Sortie", command=root.quit).grid(row=3, column=1, stick=tk.E, pady=10)
Vérifier la connexion
Obtenir le mot de passe du compte
name = self.username.get()
pwd = self.password.get()
Ne pas interroger la base de données
print(name, pwd)
if name == 'admin' and pwd == '123456':
tkinter.messagebox.showinfo(title='Félicitations',
message='Connexion réussie!')
Détruire le contenu de la page courante
self.page.destroy()
Détruire le contenu peint sur toute la page
self.root.destroy()
Changement de page
MainPage(self.root)
else:
tkinter.messagebox.showinfo(title='Erreur', message='Mauvais compte ou mot de passe')
Appelez cette méthode de fichier , Exécuter deux entrées dans ce fichier , Appeler les données avant d'exécuter cette méthode à l'extérieur .
Créer un objet,Objets de fenêtre,Afficher l'interface.
if __name__ == '__main__':
root = tk.Tk()
LoginPage(root)
root.mainloop()
Interface de connexion
def __init__(self, master):
self.root = master
self.page = tk.Frame(self.root)
self.page.pack()
self.root.geometry("%dx%d" % (600, 400))
self.create_page()
Créer un menu de haut niveau,Afficher le menu.
def create_page(self):
menubar = tk.Menu(self.root)
menubar.add_command(label="Entrée")
menubar.add_command(label="Requête")
menubar.add_command(label="Supprimer")
menubar.add_command(label="Modifier")
menubar.add_command(label="À propos de")
Trop de codes écrits ensemble ,Beaucoup de données,Facile à mal écrire,Le chaos, Vous pouvez écrire un fichier pour charger les données view.py
Inview.py Le fichier définit les classes pour chaque module
Entrée
class InputFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master):
# Re - parent
super().__init__(master)
pass
Requête
class QueryFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master=None):
super().__init__(master)
pass
Supprimer
class DeleteFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master=None):
super().__init__(master)
Modifier
class ChangeFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master=None):
super().__init__(master)
À propos de
class AboutFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.root = master
Et aprèsmain.py Lier ces données dans un fichier
self.input_page = InputFrame(self.root)
self.change_page = ChangeFrame(self.root)
self.query_page = QueryFrame(self.root)
self.delete_page = DeleteFrame(self.root)
self.about_page = AboutFrame(self.root)
Inview.pyDans le documentInputFrame Ajouter le contenu pertinent à la classe , Nom et notes .
self.root = master # Définir les variables internesroot
self.name = tk.StringVar()
self.math = tk.StringVar()
self.chinese = tk.StringVar()
self.english = tk.StringVar()
# Entrée
self.status = tk.StringVar()
# Appelezcreate_page()Fonctions
self.create_page()
Compilationcreate_page()Fonctions
def create_page(self):
# pass
# stick Direction de l'objet de contrôle tk.W Position occidentale
# pady padding y Largeur supérieure et inférieure
# row D'accord Disposition du tableau
tk.Label(self).grid(row=0, stick=tk.W, pady=10)
tk.Label(self, text='Nom de famille Nom: ').grid(row=1, stick=tk.W, pady=10)
# text variable Lier le contenu des données dans le contrôle
tk.Entry(self, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
tk.Label(self, text='Nombre Études: ').grid(row=2, stick=tk.W, pady=10)
tk.Entry(self, textvariable=self.math).grid(row=2, column=1, stick=tk.E)
tk.Label(self, text='Langue Texte: ').grid(row=3, stick=tk.W, pady=10)
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E)
tk.Label(self, text='Anglais Langue: ').grid(row=4, stick=tk.W, pady=10)
tk.Entry(self, textvariable=self.english).grid(row=4, column=1, stick=tk.E)
tk.Button(self, text='Entrée', command=self.recode_student).grid(row=5, column=1, stick=tk.E, pady=10)
tk.Label(self, textvariable=self.status).grid(row=6, column=1, stick=tk.E, pady=10)
Inmain.py Lier ces données
menubar.add_command(label="Entrée", command=self.show_input)
def show_input(self):
self.input_page.pack()
# pack_forget()Masquer la disposition
# self.change_page.pack_forget()
# self.query_page.pack_forget()
# self.delete_page.pack_forget()
# self.about_page.pack_forget()
Inview.py Saisie des données dans le fichier
def recode_student(self):
stu = {
'name': self.name.get(), 'chinese': self.chinese.get(),
'math': self.math.get(), 'english': self.english.get()}
# Rafraîchir la page après avoir cliqué sur Entrée
self.name.set('')
self.chinese.set('')
self.math.set('')
self.english.set('')
db.insert(stu)
self.status.set('Données soumises avec succès')
print(stu)
Insérer et enregistrer des données , Peut écrire un fichier pour enregistrer , Trop de code écrit ensemble , La probabilité d'erreur est également une majuscule db.pyDocumentation.
class StudentsDB:
def __init__(self):
self.students = []
def insert(self, student):
self.students.append(student)
db = StudentsDB()
if __name__ == '__main__':
print(db.students)
InQueryFrame() Classe ajouter des données
ttk.Treeview Vue arborescente,Baidu un moment
shows:
headings
tree
data_list
columns
La valeur est une liste. Chaque élément de la liste représente le nom d'un identificateur de colonne . La longueur de la liste est la longueur de la colonne .
SuccessionFrameCatégorie
class QueryFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
Définir les variables internesroot
self.root = master #
columns = ('name', 'chinese', 'math', 'english')
self.tree_view = ttk.Treeview(self, show='headings', columns=columns)
Chaque taille de données, chaque cellule
self.tree_view.column('name', width=80, anchor='center')
self.tree_view.column('chinese', width=80, anchor='center')
self.tree_view.column('math', width=80, anchor='center')
self.tree_view.column('english', width=80, anchor='center')
L'étiquette et headings
self.tree_view.heading('name', text='Nom')
self.tree_view.heading('chinese', text='Langues')
self.tree_view.heading('math', text='Mathématiques')
self.tree_view.heading('english', text='Anglais')
self.tree_view.pack(fill=tk.BOTH, expand=True)
tk.Button(self, text='Actualiser les données', command=self.show_data_frame).pack(anchor=tk.E, pady=5)
self.show_data_frame()
Actualiser les données,Afficher les données.
def show_data_frame(self):
# Supprimer l'ancienne phase
for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
pass
# Afficher d'abord toutes les données Indb Ajout de fichiers afficher le Code de données
students = db.all()
index = 0
for stu in students:
# print(stu)
self.tree_view.insert('', index + 1, values=(
stu['name'], stu['chinese'], stu['math'], stu['english'],
))
Afficher les données
Indb.pyChine
def all(self):
return self.students
view.py
Rafraîchir les données d'insertion
self.tree_view.insert('', index + 1, values=(
stu['name'], stu['chinese'], stu['math'], stu['english'],
))
Insérer une page de mise à jour après la mise à jour des données
Retour à unitemTous les enfants deitem,Ce fils.itemEst un formulaire de liste,SiitemNon spécifié, Renvoie la racine de item
for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
pass
Inmain.pyDonnées de liaison des fichiers
menubar.add_command(label="Requête", command=self.show_all)
def show_all(self):
# Masquer la disposition
self.input_page.pack_forget()
# self.change_page.pack_forget()
self.query_page.pack()
# self.delete_page.pack_forget()
# self.about_page.pack_forget()
InDeleteFrame() Classe ajouter des données
class DeleteFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master=None):
super().__init__(master)
self.root = master # Définir les variables internesroot
tk.Label(self, text='Supprimer les données').pack()
self.delete_frame = tk.Frame(self)
self.delete_frame.pack()
self.status = tk.StringVar()
self.username = tk.StringVar()
tk.Label(self.delete_frame, text=' Supprimer les informations par nom ').pack(anchor=tk.W, padx=20)
tk.Entry(self.delete_frame, textvariable=self.username).pack(side=tk.LEFT, padx=20, pady=5)
tk.Button(self.delete_frame, text='Supprimer', command=self._delete).pack()
tk.Label(self, textvariable=self.status).pack()
def _delete(self):
username = self.username.get()
flag, message = db.delete_by_name(username)
self.status.set(message)
Indb.py Ajouter une logique de suppression au fichier
def delete_by_name(self, name):
for student in self.students:
if name == student['name']:
self.students.remove(student)
return True, f'{
name} Suppression réussie'
return False, f'{
name} N'existe pas'
Inmain.pyDonnées de liaison
menubar.add_command(label="Supprimer", command=self.show_delete)
def show_delete(self):
self.input_page.pack_forget()
self.query_page.pack_forget()
self.delete_page.pack()
InChangeFrame() Classe ajouter des données
self.root = master # Définir les variables internesroot
tk.Label(self, text='Modifier l'interface').pack()
self.change_frame = tk.Frame(self)
self.change_frame.pack()
self.status = tk.StringVar()
self.name = tk.StringVar()
self.math = tk.StringVar()
self.chinese = tk.StringVar()
self.english = tk.StringVar()
tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=1)
tk.Label(self.change_frame, text='Nom de famille Nom: ').grid(row=1, stick=tk.W, pady=10)
tk.Entry(self.change_frame, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
tk.Label(self.change_frame, text='Nombre Études: ').grid(row=2, stick=tk.W, pady=10)
tk.Entry(self.change_frame, textvariable=self.math).grid(row=2, column=1, stick=tk.E)
tk.Label(self.change_frame, text='Langue Texte: ').grid(row=3, stick=tk.W, pady=10)
tk.Entry(self.change_frame, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E)
tk.Label(self.change_frame, text='Anglais Langue: ').grid(row=4, stick=tk.W, pady=10)
tk.Entry(self.change_frame, textvariable=self.english).grid(row=4, column=1, stick=tk.E)
tk.Button(self.change_frame, text='Requête', command=self._search).grid(row=6, column=0, stick=tk.W, pady=10)
tk.Button(self.change_frame, text='Modifier', command=self._change).grid(row=6, column=1, stick=tk.E, pady=10)
tk.Label(self.change_frame, textvariable=self.status).grid(row=7, column=1, stick=tk.E, pady=10)
db.py Logique des données de requête dans le fichier
def search_by_name(self, name):
for student in self.students:
if name == student['name']:
return True, student
return False, f'{
name} N'existe pas'
view.py Fichier Cliquez sur requête ,Afficher les données
def _search(self):
flag, info = db.search_by_name(self.name.get())
if flag:
self.name.set(info['name'])
self.chinese.set(info['chinese'])
self.math.set(info['math'])
self.english.set(info['english'])
self.status.set('Requête de données réussie')
else:
# Renvoie un message d'erreur directement
self.status.set(info)
db.py Mise à jour des fichiers logique des données
def update(self, stu):
name = stu['name']
for student in self.students:
if name == student['name']:
student.update(stu)
return True, f'{
stu["name"]} Modification réussie des données de l'utilisateur '
else:
return False, f'{
name} N'existe pas'
view.py Fichier modifier les données
def _change(self):
stu = {
'name': self.name.get(), 'chinese': self.chinese.get(),
'math': self.math.get(), 'english': self.english.get(), }
self.name.set('')
self.chinese.set('')
self.math.set('')
self.english.set('')
db.update(stu)
self.status.set('Données modifiées avec succès')
main.py Fichier à lier
menubar.add_command(label="Modifier", command=self.show_change)
def show_change(self):
self.input_page.pack_forget()
self.query_page.pack_forget()
self.delete_page.pack_forget()
self.change_page.pack()
view.pyDansAboutFrame()Ajouter des données
class AboutFrame(tk.Frame): # SuccessionFrameCatégorie
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.root = master # Définir les variables internesroot
tk.Label(self, text='À propos de l'oeuvre:Ce travail a été réalisé par Bonjour, apprenez la programmation Production').pack(anchor=tk.W)
tk.Label(self, text='À propos de l'auteur: Bonjour, apprenez la programmation ').pack(anchor=tk.W)
tk.Label(self, text='Copyright: Bonjour, apprenez la programmation ').pack(anchor=tk.W)
main.pyLier les données
menubar.add_command(label="À propos de", command=self.show_about)
def show_about(self):
self.input_page.pack_forget()
self.query_page.pack_forget()
self.delete_page.pack_forget()
self.change_page.pack_forget()
self.about_page.pack()
db.py Enregistrer les données
Créer un videjsonDocumentation
import os
file = "students.json"
# Déterminer si le document existe,Créer s'il n'existe pas
if not os.path.exists(file):
open(file, 'w')
# Erreur signalée
# os.mknod(file)
def save_data(self):
with open('students.json', mode='w', encoding='utf-8') as f:
text = json.dumps(self.students, indent=2, ensure_ascii=False)
f.write(text)
def _load_students_data(self):
with open('students.json', mode='r', encoding='utf-8') as f:
text = f.read()
if text:
self.students = json.loads(text)
Inview.py Fonction d'enregistrement d'appel dans le fichier , Enregistrer les données complétées .
Entrée
def recode_student(self):
db.save_data()
Supprimer
def _delete(self):
db.save_data()
Modifier
def _change(self):
db.save_data()
L'article est illisible , J'ai enregistré la vidéo correspondante. , Cet article n'est qu'un aperçu , Code complet et tutoriels vidéo cliquez sur les coordonnées ci - dessous ↓↓↓↓Numériser le Code pour recevoir↓↓↓↓
Voilà le partage d'aujourd'hui., À la prochaine !
Si vous trouvez ça utile, , Faites attention +Oui.+Collectionnez.,Je t'aime.!