1. ホーム
  2. Python

Pythonのタイトル。学生情報管理システム - アドバンス版 (GUI + MySQLデータベース)

2022-02-17 08:48:21

Pythonの話題です。学生情報管理システム-上級編 (GUI + MySQLデータベース)

グラフィカルインターフェースを使って表示する X人分の3つの授業(機械学習、Pythonプログラミング、大学院英語)の成績を保存するデータベースを操作するためのリスト、タプル、辞書、マップなどのデータ構造を選び、以下のように実装しなさい。

1. 学生情報の追加
2. 学生情報の修正
3. 学生の削除
4. 生徒の成績を追加する
5. 学生の成績修正
6. 名前または番号による生徒の検索、3クラスの生徒情報および成績の表示、ランキングの表示
7. 学生の成績統計(各コースの平均点、最高点、最低点)

コード内のコメントはかなりわかりやすいので、ここでは説明しませんので、質問があればコメントしてください。 

なお、この

  • は、データテーブルが存在しない場合にテーブルを作成しますが、自動的に作成されるテーブルは空白です 管理者ユーザー名とパスワード が必要です。 自分自身 データベースを追加します。 A ( また、記事の最後にあるsqlステートメントを実行すると )、なぜこれが問題なのかというと、これは授業の課題だからで、その時は設計されていない、今またコードを変更するのは億劫だ╭(╯﹏╰)╭......。
  • データベースはコードの中にある(It's in the code) データベースのユーザー名とパスワードの変更が必要な箇所2箇所 66行目 490行目 として構成されています。
# Open database connection Connection test
db = pymysql.connect("localhost", "root", "root", "student")

       はそれぞれ  ホスト名:localhost、ユーザ名:root、パスワード:root、データベース名:student 


以下は、インターフェースのスクリーンショットです。

 管理者用インターフェース、追加、削除、変更、チェック機能、さらにはソート機能φ(>ω<*)を備え、タブバーをクリックして素早く試すことができます。

 コード

#! /usr/bin/python3

import pymysql
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from tkinter import * # Graphical interface library
import tkinter.messagebox as messagebox # popups


class StartPage:
	def __init__(self, parent_window):
		parent_window.destroy() # Destroy the child interface

		self.window = tk.Tk() # declaration of initial box
		self.window.title('Student Information Management System')
		self.window.geometry('300x470') # Here the multiplication is small x

		label = Label(self.window, text="Student Information Management System", font=("Verdana", 20))
		label.pack(pady=100) # pady=100 length of the interface

		Button(self.window, text="Admin Login", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window), width=30, height=2,
			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
		Button(self.window, text="Student Login", font=tkFont.Font(size=16), command=lambda: StudentPage(self.window), width=30,
			   height=2,fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
		Button(self.window, text="About", font=tkFont.Font(size=16), command=lambda: AboutPage(self.window), width=30, height=2,
			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
		Button(self.window, text='Exit system', height=2, font=tkFont.Font(size=16), width=30, command=self.window.destroy,
			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()

		self.window.mainloop() # Main message loop


# admin login page
class AdminPage:
	def __init__(self, parent_window):
		parent_window.destroy() # Destroy the main interface

		self.window = tk.Tk() # declaration of initial box
		self.window.title('admin login page')
		self.window.geometry('300x450') # Here the multiplication is small x

		label = tk.Label(self.window, text='Admin Login', bg='green', font=('Verdana', 20), width=30, height=2)
		label.pack()

		Label(self.window, text='Admin account:', font=tkFont.Font(size=14)).pack(pady=25)
		self.admin_username = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory')
		self.admin_username.pack()

		Label(self.window, text='Admin password:', font=tkFont.Font(size=14)).pack(pady=25)
		self.admin_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*')
		self.admin_pass.pack()

		Button(self.window, text="Login", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40)
		Button(self.window, text="Return to home", width=8, font=tkFont.
			results = cursor.fetchall()
			for row in results:
				self.id.append(row[0])
				self.name.append(row[1])
				self.gender.append(row[2])
				self.age.append(row[3])
				# print(self.id)
				# print(self.name)
				# print(self.gender)
				# print(self.age)
		except:
			print("Error: unable to fetch data")
			messagebox.showinfo('Warning!' , 'Database connection failed! , 'Database connection failed!')
		db.close()# Close the database connection


		print("test***********************")
		for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))): # write data
			self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i]))

		for col in self.columns: # Bind function to make table headers sortable
			self.tree.heading(col, text=col,
							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))

		# Define the top area
		# Define the top left region
		self.top_title = Label(self.frame_left_top, text="Student Info:", font=('Verdana', 20))
		self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10)

		self.left_top_frame = tk.Frame(self.frame_left_top)
		self.var_id = StringVar() # declare the school number
		self.var_name = StringVar() # Declare the name
		self.var_gender = StringVar() # Declare gender
		self.var_age = StringVar() # Declare the age
		# The school number
		self.right_top_id_label = Label(self.frame_left_top, text="School number: ", font=('Verdana', 15))
		self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15))
		self.right_top_id_label.grid(row=1, column=0) # Position setting
		self.right_top_id_entry.grid(row=1, column=1)
		# Name
		self.right_top_name_label = Label(self.frame_left_top, text="Name: ", font=('Verdana', 15))
		self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15))
		self.right_top_name_label.grid(row=2, column=0) # Position setting
		self.right_top_name_entry.grid(row=2, column=1)
		# Gender
		self.right_top_gender_label = Label(self.frame_left_top, text="Gender: ", font=('Verdana', 15))
		self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender,
											font=('Verdana', 15))
		self.right_top_gender_label.grid(row=3, column=0) # position setting
		self.right_top_gender_entry.grid(row=3, column=1)
		# Age
		self.right_top_gender_label = Label(self.frame_left_top, text="Age: ", font=('Verdana', 15))
		self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age,
											font=('Verdana', 15))
		self.right_top_gender_label.grid(row=4, column=0) # Position setting
		self.right_top_gender_entry.grid(row=4, column=1)

		# Define the top-right area
		self.right_top_title = Label(self.frame_right_top, text="action:", font=('Verdana', 20))

		self.tree.bind('<Button-1>', self.click) # Left click to get position
		self.right_top_button1 = ttk.Button(self.frame_right_top, text='New Student Information', width=20, command=self.new_row)
		self.right_top_button2 = ttk.Button(self.frame_right_top, text='Update selected student information', width=20,
											command=self.updata_row)
		self.right_top_button3 = ttk.Button(self.frame_right_top, text='Delete selected student information', width=20,
											command=self.del_row)

		# Position setting
		self.right_top_title.grid(row=1, column=0, pady=10)
		self.right_top_button1.grid(row=2, column=0, padx=20, pady=10)
		self.right_top_button2.grid(row=3, column=0, padx=20, pady=10)
		self.right_top_button3.grid(row=4, column=0, padx=20, pady=10)

		# Overall area positioning
		self.frame_left_top.grid(row=0, column=0, padx=2, pady=5)
		self.frame_right_top.grid(row=0, column=1, padx=30, pady=30)
		self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5)
		self.frame_bottom.grid(row=2, column=0, columnspan=2)

		self.frame_left_top.grid_propagate(0

 これは、私のコンピュータのデータベースからダンプしたSQLファイルです。

/*
Navicat MySQL Data Transfer

Source Server : mysql
Source Server Version : 50532
Source Host : localhost:3306
Source Database : student

Target Server Type : MYSQL
Target Server Version : 50532
File Encoding : 65001

Date: 2019-11-28 15:09:36
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `admin_login_k`
-- ----------------------------
DROP TABLE IF EXISTS `admin_login_k`;
CREATE TABLE `admin_login_k` (
  `admin_id` char(20) NOT NULL,
  `admin_pass` char(20) DEFAULT NULL,
  PRIMARY KEY (`admin_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of admin_login_k
-- ----------------------------
INSERT INTO `admin_login_k` VALUES ('admin', 'admin');

-- ----------------------------
-- Table structure for `student_k`
-- ----------------------------
DROP TABLE IF EXISTS `student_k`;
CREATE TABLE `student_k` (
  `id` char(20) NOT NULL,
  `name` char(20) DEFAULT NULL,
  `gender` char(5) DEFAULT NULL,
  `age` char(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student_k
-- ----------------------------
INSERT INTO `student_k` VALUES ('182085211003', 'a', 'female', '22');
INSERT INTO `student_k` VALUES ('182085211004', 'b', 'female', '18');
INSERT INTO `student_k` VALUES ('182085211005', 'abc', 'male', '23');
INSERT INTO `student_k` VALUES ('182085211006', 'abc', 'female', '24');
INSERT INTO `student_k` VALUES ('182085211008', 'tom', 'male', '23');
INSERT INTO `student_k` VALUES ('182085211009', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211010', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211011', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('1820852110111', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211012', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211013', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211014', 'Tom2', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211015', 'Tom1', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211016', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211017', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211018', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211019', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211020', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211021', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('1820852110211', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211022', 'Tom1', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211023', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211024', 'Tom', 'Male', '23');
INSERT INTO `student_k` VALUES ('182085211034', 'Tom', 'Male', '23');

-- ----------------------------
-- Table structure for `stu_login_k`
-- ----------------------------
DROP TABLE IF EXISTS `stu_login_k`;
CREATE TABLE `stu_login_k` (
  `stu_id` char(20) NOT NULL,
  `stu_pass` char(20) DEFAULT NULL,
  PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of stu_login_k
-- ----------------------------
INSERT INTO `stu_login_k` VALUES ('182085211000', '123456');

-- ----------------------------
-- Table structure for `t_course`
-- ----------------------------
DROP TABLE IF EXISTS `t_course`;
CREATE TABLE `t_course` (
  `SNO` char(255) NOT NULL,
  `COURSE` char(255) DEFAULT NULL,
  `CREDIT` char(255) DEFAULT NULL,
  `GRADE` char(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_course
-- ----------------------------
INSERT INTO `t_course` VALUES ('08300205', 'Programming', '4', '88');
INSERT INTO `t_course` VALUES ('08300205', 'Database', '2.5', '90');
INSERT INTO `t_course` VALUES ('08300205', 'mechanics', '5', '92');
INSERT INTO `t_course` VALUES ('08080929', 'Database', '2.5', '85');
INSERT INTO `t_course` VALUES ('09350124', 'database', '2.5', '92');
INSERT INTO `t_course` VALUES ('09620233', 'database', '2.5', '80');
INSERT INTO `t_course` VALUES ('09300218', 'database', '2.5', '78');
INSERT INTO `t_course` VALUES ('09010122', 'database', '2.5', '87');
INSERT INTO `t_course` VALUES ('08080929', 'Programming', '4', '86');
INSERT INTO `t_course` VALUES ('09010122', 'Programming', '4', '80');
INSERT INTO `t_course` VALUES ('08300516', 'Programming', '4', '76');

-- ----------------------------
-- Table structure for `t_st`
-- ----------------------------
DROP TABLE IF EXISTS `t_st`;
CREATE TABLE `t_st` (
  `SNO` char(11) NOT NULL,
  `SNAME` char(255) DEFAULT NULL,
  `SSEX` char(255) DEFAULT NULL,
  `AGE` char(255) DEFAULT NULL,
  `DEPT` char(255) DEFAULT NULL,
  PRIMARY KEY (`SNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_st
-- ----------------------------
INSERT INTO `t_st` VALUES ('08080929', 'Liu Chaoshi', 'Male', '19', 'Computer Application Technology');
INSERT INTO `t_st` VALUES ('08300205', 'Li Yuanyuan', 'F', '19', 'Software Engineering');
INSERT INTO `t_st` VALUES ('09300218', 'Wang Haichao', 'M', '19', 'Software Engineering');
INSERT INTO `t_st` VALUES ('09350124', 'Wang Tong', 'F', '19', 'Principles of Communication');
INSERT INTO `t_st` VALUES ('09620233', 'Chen Xiaoli', 'F', '21', 'Communication Engineering');




便利だと思ったら、行く前に「いいね!」をクリック^_^。