Python卒業プロジェクト/授業に必要:学生管理システムを作る

序文

せきせき、他に何人の宝物が卒業プロジェクトで忙しいのか知りたい

準備はいかがですか?

ここに画像の説明を挿入

一部の宝物は、Python を長い間学んできましたが、学生管理システムを自分で作成する方法をまだ知りません。

ああ、どうしたらいいですか、あなたと共有させてください

クリックして完全なコードを取得する

ここに画像の説明を挿入

取り敢えず、始めましょう

実装コード

1. ログインページ

1. ログイン クラスを定義し、オブジェクトを初期化する

最初に必要なモジュールをインポートします

from main import MainPage

ログインページ

アートボードをインスタンス オブジェクトにバインドする

self.root = master

self.page 画用紙は画面上に長方形の領域を表示し、主にコンテナーとして使用されます。

self.page = tk.Frame(self.root)
self.page.pack()
self.root.geometry("300x180")

ユーザー名とパスワードを定義するために tkinter によって提供される可変変数。

self.username = tk.StringVar()
self.password = tk.StringVar()

ラベルを作成する

グリッドレイアウト

tk.Label(self.page).grid(row=0, column=0)
# textvariable 这个参数是把 tkinter 里面的字符串变量与 空间绑定起来
tk.Label(self.page, text="账户").grid(row=1, column=0, stick=tk.E, pady=10)python学习交流Q群:690643772 ### 源码领取
tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=tk.W, pady=10)
tk.Label(self.page, text="密码").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)

コマンドは、ログイン ロジックを実行する関数を受け入れます

tk.Button(self.page, text="登录", command=self.login_check).grid(row=3, column=0, stick=tk.W, pady=10)
tk.Button(self.page, text="退出", command=root.quit).grid(row=3, column=1, stick=tk.E, pady=10)

2. ログイン機能

ログインを確認する

アカウントのパスワードを取得する

name = self.username.get()
pwd = self.password.get()

データベースにクエリを実行しない

print(name, pwd)
if name == 'admin' and pwd == '123456':
    tkinter.messagebox.showinfo(title='恭喜',
                                message='登录成功!')

現在のページに描画されたコンテンツを破棄します

self.page.destroy()

ページ全体に描画されたコンテンツを破棄します

self.root.destroy()

ページ切り替え

    MainPage(self.root)
else:
    tkinter.messagebox.showinfo(title='错误', message='账户或者密码错误')

3. ウィンドウ呼び出し
このファイルのメソッドを呼び出し、このファイル内の 2 つの入力を実行し、このメソッドの前のデータを外部で呼び出して実行します。

インターフェイスを表示するオブジェクト、window オブジェクトを作成します。

if __name__ == '__main__':
    root = tk.Tk()
    LoginPage(root)
    root.mainloop()

2. メインページ表示

1. 簡単に呼び出すためのページ クラスを定義します。

ログイン インターフェイス

源码领取 690643772
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()

最上位メニューを作成し、メニューを表示します。

def create_page(self):
    python学习交流Q群:690643772 ### 源码领取
    menubar = tk.Menu(self.root)

    menubar.add_command(label="录入")
    menubar.add_command(label="查询")
    menubar.add_command(label="删除")
    menubar.add_command(label="修改")
    menubar.add_command(label="关于")

3. ページ表示

1. 各ページをとじる

一緒に書かれたコードとデータが多すぎて、間違いや混乱を起こしやすいです.view.pyを保持するためにファイルを書くことができます.

view.py ファイルで各モジュールのクラスを定義する

入力

class InputFrame(tk.Frame):  # 继承Frame类 
    def __init__(self, master):
        # 重新父类
        super().__init__(master)
        pass

お問い合わせ

class QueryFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        pass

消去

class DeleteFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)

改訂

class ChangeFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)

だいたい

class AboutFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.root = master 

次に、これらのデータを main.py ファイルにバインドします

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)

2.入力

関連するコンテンツ、名前、グレードを view.py ファイルの InputFrame クラスに追加します。

x = IntVar():整型变量,默认是0
x = DoubleVar():浮点型变量,默认是0.0
x = StringVar():字符串变量,默认是""
x = BooleanVar():布尔型变量,True是1,False是0
self.root = master  # 定义内部变量root
self.name = tk.StringVar()
self.math = tk.StringVar()
self.chinese = tk.StringVar()
self.english = tk.StringVar()
# 录入
self.status = tk.StringVar()
# 调用create_page()函数
self.create_page()

create_page() 関数を書く

def create_page(self):
    # pass
    # stick 控件对象方向 tk.W 西方位
    # pady padding y 上下的宽度
    # row 行 表格布局
    tk.Label(self).grid(row=0, stick=tk.W, pady=10)
    tk.Label(self, text='姓 名: ').grid(row=1, stick=tk.W, pady=10)
    # text variable 绑定控件里面的数据内容
    tk.Entry(self, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
    tk.Label(self, text='数 学: ').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='语 文: ').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='英 语: ').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='录入', 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)

これらのデータを main.py にバインドします

menubar.add_command(label="录入", command=self.show_input)

def show_input(self):
    self.input_page.pack()
    # pack_forget()隐藏布局
    # self.change_page.pack_forget()
    # self.query_page.pack_forget()
    # self.delete_page.pack_forget()
    # self.about_page.pack_forget()

view.py ファイルのデータ入力

def recode_student(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.insert(stu)
    self.status.set('提交数据成功')
    print(stu)

4.データのクエリ

QueryFrame() クラスにデータを追加する

  • ttk.Treeview ツリー ビュー、Baidu
  • 表示:
    見出し
    ツリー
    data_list
  • 列の
    値はリストです。リスト内の各要素は、列識別子の名前を表します。リストの長さは列の長さです。

Frame クラスを継承する

class QueryFrame(tk.Frame):  
    def __init__(self, master=None):
        super().__init__(master)

内部変数ルートを定義する

self.root = master  #
columns = ('name', 'chinese', 'math', 'english')
self.tree_view = ttk.Treeview(self, show='headings', columns=columns)

セルあたりの各データ サイズ

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')

上のラベルと見出し

self.tree_view.heading('name', text='姓名')
self.tree_view.heading('chinese', text='语文')
self.tree_view.heading('math', text='数学')
self.tree_view.heading('english', text='英语')
self.tree_view.pack(fill=tk.BOTH, expand=True)
tk.Button(self, text='刷新数据', command=self.show_data_frame).pack(anchor=tk.E, pady=5)
self.show_data_frame()

データを更新し、データを表示します。

def show_data_frame(self):
    # 删除旧的阶段
    for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
        pass
    # 先要显示所有数据 在db文件加入显示数据代码
    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'],
        ))

表示データ

db.pyに追加

def all(self):
    return self.students

view.py

挿入されたデータを更新する

  • 最初のパラメーター: 親: ツリー バーを持つ Treeview の場合、parent は親ノードです。リスト バーのみを持つ Treeview の場合、parent は通常空です。
  • 2 番目のパラメーター: index: 挿入位置。It can be END or 'end'
    or it can be a number. 新しく挿入された項目 (レコード) を特定のノードの最初にする場合は、インデックスを 0 に設定します。
  • 値: 表示された値と挿入されたデータ、この列のデータ。
self.tree_view.insert('', index + 1, values=(
                stu['name'], stu['chinese'], stu['math'], 								stu['english'],
            ))

データの更新を挿入した後にページを更新する

  • map(func,
    lst) を呼び出し、入力関数変数 func を lst 変数の各要素に適用し、新しいリスト (Python2)/イテレーター (Python3) を形成して結果を返します。
  • get_children(item=なし)

アイテムのすべてのサブアイテムを返します。このサブアイテムはリスト形式です。アイテムが指定されていない場合は、ルート ディレクトリのアイテムが返されます。

for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
            pass

main.py ファイルでデータをバインドする

	menubar.add_command(label="查询", command=self.show_all)

def show_all(self):
    # 隐藏布局
    self.input_page.pack_forget()
    # self.change_page.pack_forget()
    self.query_page.pack()
    # self.delete_page.pack_forget()
    # self.about_page.pack_forget()

5. データを削除する

DeleteFrame() クラスにデータを追加する

class DeleteFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master  # 定义内部变量root
        tk.Label(self, text='删除数据').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='根据名字删除信息').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='删除', command=self._delete).pack()
        tk.Label(self, textvariable=self.status).pack()

1. [削除] をクリックしてデータを削除します

def _delete(self):
    username = self.username.get()
    flag, message = db.delete_by_name(username)
    self.status.set(message)

db.py ファイルに削除ロジックを追加

def delete_by_name(self, name):
    for student in self.students:
        if name == student['name']:
            self.students.remove(student)
            return True, f'{
    
    name} 删除成功'
    return False, f'{
    
    name} 不存在'

main.py でデータをバインドする

	menubar.add_command(label="删除", command=self.show_delete)
def show_delete(self):
    self.input_page.pack_forget()
    self.query_page.pack_forget()
    self.delete_page.pack()

6. データの修正

ChangeFrame() クラスにデータを追加する

self.root = master  # 定义内部变量root

        tk.Label(self, text='修改界面').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='姓 名: ').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='数 学: ').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='语 文: ').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='英 语: ').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='查询', command=self._search).grid(row=6, column=0, stick=tk.W, pady=10)
        tk.Button(self.change_frame, text='修改', 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)

1.データのクエリ

db.py ファイルのクエリ データ ロジック

def search_by_name(self, name):
    for student in self.students:
        if name == student['name']:
            return True, student
    return False, f'{
    
    name} 不存在'

View.py ファイルをクリックしてクエリを実行し、データを表示します

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('数据查询成功')
    else:
        # 直接返回错误的信息
        self.status.set(info)

2. データの修正と更新

db.py ファイル更新デー​​タ ロジック

def update(self, stu):
    name = stu['name']
    for student in self.students:
        if name == student['name']:
            student.update(stu)
            return True, f'{
    
    stu["name"]} 用户数据修改成功'
    else:
        return False, f'{
    
    name} 不存在'

view.py ファイル データの変更

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('修改数据成功')

バインド用の main.py ファイル

    menubar.add_command(label="修改", 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.py の AboutFrame() にデータを追加します

class AboutFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.root = master  # 定义内部变量root
        tk.Label(self, text='关于作品:本作品由 嗨学编程 制作').pack(anchor=tk.W)
        tk.Label(self, text='关于作者:嗨学编程').pack(anchor=tk.W)
        tk.Label(self, text='版权所有:嗨学编程').pack(anchor=tk.W)

main.py バインド データ

	menubar.add_command(label="关于", 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()

8、データ保存、保存情報

db.py はデータを保存します

空のjsonファイルを作成

import os

file = "students.json"
# 判断文件是否存在,不存在则创建
if not os.path.exists(file):
    open(file, 'w')
    # 报错
    # os.mknod(file)

Windows にはノードの概念がないため、Windows 上の Python は mknod 関数をサポートしていません。

1. データを保存する

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)

2. データの読み取り

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)

view.py ファイルの save 関数を呼び出して、完成したデータを保存します。

入力

def recode_student(self):
	db.save_data()

消去

def _delete(self):
    db.save_data()

改訂

def _change(self):
    db.save_data()

やっと

記事の共有はここまで、記事の最後にある名刺をクリックしてソースコードを入手、急いで勉強してください

写真の説明を追加してください

おすすめ

転載: blog.csdn.net/yxczsz/article/details/129242681