序文
せきせき、他に何人の宝物が卒業プロジェクトで忙しいのか知りたい
準備はいかがですか?
一部の宝物は、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()
やっと
記事の共有はここまで、記事の最後にある名刺をクリックしてソースコードを入手、急いで勉強してください