wxpython+MySQL實現學生信息管理系統

初學者,僅供學習交流

Python學習兩週時間了,這是我目前編寫的比較滿意的一個程序,有以下幾個方面的經驗總結:

1.佈局管理是可視化編程的基礎思維,儘量避免定點式佈局,不規則分佈的各種控件可以局部先用wx.StaticBoxSizer(靜態框)水平或垂直組合,再橫向或縱向上與其他控件組合並,利用佈局管理的內置參數設置,靈活控制想要的顯示效果。需要說明的是,在wxpython里布局管理器不是容器,而是通過它對加入其中的控件進行自適應管理。
2.控件的動態管理問題。這裏說的動態不是動畫效果,而是不同操作對控件組Show(False)(不可見)和Show(True)(可見)的整體控制。例如學生信息管理系統裏有4個按鈕,分別控制:查詢學生信息、添加學生信息、刪除學生信息和退出系統的操作,雖然功能看上去很簡單,但每個按鈕所調用的控件數也不少,而且在面板佈局上是有重疊的。剛開始我的思路是,在父面板上把所有需要的控件都做出來,初始化都設置成Show(False),當調用某個按鈕操作時,再Show(True)對應的控件組,如此反覆。這樣的代碼顯得特別臃腫繁瑣,而且Python程序是由上至下一條條指令運行的,控件顯示和消失是有先後順序的,屏幕分辨率高的話肉眼都能看到控件波浪式消失再現的效果,這個問題目前我查閱的資料裏沒有找到有效的解決辦法。我最終的解決辦法是:用類函數嵌套調用跳轉同時關閉自己(self.Close()),實現所屬控件組隨父面板一併關閉,再整體開啓新面板及其控件,有點像接龍。說得可能有點抽象,大家可以看下面的具體代碼,這種方法也許我還是首創(幻想中…)。用這種方法居然還能自己調用自己再把自己關閉,實現自我刷新,在代碼中定義刪除學生信息類裏有所體現。當時僅僅是按照設計思路抱着嘗試一下的心態,居然可行,真是意外的收穫。
3.類的繼承是一個效率很高的方法,還是拿學生信息管理系統爲例,系統操作界面上有多個控件是固定不變的,利用第二點經驗裏說的方法,免不了會重複構建一些常態控件。用類繼承的方法可以大大的壓縮代碼量,提高開發效率。需要強調的是,做類的繼承父類操作時,必須加上super(B,self).init(*args, **kw),確保B的父類被調用(工作原理:首先找到B的父類(比如是類A),然後把類B的對象self轉換爲類A的對象,然後“被轉換”的類A對象調用自己的__init__函數),不然你會發現在想調用父類的對象和方法時,系統會報對象或方法未定義的錯誤。(*args, **kw)是python中的可變參數。(*args)表示任何多個無名參數,它是一個tuple;(**kw)表示關鍵字參數,它是一個dict。並且同時使用(*args)和(**kw)時,必須(*args)參數列要在(**kw)前。
第二、三條是學生信息管理系統開發的核心編程思維。

好了,以上是我的一些粗淺認識,感覺很多都是廢話,但作爲初學者來說,每一次實踐的總結都是自我提升的過程。下面進入主題:

一、建數據庫

過程就不說了,直接附上我導出的數據:

-- MySQL dump 10.16  Distrib 10.1.35-MariaDB, for Win32 (AMD64)
--
-- Host: localhost    Database: login_users
-- ------------------------------------------------------
-- Server version	10.1.35-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `login_users`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `login_users` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `login_users`;

--
-- Table structure for table `stu_info`
--

DROP TABLE IF EXISTS `stu_info`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu_info` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '學生id',
  `stu_name` varchar(32) NOT NULL COMMENT '姓名',
  `stu_gender` enum('男','女') NOT NULL COMMENT '性別',
  `stu_age` tinyint(3) unsigned NOT NULL COMMENT '年齡',
  `stu_cid` varchar(32) NOT NULL COMMENT 'CSDN賬號',
  `stu_classid` varchar(32) NOT NULL COMMENT '學習課程',
  `stu_phone` varchar(32) NOT NULL COMMENT '聯繫方式',
  PRIMARY KEY (`id`),
  UNIQUE KEY `stu_name` (`stu_name`),
  UNIQUE KEY `stu_cid` (`stu_cid`),
  UNIQUE KEY `stu_phone` (`stu_phone`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `stu_info`
--

LOCK TABLES `stu_info` WRITE;
/*!40000 ALTER TABLE `stu_info` DISABLE KEYS */;
INSERT INTO `stu_info` VALUES (1,'測試姓名1','男',20,'000001','Python01','測試聯繫方式1'),(2,'測試姓名2','男',23,'000002','Python02','測試聯繫方式2'),(3,'測試姓名3','女',21,'000003','Python03','測試聯繫方式3'),(4,'測試姓名4','男',28,'000004','php01','測試聯繫方式4'),(5,'測試姓名5','男',30,'000005','php02','測試聯繫方式5'),(6,'測試姓名6','女',25,'000006','php03','測試聯繫方式6'),(7,'測試姓名7','男',35,'000007','JavaScript01','測試聯繫方式7'),(8,'測試姓名8','男',31,'000008','JavaScript02','測試聯繫方式8'),(9,'測試姓名9','女',26,'000009','JavaScript03','測試聯繫方式9'),(10,'測試姓名10','男',24,'000010','SQL01','測試聯繫方式10');
/*!40000 ALTER TABLE `stu_info` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `users`
--

DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶id',
  `user_name` varchar(32) NOT NULL COMMENT '用戶名',
  `user_password` varchar(23) NOT NULL COMMENT '登錄密碼',
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `users`
--

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (1,'admin','Python09'),(2,'momobaba','123456');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2018-09-17 21:29:53

在login_users數據庫裏創建兩個數據表,一個是系統用戶的表users,包含用戶名、登錄密碼字段;一個是學生信息表stu_info,包含姓名、性別、年齡、CSDN號、學習課程、聯繫方式字段。
在這裏插入圖片描述
users表結構
在這裏插入圖片描述
users表數據
在這裏插入圖片描述
stu_info表結構
在這裏插入圖片描述
stu_info表數據
在這裏插入圖片描述
共10條數據,後面省略了

二、Python實現數據操作

思路:用構造函數建立數據庫連接,用析構函數關閉數據庫,其它函數實現數據庫的查、增、刪操作。

#導入pymysql模塊
import pymysql

#創建數據庫操作類
class Sql_operation(object):
	'''
	數據庫操作
	'''
	#用構造函數實現數據庫連接,並引入mydb參數,實現調用不同的數據庫
	def __init__(self,mydb): 
		#實例變量
		self.mydb = mydb
		#打開數據庫連接
		self.db = pymysql.connect(host = "localhost",user = "root",password = "",db = self.mydb,charset = "utf8")
		#創建遊標對象
		self.cursor = self.db.cursor()
		
	#定義查看數據表信息函數,並引入table_field、table_name參數,實現查看不同數據表的建表語句
	def FindAll(self,table_name):
		#實例變量
		self.table_name = table_name
		#定義SQL語句
		sql = "select * from %s"%(self.table_name)
		try:
			#執行數據庫操作
			self.cursor.execute(sql)
			#處理結果
			data = self.cursor.fetchall()
			return data			
		except Exception as err:
			print("SQL執行錯誤,原因:",err)

	#定義添加表數據函數
	def Insert(self,stu_name,stu_gender,stu_age,stu_cid,stu_classid,stu_phone):
		#實例變量
		self.stu_name = stu_name
		self.stu_gender = stu_gender
		self.stu_age = stu_age
		self.stu_cid = stu_cid
		self.stu_classid = stu_classid
		self.stu_phone = stu_phone
		#定義SQL語句
		sql = "insert into stu_info(stu_name,stu_gender,stu_age,stu_cid,stu_classid,stu_phone) values('%s','%s','%s','%s','%s','%s')"%(self.stu_name,self.stu_gender,self.stu_age,self.stu_cid,self.stu_classid,self.stu_phone)
		try:
			#執行數據庫操作
			self.cursor.execute(sql)
			#事務提交
			self.db.commit()
		except Exception as err:
			#事務回滾
			self.db.rollback()
			print("SQL執行錯誤,原因:",err)

	#定義刪除表數據函數
	def Del(self,stu_id):
		#實例變量
		self.stu_id = stu_id		
		#定義SQL語句
		sql = "delete from stu_info where id=%d"%(self.stu_id)
		try:
			#執行數據庫操作
			self.cursor.execute(sql)
			#事務提交
			self.db.commit()
		except Exception as err:
			#事務回滾
			self.db.rollback()
			print("SQL執行錯誤,原因:",err)
	
	#用析構函數實現數據庫關閉
	def __del__(self):
		#關閉數據庫連接
		self.db.close()

三、wxpython實現可視化

#導入mx模塊
import wx
import wx.grid
from mydb import Sql_operation
#創建CSDN學生信息管理系統登錄界面類
class UserLogin(wx.Frame):
	'''
	登錄界面
	'''
	#初始化登錄界面
	def __init__(self,*args,**kw):
		# ensure the parent's __init__ is called
		super(UserLogin,self).__init__(*args, **kw)
		#設置窗口屏幕居中
		self.Center()
		#創建窗口
		self.pnl = wx.Panel(self)
		#調用登錄界面函數
		self.LoginInterface()

	def LoginInterface(self):
		#創建垂直方向box佈局管理器
		vbox = wx.BoxSizer(wx.VERTICAL)
		#################################################################################
		#創建logo靜態文本,設置字體屬性
		logo = wx.StaticText(self.pnl,label="CSDN學生信息管理系統")
		font = logo.GetFont()
		font.PointSize += 30
		font = font.Bold()
		logo.SetFont(font)
		#添加logo靜態文本到vbox佈局管理器
		vbox.Add(logo,proportion=0,flag=wx.FIXED_MINSIZE | wx.TOP | wx.CENTER,border=180)
		#################################################################################
		#創建靜態框
		sb_username = wx.StaticBox(self.pnl,label="用戶名")
		sb_password = wx.StaticBox(self.pnl,label="密  碼")		
		#創建水平方向box佈局管理器
		hsbox_username = wx.StaticBoxSizer(sb_username,wx.HORIZONTAL)
		hsbox_password = wx.StaticBoxSizer(sb_password,wx.HORIZONTAL)
		#創建用戶名、密碼輸入框
		self.user_name = wx.TextCtrl(self.pnl,size=(210,25))
		self.user_password = wx.TextCtrl(self.pnl,size=(210,25))
		#添加用戶名和密碼輸入框到hsbox佈局管理器
		hsbox_username.Add(self.user_name,0,wx.EXPAND | wx.BOTTOM,5)
		hsbox_password.Add(self.user_password,0,wx.EXPAND | wx.BOTTOM,5)
		#將水平box添加到垂直box
		vbox.Add(hsbox_username,proportion=0,flag=wx.CENTER)
		vbox.Add(hsbox_password,proportion=0,flag=wx.CENTER)
		#################################################################################
		#創建水平方向box佈局管理器
		hbox = wx.BoxSizer()
		#創建登錄按鈕、綁定事件處理
		login_button = wx.Button(self.pnl,label="登錄",size=(80,25))
		login_button.Bind(wx.EVT_BUTTON,self.LoginButton)
		#添加登錄按鈕到hbox佈局管理器
		hbox.Add(login_button,0,flag=wx.EXPAND | wx.TOP,border=5)
		#將水平box添加到垂直box
		vbox.Add(hbox,proportion=0,flag=wx.CENTER)
		#################################################################################
		#設置面板的佈局管理器vbox		
		self.pnl.SetSizer(vbox)		

	def LoginButton(self,event):
		#連接login_users數據庫
		op = Sql_operation("login_users")
		#獲取users表中的用戶名和密碼信息,返回爲二維元組
		np = op.FindAll("users")
		#匹配標記
		login_sign = 0
		#匹配用戶名和密碼
		for i in np:
			if (i[1] == self.user_name.GetValue()) and (i[2] == self.user_password.GetValue()):
				login_sign = 1
				break
		if login_sign == 0:
			print("用戶名或密碼錯誤!")
		elif login_sign == 1:
			print("登錄成功!")			
			operation = UserOperation(None,title="CSDN學生信息管理系統",size=(1024,668))
			operation.Show()
			self.Close(True)


class UserOperation(wx.Frame):
	'''
	操作界面
	'''
	def __init__(self,*args,**kw):
		# ensure the parent's __init__ is called
		super(UserOperation,self).__init__(*args, **kw)
		#設置窗口屏幕居中
		self.Center()
		#創建窗口
		self.pnl = wx.Panel(self)
		#調用操作界面函數
		self.OperationInterface()

	def OperationInterface(self):
		#創建垂直方向box佈局管理器
		self.vbox = wx.BoxSizer(wx.VERTICAL)		
		#################################################################################
		#創建logo靜態文本,設置字體屬性
		logo = wx.StaticText(self.pnl,label="CSDN學生信息管理系統")
		font = logo.GetFont()
		font.PointSize += 30
		font = font.Bold()
		logo.SetFont(font)
		#添加logo靜態文本到vbox佈局管理器
		self.vbox.Add(logo,proportion=0,flag=wx.FIXED_MINSIZE | wx.TOP | wx.CENTER,border=5)
		#################################################################################
		#創建靜態框
		sb_button = wx.StaticBox(self.pnl,label="選擇操作")
		#創建垂直方向box佈局管理器
		vsbox_button = wx.StaticBoxSizer(sb_button,wx.VERTICAL)
		#創建操作按鈕、綁定事件處理
		check_button = wx.Button(self.pnl,id=10,label="查看學生信息",size=(150,50))
		add_button = wx.Button(self.pnl,id=11,label="添加學生信息",size=(150,50))
		delete_button = wx.Button(self.pnl,id=12,label="刪除學生信息",size=(150,50))
		quit_button = wx.Button(self.pnl,id=13,label="退出系統",size=(150,50))
		self.Bind(wx.EVT_BUTTON,self.ClickButton,id=10,id2=13)
		#添加操作按鈕到vsbox佈局管理器
		vsbox_button.Add(check_button,0,wx.EXPAND | wx.BOTTOM,40)
		vsbox_button.Add(add_button,0,wx.EXPAND | wx.BOTTOM,40)
		vsbox_button.Add(delete_button,0,wx.EXPAND | wx.BOTTOM,40)
		vsbox_button.Add(quit_button,0,wx.EXPAND | wx.BOTTOM,200)		
		#創建靜態框
		sb_show_operation = wx.StaticBox(self.pnl,label="顯示/操作窗口",size=(800,500))
		#創建垂直方向box佈局管理器
		self.vsbox_show_operation = wx.StaticBoxSizer(sb_show_operation,wx.VERTICAL)
		#創建水平方向box佈局管理器
		hbox = wx.BoxSizer()
		hbox.Add(vsbox_button,0,wx.EXPAND | wx.BOTTOM,5)
		hbox.Add(self.vsbox_show_operation,0,wx.EXPAND | wx.BOTTOM,5)
		#將hbox添加到垂直box		
		self.vbox.Add(hbox,proportion=0,flag=wx.CENTER)		
		#################################################################################
		self.pnl.SetSizer(self.vbox)

	def ClickButton(self,event):
		source_id = event.GetId()
		if source_id == 10:
			print("查詢操作!")
			inquire_button = InquireOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			inquire_button.Show()
			self.Close(True)			
		elif source_id == 11:
			print("添加操作!")
			add_button = AddOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			add_button.Show()
			self.Close(True)						
		elif source_id == 12:
			print("刪除操作!")
			del_button = DelOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			del_button.Show()
			self.Close(True)			
		elif source_id == 13:
			self.Close(True)

#繼承UserOperation類,實現初始化操作界面
class InquireOp(UserOperation):
	def __init__(self,*args,**kw):
		# ensure the parent's __init__ is called
		super(InquireOp,self).__init__(*args, **kw)
		#創建學生信息網格		
		self.stu_grid = self.CreateGrid()			
		self.stu_grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK,self.OnLabelleftClick)
		#添加到vsbox_show_operation佈局管理器
		self.vsbox_show_operation.Add(self.stu_grid,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,30)		

	def ClickButton(self,event):
		source_id = event.GetId()
		if source_id == 10:
			pass						
		elif source_id == 11:
			print("添加操作!")
			add_button = AddOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			add_button.Show()
			self.Close(True)						
		elif source_id == 12:
			print("刪除操作!")
			del_button = DelOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			del_button.Show()
			self.Close(True)			
		elif source_id == 13:
			self.Close(True)

	def CreateGrid(self):
		#連接login_users數據庫
		op = Sql_operation("login_users")
		#獲取stu_information表中的學生信息,返回爲二維元組
		np = op.FindAll("stu_info")
		column_names = ("姓名","性別","年齡","CSDN賬號","學習課程","聯繫方式")
		stu_grid = wx.grid.Grid(self.pnl)
		stu_grid.CreateGrid(len(np),len(np[0])-1)
		for row in range(len(np)):
			stu_grid.SetRowLabelValue(row,str(np[row][0]))#確保網格序列號與數據庫id保持一致
			for col in range(1,len(np[row])):
				stu_grid.SetColLabelValue(col-1,column_names[col-1])				
				stu_grid.SetCellValue(row,col-1,str(np[row][col]))				
		stu_grid.AutoSize()
		return stu_grid

	def OnLabelleftClick(self,event):
		#連接login_users數據庫
		op = Sql_operation("login_users")
		#獲取users表中的用戶名和密碼信息,返回爲二維元組
		np = op.FindAll("stu_info")
		print("RowIdx: {0}".format(event.GetRow()))
		print("ColIdx: {0}".format(event.GetRow()))
		print(np[event.GetRow()])
		event.Skip()

#繼承UserOperation類,實現初始化操作界面
class AddOp(UserOperation):
	def __init__(self,*args,**kw):
		# ensure the parent's __init__ is called
		super(AddOp,self).__init__(*args, **kw)
		#創建添加學生信息輸入框、添加按鈕
		self.stu_name = wx.TextCtrl(self.pnl,size = (210,25))
		self.stu_gender = wx.TextCtrl(self.pnl,size = (210,25))
		self.stu_age = wx.TextCtrl(self.pnl,size = (210,25))
		self.stu_cid = wx.TextCtrl(self.pnl,size = (210,25))
		self.stu_classid = wx.TextCtrl(self.pnl,size = (210,25))
		self.stu_phone = wx.TextCtrl(self.pnl,size = (210,25))
		self.add_affirm = wx.Button(self.pnl,label="添加",size=(80,25))
		#爲添加按鈕組件綁定事件處理
		self.add_affirm.Bind(wx.EVT_BUTTON,self.AddAffirm)
		#################################################################################
		#創建靜態框
		sb_name = wx.StaticBox(self.pnl,label="姓  名")
		sb_gender = wx.StaticBox(self.pnl,label="性  別")
		sb_age = wx.StaticBox(self.pnl,label="年  齡")
		sb_cid = wx.StaticBox(self.pnl,label="CSDN號")
		sb_classid = wx.StaticBox(self.pnl,label="學習課程")
		sb_phone = wx.StaticBox(self.pnl,label="聯繫方式")		
		#創建水平方向box佈局管理器
		hsbox_name = wx.StaticBoxSizer(sb_name,wx.HORIZONTAL)
		hsbox_gender = wx.StaticBoxSizer(sb_gender,wx.HORIZONTAL)
		hsbox_age = wx.StaticBoxSizer(sb_age,wx.HORIZONTAL)
		hsbox_cid = wx.StaticBoxSizer(sb_cid,wx.HORIZONTAL)
		hsbox_classid = wx.StaticBoxSizer(sb_classid,wx.HORIZONTAL)
		hsbox_phone = wx.StaticBoxSizer(sb_phone,wx.HORIZONTAL)
		#添加到hsbox佈局管理器
		hsbox_name.Add(self.stu_name,0,wx.EXPAND | wx.BOTTOM,5)
		hsbox_gender.Add(self.stu_gender,0,wx.EXPAND | wx.BOTTOM,5)
		hsbox_age.Add(self.stu_age,0,wx.EXPAND | wx.BOTTOM,5)
		hsbox_cid.Add(self.stu_cid,0,wx.EXPAND | wx.BOTTOM,5)
		hsbox_classid.Add(self.stu_classid,0,wx.EXPAND | wx.BOTTOM,5)
		hsbox_phone.Add(self.stu_phone,0,wx.EXPAND | wx.BOTTOM,5)
		#################################################################################
		#添加到vsbox_show_operation佈局管理器
		self.vsbox_show_operation.Add(hsbox_name,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(hsbox_gender,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(hsbox_age,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(hsbox_cid,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(hsbox_classid,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(hsbox_phone,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(self.add_affirm,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)

	def ClickButton(self,event):
		source_id = event.GetId()
		if source_id == 10:
			print("查詢操作!")
			inquire_button = InquireOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			inquire_button.Show()
			self.Close(True)			
		elif source_id == 11:
			pass						
		elif source_id == 12:
			print("刪除操作!")
			del_button = DelOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			del_button.Show()
			self.Close(True)			
		elif source_id == 13:
			self.Close(True)

	def AddAffirm(self,event):
		#連接login_users數據庫
		op = Sql_operation("login_users")
		#向stu_information表添加學生信息
		stu_name = self.stu_name.GetValue()
		print(stu_name)
		stu_gender = self.stu_gender.GetValue()
		print(stu_gender)
		stu_age = self.stu_age.GetValue()
		print(stu_age)
		stu_cid = self.stu_cid.GetValue()
		print(stu_cid)		
		stu_classid = self.stu_classid.GetValue()
		print(stu_classid)
		stu_phone = self.stu_phone.GetValue()
		print(stu_phone)
		np = op.Insert(stu_name,stu_gender,stu_age,stu_cid,stu_classid,stu_phone)

#繼承InquireOp類,實現初始化操作界面
class DelOp(InquireOp):
	def __init__(self,*args,**kw):
		# ensure the parent's __init__ is called
		super(DelOp,self).__init__(*args, **kw)
		#創建刪除學員信息輸入框、刪除按鈕
		self.del_id = wx.TextCtrl(self.pnl,pos = (407,78),size = (210,25))
		self.del_affirm = wx.Button(self.pnl,label="刪除",pos=(625,78),size=(80,25))
		#爲刪除按鈕組件綁定事件處理
		self.del_affirm.Bind(wx.EVT_BUTTON,self.DelAffirm)
		#################################################################################
		#創建靜態框
		sb_del = wx.StaticBox(self.pnl,label="請選擇需要刪除的學生id")
		#創建水平方向box佈局管理器
		hsbox_del = wx.StaticBoxSizer(sb_del,wx.HORIZONTAL)
		#添加到hsbox_name佈局管理器
		hsbox_del.Add(self.del_id,0,wx.EXPAND | wx.BOTTOM,5)
		#添加到vsbox_show_operation佈局管理器
		self.vsbox_show_operation.Add(hsbox_del,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)
		self.vsbox_show_operation.Add(self.del_affirm,0,wx.CENTER | wx.TOP | wx.FIXED_MINSIZE,5)

	def ClickButton(self,event):
		source_id = event.GetId()
		if source_id == 10:
			print("查詢操作!")
			inquire_button = InquireOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			inquire_button.Show()
			self.Close(True)			
		elif source_id == 11:
			print("添加操作!")
			add_button = AddOp(None,title="CSDN學生信息管理系統",size=(1024,668))
			add_button.Show()
			self.Close(True)						
		elif source_id == 12:
			pass		
		elif source_id == 13:
			self.Close(True)

	def DelAffirm(self,event):
		#連接login_users數據庫
		op = Sql_operation("login_users")
		#向stu_information表添加學生信息
		del_id = self.del_id.GetValue()
		print(del_id)
		np = op.Del(int(del_id))
		
		del_button = DelOp(None,title="CSDN學生信息管理系統",size=(1024,668))
		del_button.Show()
		self.Close(True)

if __name__ == '__main__':
	app = wx.App()
	login = UserLogin(None,title="CSDN學生信息管理系統",size=(1024,668))
	login.Show()
	app.MainLoop()

代碼中個別註釋可能會在複製粘貼過程中忘記更改描述,請見諒

效果圖

登錄界面:
在這裏插入圖片描述
操作界面:
在這裏插入圖片描述
查看學生信息界面:
在這裏插入圖片描述
添加學生信息界面:
在這裏插入圖片描述
刪除學生信息界面:
在這裏插入圖片描述
退出系統操作整個面板就關閉了。
歡迎大家提出改進意見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章