python實現商品信息管理系統(界面版,附帶數據庫)

前言: 本系統爲大型數據庫的大作業,這裏用到了三張表的信息,實現了三張表的增刪改查,鏈接的是sql server數據庫(代碼存在不少冗餘,商品改改相關字段就是學生信息系統啦/狗頭)

環境: win10 64位專業版、sql server2014企業版、python3.6、pymssql 2.1.4

ps: 可以通過改代碼將系統鏈接到mysql或者別的數據庫,有什麼問題可以在評論區寫出來,我看到就會回覆的。(代碼已經做了相關注釋)

CODE:

import pymssql
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from tkinter import * 
import tkinter.messagebox as messagebox # 彈窗
# 打包的時候會用到(十進制的一個庫)
import decimal
decimal.__version__

 
class StartPage:
	def __init__(self, parent_window):
		parent_window.destroy() # 銷燬上一個窗口
		self.window = tk.Tk()  # 初始框的聲明
		self.window.title('商品信息管理系統')
		self.window.geometry('300x410+500+100') # 這裏的乘是小x,第一個參數表示窗口的長,第二個表示寬,第三個表示的距離屏幕左邊界的距離,第三個爲距離上邊界的距離
 
		label = Label(self.window, text="商品信息管理系統", font=("Verdana", 20))
		label.pack(pady=100)  # pady=100 這個label距離窗口上邊界的距離,這裏設置爲100剛好居中
 
		# command=lambda:  可以帶參數,注意帶參數的類不要寫括號,否者,這裏調用會直接執行(class test:)
		Button(self.window, text="管理員登陸", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window), width=30, height=2,
			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()	# pack() 方法會使得組件在窗口中自動佈局
		Button(self.window, text="數據庫初始化", font=tkFont.Font(size=16), command=self.Initialization, width=30, height=2,
			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
		Button(self.window, text="退出系統", 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() # 主消息循環


	# 創建數據庫
	def Initialization(self):
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'master') # 服務器名,賬戶,密碼,數據庫名
		cursor = db.cursor()
		print('建立數據庫中......')
		sql = """
		-- 創建EMIS數據庫
		CREATE DATABASE EMIS ON PRIMARY
		(
			NAME='EMIS_data',--主文件邏輯文件名
			FILENAME='G:\\SQL Server\\EMIS_data.mdf', --主文件文件名
			SIZE=5mb,--系統默認創建的時候會給主文件分配初始大小
			MAXSIZE=500MB,--主文件的最大值
			filegrowth=15%-- 主文件的增長幅度
		)
		LOG ON
		(
			name='EMIS_log',--日誌文件邏輯文件名
			filename='G:\\SQL Server\\EMIS_log.ldf',--日誌文件屋裏文件名
			SIZE=5MB,--日誌文件初始大小
			filegrowth=0 --啓動自動增長
		)
		"""

		try:
			db.autocommit(True)     # 這個句話可以防止python創建數據庫的時候報錯(python連接數據庫機制的問題)
			cursor.execute(sql)
			db.commit()
		except:
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		cursor.close()  # 關閉遊標
		db.close()  # 關閉數據庫連接
		self.jianbiao() # 進行建表操作

	# 創建數據表
	def jianbiao(self):
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
		cursor = db.cursor()
		print('建立數據表中......')
		sql = """
		---創建管理員數據表
		CREATE TABLE t_admin (
		admin_id varchar(255) NOT NULL,
		admin_pass varchar(255) DEFAULT NULL,
		PRIMARY KEY (admin_id)
		);

		---插入管理賬戶和密碼
		INSERT INTO t_admin VALUES ('admin', 'admin');


		---創建商品表
		CREATE TABLE t_goods (
		id varchar(20) NOT NULL,
		name varchar(20) DEFAULT NULL,
		gender varchar(7) DEFAULT NULL,
		age varchar(7) DEFAULT NULL,
		PRIMARY KEY (id)
		);
		
		---向學生表中插入數據
		INSERT INTO t_goods VALUES ('1000000', '小米1', '1999', '1000');
		INSERT INTO t_goods VALUES ('1000001', '小米2', '1999', '1500');
		INSERT INTO t_goods VALUES ('1000002', '小米3', '1999', '1000');
		INSERT INTO t_goods VALUES ('1000003', '小米4', '1999', '900');
		INSERT INTO t_goods VALUES ('1000004', '小米5', '1999', '2000');
		INSERT INTO t_goods VALUES ('1000005', '小米6', '2499', '10000');
		INSERT INTO t_goods VALUES ('1000006', '小米8', '2599', '20000');

		
		---創建買家信息數據表
		CREATE TABLE t_buyer (
		SNO varchar(20) NOT NULL,
		NAME varchar(255) DEFAULT NULL,
		NUMBER varchar(255) DEFAULT NULL,
		dizhi varchar(255) DEFAULT NULL
		);
		
		---向賣家信息數據表中插入數據
		INSERT INTO t_buyer VALUES ('08300205', '小紅', '1', '天津市');
		INSERT INTO t_buyer VALUES ('08300206', '小明', '3', '北京市');
		INSERT INTO t_buyer VALUES ('08300207', '小芬', '1', '安陽市');
		INSERT INTO t_buyer VALUES ('08080929', '小愛', '10', '武漢市');


		---創建訂單信息表
		CREATE TABLE t_order(
		id varchar(20) NOT NULL,
		SNO varchar(20) DEFAULT NULL,
		buy_time varchar(255) DEFAULT NULL,
		vic varchar(255) DEFAULT NULL,
		buy_money varchar(255) DEFAULT NULL,
		PRIMARY KEY (SNO)
		);
		
		---向訂單信息表中插入數據
		INSERT INTO t_order VALUES ('1000000', '08300205', '2013-7', '是', '1899');
		INSERT INTO t_order VALUES ('1000002', '08300206', '2014-5', '是', '1999');
		INSERT INTO t_order VALUES ('1000003', '08300207', '2018-9', '是', '2499');
		INSERT INTO t_order VALUES ('1000004', '08080929', '2019-12', '是', '2999');
		"""

		try:
			cursor.execute(sql)
			db.commit()
		except:
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		cursor.close()  # 關閉遊標
		db.close()  # 關閉數據庫連接
		self.create_chufaqi()

	# 創建觸發器
	def create_chufaqi(self):
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
		cursor = db.cursor()
		print('建立觸發器中......')
		sql = """
		--- 爲商品表和訂單表創建update觸發器
		create Trigger tru_goods 
		On t_goods                         --在Student表中創建觸發器 
		for Update                         --爲什麼事件觸發 
		As                                 --事件觸發後所要做的事情 
		IF update(id)
		BEGIN
		declare @stuidnew varchar(20) --從臨時表Inserted記錄新的的學號ID 
		declare @stuidold varchar(20) --從臨時表Deleted記錄跟新以前舊的的學號ID
		select @stuidold=id from Deleted
		select @stuidnew=id from Inserted
		update t_order set id=@stuidnew where id=@stuidold
		print @stuidnew
		print @stuidold
		end
		"""

		try:
			cursor.execute(sql)
			db.commit()
		except:
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		cursor.close()  # 關閉遊標
		db.close()  # 關閉數據庫連接
		self.create_cunchu1() # 創建觸發器1

	# 創建存儲過程1
	def create_cunchu1(self):
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
		cursor = db.cursor()
		print('建立存儲過程1中......')
		sql = """
		-- 創建刪除指定行的存儲過程
		create procedure proc_delete
		@商品id varchar(20)
		as 
		DELETE FROM t_goods WHERE id = @商品id
		--use EMIS
		--exec proc_delete 00001
		"""

		try:
			cursor.execute(sql)
			db.commit()
		except:
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		cursor.close()  # 關閉遊標
		db.close()  # 關閉數據庫連接
		self.create_cunchu2()

	# 創建存儲過程2
	def create_cunchu2(self):
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
		cursor = db.cursor()
		print('建立存儲過程2中......')
		sql = """
		-- 創建查詢的存儲過程
		create procedure proc_cha
		@name varchar(20)
		as 
		select * from t_goods
		where name=@name
		--use EMIS
		--exec proc_cha 小米
		"""

		try:
			cursor.execute(sql)
			db.commit()
			messagebox.showinfo('提示', '數據庫已成功初始化')
		except:
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		cursor.close()  # 關閉遊標
		db.close()  # 關閉數據庫連接

 
#管理員登陸頁面
class AdminPage:
	def __init__(self, parent_window):
		parent_window.destroy() # 銷燬上一個界面
		self.window = tk.Tk()  # 初始框的聲明
		self.window.title('管理員登陸頁面')
		self.window.geometry('450x300+500+100')

		# 創建畫布,這裏可以存放照片等組件
		canvas = tk.Canvas(self.window, height=200, width=500)
		image_file = tk.PhotoImage(file='welcome.gif')
		image = canvas.create_image(0,0, anchor='nw', image=image_file)	# 前兩個參數爲畫布得座標,anchor=nw則是把圖片的左上角作爲錨定點
		canvas.pack(side='top')	# 使用pack將畫布進行簡單得佈局,放到了上半部分

		# 創建提示信息
		tk.Label(self.window, text='登錄名: ').place(x=80, y= 150)
		tk.Label(self.window, text='登陸密碼: ').place(x=80, y= 190)

		self.admin_username = tk.Entry(self.window)
		self.admin_username.place(x=160, y=150)
		self.admin_pass = tk.Entry(self.window, show='*')
		self.admin_pass.place(x=160, y=190)
		# 登陸和返回首頁得按鈕
		btn_login = tk.Button(self.window, text='登陸',  width=10, command=self.login)
		btn_login.place(x=120, y=230)
		btn_back = Button(self.window, text="返回首頁", width=8, font=tkFont.Font(size=12), command=self.back)
		btn_back.place(x=270, y=230)
		self.window.mainloop()

	# 登陸的函數
	def login(self): 
		# 數據庫操作 查詢管理員表
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "SELECT * FROM t_admin where admin_id = '%s'" % (self.admin_username.get())  # 這裏得user_name即爲admin_id,這裏是輸入的用戶名
		try:
		# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表,這裏是返回的二元元組,如(('id','title'),('id','title'))
			results = cursor.fetchall()
			for row in results:
				admin_id = row[0]
				admin_pass = row[1]
				# 打印結果
				print("管理員賬號爲:%s, \n\n管理員密碼爲:%s" % (admin_id, admin_pass))
		except:
			print("Error: unable to fecth data")
			messagebox.showinfo('警告!', '用戶名或密碼不正確!')
		db.close()  # 關閉數據庫連接

		print("正在登陸管理員管理界面.......")

		# 判斷輸入的賬號密碼與數據庫中的信息是否一致a
		if self.admin_pass.get() == admin_pass:
			All_admin(self.window)   # 進入管理員子菜單操作界面
		else:
			messagebox.showinfo('警告!', '用戶名或密碼不正確!')

	# 使得系統點擊關閉的x號上返回指定頁面,而不是關閉
	def back(self):
		StartPage(self.window) # 顯示主窗口 銷燬本窗口
 

# 管理員子菜單操作界面
class All_admin:
	def __init__(self, parent_window):
		parent_window.destroy() # 自定銷燬上一個界面
		self.window = tk.Tk()  # 初始框的聲明
		self.window.title('信息管理界面')
		self.window.geometry('300x410+500+100')
		label = Label(self.window, text="請選擇需要進行的操作", font=("Verdana", 20))
		label.pack(pady=100)  # pady=100 界面的長度

		Button(self.window, text="商品信息管理", font=tkFont.Font(size=16), width=30, height=2, command=lambda: AdminManage(self.window),
			fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
		Button(self.window, text="買家信息管理", font=tkFont.Font(size=16), width=30,height=2, command=lambda:User_AdminManage(self.window),
			fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
		Button(self.window, text="訂單信息管理", font=tkFont.Font(size=16), width=30, height=2, command=lambda:Buy_AdminManage(self.window),
			fg='white', bg='gray', activebackground='black', activeforeground='white').pack()

		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角關閉點擊
		self.window.mainloop()  # 進入消息循環

	def back(self):
		StartPage(self.window) # 顯示主窗口 銷燬本窗口


# 商品信息操作界面
class AdminManage:
	def __init__(self, parent_window):
		parent_window.destroy() 	# 自動銷燬上一個界面
		self.window = Tk()  		# 初始框的聲明
		self.window.title('管理員操作界面')
		self.window.geometry("650x685+300+30")	# 初始窗口在屏幕中的位置
		self.frame_left_top = tk.Frame(width=300, height=200)	# 指定框架,在窗口上可以顯示,這裏指定四個框架	
		self.frame_right_top = tk.Frame(width=200, height=200)
		self.frame_center = tk.Frame(width=500, height=350)
		self.frame_bottom = tk.Frame(width=650, height=70)
 
		# 定義下方中心列表區域
		self.columns = ("商品id", "商品名稱", "商品價格", "銷售數量")
		self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns)
        # 添加豎直滾動條
		self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview)
		# 定義樹形結構與滾動條
		self.tree.configure(yscrollcommand=self.vbar.set)

		# 定義id1爲修改id時的暫存變量,這個是爲了更新信息而設計的
		self.id1 = 0
 
		# 表格的標題
		self.tree.column("商品id", width=150, anchor='center')
		self.tree.column("商品名稱", width=150, anchor='center')
		self.tree.column("商品價格", width=100, anchor='center')
		self.tree.column("銷售數量", width=100, anchor='center')
 
		# grid方法將tree和vbar進行佈局
		self.tree.grid(row=0, column=0, sticky=NSEW)
		self.vbar.grid(row=0, column=1, sticky=NS)
	
		# 定義幾個數組,爲中間的那個大表格做一些準備
		self.id = []
		self.name = []
		self.gender = []
		self.age = []

		# 打開數據庫連接
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "SELECT * FROM t_goods"
		try:
			# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表
			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])
		except:
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		db.close()# 關閉數據庫連接
 
 
		print("test***********************")
		for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))):  # 寫入數據
			self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i]))
 
		for col in self.columns:  # 綁定函數,使表頭可排序(這裏的command=lambda _col=col還不是太懂)
			self.tree.heading(col, text=col, command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))
 
		# 定義頂部區域
		# 定義左上方區域
		self.top_title = Label(self.frame_left_top, text="商品信息:", font=('Verdana', 20))
		self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10)   # NSEW表示允許組件向4個方向都可以拉伸

		# 定義下方區域
		self.chaxun = StringVar()
		self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15))
		self.right_bottom_button = ttk.Button(self.frame_bottom, text='商品名稱查詢', width=20, command=self.put_data)
		self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20)  # 位置設置
		self.right_bottom_gender_entry.grid(row=0, column=1)
 
		self.left_top_frame = tk.Frame(self.frame_left_top)
		self.var_id = StringVar()  # 聲明學號
		self.var_name = StringVar()  # 聲明姓名
		self.var_gender = StringVar()  # 聲明性別
		self.var_age = StringVar()  # 聲明年齡
		# 商品id
		self.right_top_id_label = Label(self.frame_left_top, text="商品id: ", 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)
		self.right_top_id_entry.grid(row=1, column=1)
		# 商品名稱
		self.right_top_name_label = Label(self.frame_left_top, text="商品名稱:", 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)  # 位置設置
		self.right_top_name_entry.grid(row=2, column=1)
		# 商品價格
		self.right_top_gender_label = Label(self.frame_left_top, text="商品價格:", 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)  # 位置設置
		self.right_top_gender_entry.grid(row=3, column=1)
		# 銷售數量
		self.right_top_gender_label = Label(self.frame_left_top, text="銷售數量:", 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)  # 位置設置
		self.right_top_gender_entry.grid(row=4, column=1)
 
		# 定義右上方區域
		self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20))
		self.tree.bind('<Button-1>', self.click)  # 左鍵獲取位置(tree.bind可以綁定一系列的事件,可以搜索ttk相關參數查看)
		self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建商品信息', width=20, command=self.new_row)
		self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新選中商品信息', width=20,command=self.updata_row)
		self.right_top_button3 = ttk.Button(self.frame_right_top, text='刪除選中商品信息', width=20,command=self.del_row)
 

		# 定義下方區域,查詢功能塊
		self.chaxun = StringVar()
		self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15))
		self.right_bottom_button = ttk.Button(self.frame_bottom, text='商品名稱查詢', width=20, command=self.put_data)
		self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20)  # 位置設置
		self.right_bottom_gender_entry.grid(row=0, column=1)


		# 右上角按鈕的位置設置
		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)
 
		# 整體區域定位,利用了Frame和grid進行佈局
		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)
 
		# 設置固定組件,(0)就是將組件進行了固定
		self.frame_left_top.grid_propagate(0)
		self.frame_right_top.grid_propagate(0)
		self.frame_center.grid_propagate(0)
		self.frame_bottom.grid_propagate(0)
 
		self.frame_left_top.tkraise() # 開始顯示主菜單,tkraise()提高z軸的順序(不太懂)
		self.frame_right_top.tkraise() # 開始顯示主菜單
		self.frame_center.tkraise() # 開始顯示主菜單
		self.frame_bottom.tkraise() # 開始顯示主菜單
 
		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角關閉點擊,執行back方法
		self.window.mainloop()  # 進入消息循環

	# 將查到的信息放到中間的表格中
	def put_data(self):
		self.delButton()	# 先將表格內的內容全部清空

		# print(self.chaxun.get())	# 輸入框內的內容	
		# 打開數據庫連接,準備查找指定的信息
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "use EMIS   exec proc_cha '%s'"  % (self.chaxun.get())
		try:
			# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表
			results = cursor.fetchall()

			# 再次進行初始化,進行首行數據的插入
			self.id = []
			self.name = []
			self.gender = []
			self.age = []
			# 向表格中插入數據
			for row in results:
				self.id.append(row[0])
				self.name.append(row[1])
				self.gender.append(row[2])
				self.age.append(row[3])

		except:
			print("Error: unable to fetch data")
			messagebox.showinfo('警告!', '數據庫連接失敗!')
			db.close()# 關閉數據庫連接
		
		print("進行數據的插入")
		for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))):  # 寫入數據
			self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i]))
 
		for col in self.columns:  # 綁定函數,使表頭可排序
			self.tree.heading(col, text=col,
							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))


	# 清空表格中的所有信息
	def delButton(self):
		x=self.tree.get_children()
		for item in x:
			self.tree.delete(item)


	# 在表格上的點擊事件,這裏是作用就是一點擊表格就可以將信息直接寫到左上角的框框中
	def click(self, event):
		self.col = self.tree.identify_column(event.x)  # 通過tree.identify_column()函數可以直接獲取到列
		self.row = self.tree.identify_row(event.y)  # 行
 
		print(self.col)
		print(self.row)
		self.row_info = self.tree.item(self.row, "values")
		self.var_id.set(self.row_info[0])
		self.id1 = self.var_id.get()
		self.var_name.set(self.row_info[1])
		self.var_gender.set(self.row_info[2])
		self.var_age.set(self.row_info[3])
		self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, font=('Verdana', 15))
 
	# 點擊中間的表格的表頭,可以將那一列進行排序
	def tree_sort_column(self, tv, col, reverse):  # Treeview、列名、排列方式
		l = [(tv.set(k, col), k) for k in tv.get_children('')]
		l.sort(reverse=reverse)  # 排序方式
		for index, (val, k) in enumerate(l):  # 根據排序後索引移動
			tv.move(k, '', index)
		tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse))  # 重寫標題,使之成爲再點倒序的標題
 
	def new_row(self):
		print('123')
		print(self.var_id.get())
		print(self.id)
		if str(self.var_id.get()) in self.id:
			messagebox.showinfo('警告!', '該商品已存在!')
		else:
			if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '':
				# 打開數據庫連接
				db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
				cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
				sql = "INSERT INTO t_goods(id, name, gender, age) \
				       VALUES ('%s', '%s', '%s', '%s')" % \
					  (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get())  # SQL 插入語句
				try:
					cursor.execute(sql)  # 執行sql語句
					db.commit()  # 提交到數據庫執行
				except:
					db.rollback()  # 發生錯誤時回滾
					messagebox.showinfo('警告!', '數據庫連接失敗!')
				db.close()  # 關閉數據庫連接
 
				self.id.append(self.var_id.get())
				self.name.append(self.var_name.get())
				self.gender.append(self.var_gender.get())
				self.age.append(self.var_age.get())
				self.tree.insert('', len(self.id) - 1, values=(
				self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1],
				self.age[len(self.id) - 1]))
				self.tree.update()
				messagebox.showinfo('提示!', '插入成功!')
			else:
				messagebox.showinfo('警告!', '請填寫商品信息')
 
	def updata_row(self):
		res = messagebox.askyesnocancel('警告!', '是否更新所填數據?')
		if res == True:
			# 打開數據庫連接
			db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
			cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
			sql = "UPDATE t_goods SET id = '%s', name = '%s', gender = '%s', age = '%s' where id = '%s'" % (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.id1)  # SQL 插入語句
			try:
				cursor.execute(sql)  # 執行sql語句
				db.commit()  # 提交到數據庫執行
				messagebox.showinfo('提示!', '更新成功!')
			except:
				db.rollback()  # 發生錯誤時回滾
				messagebox.showinfo('警告!', '更新失敗,數據庫連接失敗!')
			db.close()  # 關閉數據庫連接

			id_index = self.id.index(self.row_info[0])
			self.name[id_index] = self.var_name.get()
			self.gender[id_index] = self.var_gender.get()
			self.age[id_index] = self.var_age.get()

			self.tree.item(self.tree.selection()[0], values=(
				self.var_id.get(), self.var_name.get(), self.var_gender.get(),
				self.var_age.get()))  # 修改對於行信息

	# 刪除行
	def del_row(self):
		res = messagebox.askyesnocancel('警告!', '是否刪除所選數據?')
		if res == True:
			print(self.row_info[0])  # 鼠標選中的學號
			print(self.tree.selection()[0])  # 行號
			print(self.tree.get_children())  # 所有行
			# 打開數據庫連接
			db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') 
			cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
			sql = "use EMIS exec proc_delete '%s'" % (self.row_info[0]) # SQL 插入語句
			try:
				cursor.execute(sql)  # 執行sql語句
				db.commit()  # 提交到數據庫執行
				messagebox.showinfo('提示!', '刪除成功!')
			except:
				db.rollback()  # 發生錯誤時回滾
				messagebox.showinfo('警告!', '刪除失敗,數據庫連接失敗!')
			db.close()  # 關閉數據庫連接
 
			id_index = self.id.index(self.row_info[0])
			print(id_index)
			del self.id[id_index]
			del self.name[id_index]
			del self.gender[id_index]
			del self.age[id_index]
			print(self.id)
			self.tree.delete(self.tree.selection()[0])  # 刪除所選行
			print(self.tree.get_children())

	def back(self):
		All_admin(self.window)   # 進入管理員子菜單操作界面 
 

# 買家信息操作界面
class User_AdminManage:
	def __init__(self, parent_window):
		parent_window.destroy() # 銷燬主界面
 
		self.window = Tk()  # 初始框的聲明
		self.window.title('管理員操作界面')
		self.window.geometry("650x685+300+30")	# 初始窗口在屏幕中的位置
		self.frame_left_top = tk.Frame(width=300, height=200)
		self.frame_right_top = tk.Frame(width=200, height=200)
		self.frame_center = tk.Frame(width=500, height=350)
		self.frame_bottom = tk.Frame(width=650, height=70)

		self.id1 = 0

		# 定義下方中心列表區域
		self.columns = ("訂單id", "購買者姓名", "購買數量", "收貨地址")
		self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns)
		self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview)
		# 定義樹形結構與滾動條
		self.tree.configure(yscrollcommand=self.vbar.set)
 
		# 表格的標題
		self.tree.column("訂單id", width=150, anchor='center')  # 表示列,不顯示
		self.tree.column("購買者姓名", width=150, anchor='center')
		self.tree.column("購買數量", width=100, anchor='center')
		self.tree.column("收貨地址", width=100, anchor='center')
 
		# 調用方法獲取表格內容插入
		self.tree.grid(row=0, column=0, sticky=NSEW)
		self.vbar.grid(row=0, column=1, sticky=NS)
 
		self.id = []
		self.name = []
		self.gender = []
		self.age = []
		# 打開數據庫連接
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "SELECT * FROM t_buyer"  # SQL 查詢語句
		try:
			# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表
			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])
		except:
			print("Error: unable to fetch data")
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		db.close()# 關閉數據庫連接
 
 
		print("test***********************")
		for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))):  # 寫入數據
			self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i]))
 
		for col in self.columns:  # 綁定函數,使表頭可排序
			self.tree.heading(col, text=col,
							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))
 
		# 定義頂部區域
		# 定義左上方區域
		self.top_title = Label(self.frame_left_top, text="商品信息:", 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()  # 聲明學號
		self.var_name = StringVar()  # 聲明姓名
		self.var_gender = StringVar()  # 聲明性別
		self.var_age = StringVar()  # 聲明年齡
		# 學號
		self.right_top_id_label = Label(self.frame_left_top, text="訂單id: ", 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)  # 位置設置
		self.right_top_id_entry.grid(row=1, column=1)
		# 姓名
		self.right_top_name_label = Label(self.frame_left_top, text="購買者姓名:", 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)  # 位置設置
		self.right_top_name_entry.grid(row=2, column=1)
		# 性別
		self.right_top_gender_label = Label(self.frame_left_top, text="購買數量:", 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)  # 位置設置
		self.right_top_gender_entry.grid(row=3, column=1)
		# 年齡
		self.right_top_gender_label = Label(self.frame_left_top, text="收貨地址:", 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)  # 位置設置
		self.right_top_gender_entry.grid(row=4, column=1)
 
		# 定義右上方區域
		self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20))
 
		self.tree.bind('<Button-1>', self.click)  # 左鍵獲取位置
		self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建商品信息', width=20, command=self.new_row)
		self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新選中商品信息', width=20,command=self.updata_row)
		self.right_top_button3 = ttk.Button(self.frame_right_top, text='刪除選中商品信息', width=20,command=self.del_row)

		# 定義下方區域
		self.chaxun = StringVar()
		self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15))
		self.right_bottom_button = ttk.Button(self.frame_bottom, text='買家姓名查詢', width=20, command=self.put_data)
		self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20)  # 位置設置
		self.right_bottom_gender_entry.grid(row=0, column=1)
 
		# 位置設置
		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)
 
		# 整體區域定位
		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)
		self.frame_right_top.grid_propagate(0)
		self.frame_center.grid_propagate(0)
		self.frame_bottom.grid_propagate(0)
 
		self.frame_left_top.tkraise() # 開始顯示主菜單
		self.frame_right_top.tkraise() # 開始顯示主菜單
		self.frame_center.tkraise() # 開始顯示主菜單
		self.frame_bottom.tkraise() # 開始顯示主菜單
 
		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角關閉點擊
		self.window.mainloop()  # 進入消息循環

	# 將查到的信息放到中間的表格中
	def put_data(self):
		self.delButton()	# 先將表格內的內容全部清空

		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "SELECT * FROM t_buyer where NAME = '%s'"  % (self.chaxun.get())
		try:
			# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表
			results = cursor.fetchall()

			# 再次進行初始化,進行首行數據的插入
			self.id = []
			self.name = []
			self.gender = []
			self.age = []
			# 向表格中插入數據
			for row in results:
				self.id.append(row[0])
				self.name.append(row[1])
				self.gender.append(row[2])
				self.age.append(row[3])

		except:
			print("Error: unable to fetch data")
			messagebox.showinfo('警告!', '數據庫連接失敗!')
			db.close()# 關閉數據庫連接
		
		print("進行數據的插入")
		for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))):  # 寫入數據
			self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i]))
 
		for col in self.columns:  # 綁定函數,使表頭可排序
			self.tree.heading(col, text=col,
							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))


	# 清空表格中的所有信息
	def delButton(self):
		x=self.tree.get_children()
		for item in x:
			self.tree.delete(item)



	def back(self):
		All_admin(self.window)   # 進入管理員子菜單操作界面 
 
	def click(self, event):
		self.col = self.tree.identify_column(event.x)  # 列
		self.row = self.tree.identify_row(event.y)  # 行
 
		print(self.col)
		print(self.row)
		self.row_info = self.tree.item(self.row, "values")
		self.var_id.set(self.row_info[0])
		self.id1 = self.var_id.get()
		print(self.id1)
		self.var_name.set(self.row_info[1])
		self.var_gender.set(self.row_info[2])
		self.var_age.set(self.row_info[3])
		self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id, font=('Verdana', 15))
 
	# 排序的方法
	def tree_sort_column(self, tv, col, reverse):  # Treeview、列名、排列方式
		l = [(tv.set(k, col), k) for k in tv.get_children('')]
		l.sort(reverse=reverse)  # 排序方式
		# rearrange items in sorted positions
		for index, (val, k) in enumerate(l):  # 根據排序後索引移動
			tv.move(k, '', index)
		tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse))  # 重寫標題,使之成爲再點倒序的標題

	# 插入方法
	def new_row(self):
		if str(self.var_id.get()) in self.id:
			messagebox.showinfo('警告!', '該商品已存在!')
		else:
			if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '':
				# 打開數據庫連接
				db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
				cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
				sql = "INSERT INTO t_buyer(SNO, NAME, NUMBER, dizhi) \
				       VALUES ('%s', '%s', '%s', '%s')" % \
					  (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get())  # SQL 插入語句
				try:
					cursor.execute(sql)  # 執行sql語句
					db.commit()  # 提交到數據庫執行
				except:
					db.rollback()  # 發生錯誤時回滾
					messagebox.showinfo('警告!', '數據庫連接失敗!')
				db.close()  # 關閉數據庫連接
 
				# 將信息寫入到表格中
				self.id.append(self.var_id.get())
				self.name.append(self.var_name.get())
				self.gender.append(self.var_gender.get())
				self.age.append(self.var_age.get())
				self.tree.insert('', len(self.id) - 1, values=(self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1], self.age[len(self.id) - 1]))
				self.tree.update()
				messagebox.showinfo('提示!', '插入成功!')
			else:
				messagebox.showinfo('警告!', '請填寫商品信息')
 
	# 更新數據及表格
	def updata_row(self):
		res = messagebox.askyesnocancel('警告!', '是否更新所填數據?')
		if res == True:
			# 打開數據庫連接
			db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
			cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
			sql = "UPDATE t_buyer SET SNO = '%s', NAME = '%s', NUMBER = '%s', dizhi = '%s' \
				where SNO = '%s'" % (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.id1)  # SQL 插入語句
			try:
				cursor.execute(sql)  # 執行sql語句
				db.commit()  # 提交到數據庫執行
				messagebox.showinfo('提示!', '更新成功!')
			except:
				db.rollback()  # 發生錯誤時回滾
				messagebox.showinfo('警告!', '更新失敗,數據庫連接失敗!')
			db.close()  # 關閉數據庫連接

			id_index = self.id.index(self.row_info[0])
			self.name[id_index] = self.var_name.get()
			self.gender[id_index] = self.var_gender.get()
			self.age[id_index] = self.var_age.get()

			self.tree.item(self.tree.selection()[0], values=(
				self.var_id.get(), self.var_name.get(), self.var_gender.get(),
				self.var_age.get()))  # 修改對於行信息

	# 刪除行
	def del_row(self):
		res = messagebox.askyesnocancel('警告!', '是否刪除所選數據?')
		if res == True:
			print(self.row_info[0])  # 鼠標選中的學號
			print(self.tree.selection()[0])  # 行號
			print(self.tree.get_children())  # 所有行
			# 打開數據庫連接
			db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') 
			cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
			sql = "DELETE FROM t_buyer WHERE SNO = '%s'" % (self.row_info[0]) # SQL 插入語句
			try:
				cursor.execute(sql)  # 執行sql語句
				db.commit()  # 提交到數據庫執行
				messagebox.showinfo('提示!', '刪除成功!')
			except:
				db.rollback()  # 發生錯誤時回滾
				messagebox.showinfo('警告!', '刪除失敗,數據庫連接失敗!')
			db.close()  # 關閉數據庫連接
 
			id_index = self.id.index(self.row_info[0])
			print(id_index)
			del self.id[id_index]
			del self.name[id_index]
			del self.gender[id_index]
			del self.age[id_index]
			print(self.id)
			self.tree.delete(self.tree.selection()[0])  # 刪除所選行
			print(self.tree.get_children())


# 訂單信息操作界面
class Buy_AdminManage:
	def __init__(self, parent_window):
		parent_window.destroy() # 銷燬主界面

		self.window = Tk()  # 初始框的聲明
		self.window.geometry("650x720+300+30")	# 初始窗口在屏幕中的位置
		self.window.title('管理員操作界面')
 
		self.frame_left_top = tk.Frame(width=300, height=230)
		self.frame_right_top = tk.Frame(width=200, height=230)
		self.frame_center = tk.Frame(width=500, height=360)
		self.frame_bottom = tk.Frame(width=650, height=60)
 
		self.id1 = 0

		# 定義下方中心列表區域
		self.columns = ("商品id", "訂單id", "訂單創建時間", "是否成功交易", "交易金額")
		self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns)
		self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview)
		# 定義樹形結構與滾動條
		self.tree.configure(yscrollcommand=self.vbar.set)
 
		# 表格的標題
		self.tree.column("商品id", width=100, anchor='center')  # 表示列,不顯示
		self.tree.column("訂單id", width=100, anchor='center')
		self.tree.column("訂單創建時間", width=100, anchor='center')
		self.tree.column("是否成功交易", width=100, anchor='center')
		self.tree.column("交易金額", width=100, anchor='center')	
 
		# 調用方法獲取表格內容插入
		self.tree.grid(row=0, column=0, sticky=NSEW)
		self.vbar.grid(row=0, column=1, sticky=NS)
 
		self.SNO = []
		self.SNAME = []
		self.SSEX = []
		self.AGE = []
		self.DEP = []
		# 打開數據庫連接
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "SELECT * FROM t_order"  # SQL 查詢語句
		try:
			# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表
			results = cursor.fetchall()
			for row in results:
				self.SNO.append(row[0])
				self.SNAME.append(row[1])
				self.SSEX.append(row[2])
				self.AGE.append(row[3])
				self.DEP.append(row[4])			
		except:
			print("Error: unable to fetch data")
			messagebox.showinfo('警告!', '數據庫連接失敗!')
		db.close()# 關閉數據庫連接
 
 
		print("test***********************")
		for i in range(min(len(self.SNO), len(self.SNAME), len(self.SSEX), len(self.AGE), len(self.DEP))):  # 寫入數據
			self.tree.insert('', i, values=(self.SNO[i], self.SNAME[i], self.SSEX[i], self.AGE[i], self.DEP[i]))
 
		for col in self.columns:  # 綁定函數,使表頭可排序
			self.tree.heading(col, text=col,
							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))
 
		# 定義頂部區域
		# 定義左上方區域
		self.top_title = Label(self.frame_left_top, text="訂單信息:", 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()  # 聲明商品id
		self.var_name = StringVar()  # 聲明訂單id
		self.var_gender = StringVar()  # 聲明訂單創建時間
		self.var_age = StringVar()  # 聲明訂單是否成功交易
		self.var_dep = StringVar()	# 聲明交易金額
		

		self.right_top_id_label = Label(self.frame_left_top, text="商品id: ", 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)  # 位置設置
		self.right_top_id_entry.grid(row=1, column=1)

		self.right_top_name_label = Label(self.frame_left_top, text="訂單id:", 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)  # 位置設置
		self.right_top_name_entry.grid(row=2, column=1)

		self.right_top_gender_label = Label(self.frame_left_top, text="創建時間:", 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)  # 位置設置
		self.right_top_gender_entry.grid(row=3, column=1)

		self.right_top_gender_label = Label(self.frame_left_top, text="是否成功交易:", 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)  # 位置設置
		self.right_top_gender_entry.grid(row=4, column=1)

		self.right_top_gender_label = Label(self.frame_left_top, text="交易金額:", font=('Verdana', 15))
		self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_dep, font=('Verdana', 15))
		self.right_top_gender_label.grid(row=5, column=0)  # 位置設置
		self.right_top_gender_entry.grid(row=5, column=1)
 
		# 定義右上方區域
		self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20))
 
		self.tree.bind('<Button-1>', self.click)  # 左鍵獲取位置
		self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建訂單信息', width=20, command=self.new_row)
		self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新選中訂單信息', width=20,command=self.updata_row)
		self.right_top_button3 = ttk.Button(self.frame_right_top, text='刪除選中訂單信息', width=20,command=self.del_row)

		# 定義下方區域
		self.chaxun = StringVar()
		self.right_bottom_gender_entry = Entry(self.frame_bottom, textvariable=self.chaxun, font=('Verdana', 15))
		self.right_bottom_button = ttk.Button(self.frame_bottom, text='訂單id查詢', width=20, command=self.put_data)
		self.right_bottom_button.grid(row=0, column=0, padx=20, pady=20)  # 位置設置
		self.right_bottom_gender_entry.grid(row=0, column=1)
 
		# 位置設置
		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)
 
		# 整體區域定位
		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)
		self.frame_right_top.grid_propagate(0)
		self.frame_center.grid_propagate(0)
		self.frame_bottom.grid_propagate(0)
 
		self.frame_left_top.tkraise() # 開始顯示主菜單
		self.frame_right_top.tkraise() # 開始顯示主菜單
		self.frame_center.tkraise() # 開始顯示主菜單
		self.frame_bottom.tkraise() # 開始顯示主菜單

		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角關閉點擊
		self.window.mainloop()  # 進入消息循環

	def back(self):
		All_admin(self.window)   # 進入管理員子菜單操作界面 

	# 將查到的信息放到中間的表格中
	def put_data(self):
		self.delButton()	# 先將表格內的內容全部清空

		# print(self.chaxun.get())	# 輸入框內的內容	
		# 打開數據庫連接,準備查找指定的信息
		db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
		cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
		sql = "SELECT * FROM t_order where SNO = '%s'"  % (self.chaxun.get())
		try:
			# 執行SQL語句
			cursor.execute(sql)
			# 獲取所有記錄列表
			results = cursor.fetchall()

			# 再次進行初始化,進行首行數據的插入
			self.SNO = []
			self.SNAME = []
			self.SSEX = []
			self.AGE = []
			self.DEP = []
			# 向表格中插入數據
			for row in results:
				self.SNO.append(row[0])
				self.SNAME.append(row[1])
				self.SSEX.append(row[2])
				self.AGE.append(row[3])
				self.DEP.append(row[4])		

		except:
			print("Error: unable to fetch data")
			messagebox.showinfo('警告!', '數據庫連接失敗!')
			db.close()# 關閉數據庫連接
		
		for i in range(min(len(self.SNO), len(self.SNAME), len(self.SSEX), len(self.AGE), len(self.DEP))):  # 寫入數據
			self.tree.insert('', i, values=(self.SNO[i], self.SNAME[i], self.SSEX[i], self.AGE[i], self.DEP[i]))
 
		for col in self.columns:  # 綁定函數,使表頭可排序
			self.tree.heading(col, text=col,
							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))


	# 清空表格中的所有信息
	def delButton(self):
		x=self.tree.get_children()
		for item in x:
			self.tree.delete(item)



	def click(self, event):
		self.col = self.tree.identify_column(event.x)  # 列
		self.row = self.tree.identify_row(event.y)  # 行
 
		print(self.col)
		print(self.row)
		self.row_info = self.tree.item(self.row, "values")
		self.var_id.set(self.row_info[0])
		self.id1 = self.var_id.get()
		print(self.id1)
		self.var_name.set(self.row_info[1])
		self.var_gender.set(self.row_info[2])
		self.var_age.set(self.row_info[3])
		self.var_dep.set(self.row_info[4])
		self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id,
										font=('Verdana', 15))
 
		print('')
 
	def tree_sort_column(self, tv, col, reverse):  # Treeview、列名、排列方式
		l = [(tv.set(k, col), k) for k in tv.get_children('')]
		l.sort(reverse=reverse)  # 排序方式
		# rearrange items in sorted positions
		for index, (val, k) in enumerate(l):  # 根據排序後索引移動
			tv.move(k, '', index)
		tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse))  # 重寫標題,使之成爲再點倒序的標題
 
	def new_row(self):
		print(self.var_id.get())
		print(self.SNO)
		if str(self.var_id.get()) in self.SNO:
			messagebox.showinfo('警告!', '該商品已存在!')
		else:
			if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '' and self.var_dep.get() != '':
				# 打開數據庫連接
				db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
				cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
				sql = "INSERT INTO t_order(id, SNO, buy_time, vic, buy_money) \
				       VALUES ('%s', '%s', '%s', '%s', '%s')" % \
					  (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_dep.get())  # SQL 插入語句
				try:
					cursor.execute(sql)  # 執行sql語句
					db.commit()  # 提交到數據庫執行
				except:
					db.rollback()  # 發生錯誤時回滾
					messagebox.showinfo('警告!', '數據庫連接失敗!')
				db.close()  # 關閉數據庫連接
 
				self.SNO.append(self.var_id.get())
				self.SNAME.append(self.var_name.get())
				self.SSEX.append(self.var_gender.get())
				self.AGE.append(self.var_age.get())
				self.DEP.append(self.var_dep.get())
				self.tree.insert('', len(self.SNO) - 1, values=(
				self.SNO[len(self.SNO) - 1], self.SNAME[len(self.SNO) - 1], self.SSEX[len(self.SNO) - 1],
				self.AGE[len(self.SNO) - 1], self.DEP[len(self.SNO) - 1]))
				self.tree.update()
				messagebox.showinfo('提示!', '插入成功!')
			else:
				messagebox.showinfo('警告!', '請填寫訂單信息')
 
	def updata_row(self):
		res = messagebox.askyesnocancel('警告!', '是否更新所填數據?')
		if res == True:
			# 打開數據庫連接
			db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS')
			cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
			sql = "UPDATE t_order SET id = '%s', SNO = '%s', buy_time = '%s', vic = '%s', buy_money = '%s' \
				where id = '%s'" % (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_dep.get(), self.id1)  # SQL 插入語句
			try:
				cursor.execute(sql)  # 執行sql語句
				db.commit()  # 提交到數據庫執行
				messagebox.showinfo('提示!', '更新成功!')
			except:
				db.rollback()  # 發生錯誤時回滾
				messagebox.showinfo('警告!', '更新失敗,數據庫連接失敗!')
			db.close()  # 關閉數據庫連接

			id_index = self.SNO.index(self.row_info[0])
			self.SNO[id_index] = self.var_name.get()
			self.SSEX[id_index] = self.var_gender.get()
			self.AGE[id_index] = self.var_age.get()
			self.DEP[id_index] = self.var_age.get()

			self.tree.item(self.tree.selection()[0], values=(
				self.var_id.get(), self.var_name.get(), self.var_gender.get(),
				self.var_age.get(), self.var_dep.get()))  # 修改對於行信息

	# 刪除行
	def del_row(self):
		res = messagebox.askyesnocancel('警告!', '是否刪除所選數據?')
		if res == True:
			print(self.row_info[0])  # 鼠標選中的學號
			print(self.tree.selection()[0])  # 行號
			print(self.tree.get_children())  # 所有行
			# 打開數據庫連接
			db = pymssql.connect('TAF_MT', 'sa', '123456789', 'EMIS') 
			cursor = db.cursor()  # 使用cursor()方法獲取操作遊標
			sql = "DELETE FROM t_order WHERE id = '%s'" % (self.row_info[0]) # SQL 插入語句
			try:
				cursor.execute(sql)  # 執行sql語句
				db.commit()  # 提交到數據庫執行
				messagebox.showinfo('提示!', '刪除成功!')
			except:
				db.rollback()  # 發生錯誤時回滾
				messagebox.showinfo('警告!', '刪除失敗,數據庫連接失敗!')
			db.close()  # 關閉數據庫連接
 
			id_index = self.SNO.index(self.row_info[0])
			print(id_index)
			del self.SNO[id_index]
			del self.SNAME[id_index]
			del self.SSEX[id_index]
			del self.AGE[id_index]
			del self.DEP[id_index]
			print(self.SNO)
			self.tree.delete(self.tree.selection()[0])  # 刪除所選行
			print(self.tree.get_children())


# About頁面
class AboutPage:
	def __init__(self, parent_window):
		parent_window.destroy() # 銷燬主界面
 
		self.window = tk.Tk()  # 初始框的聲明
		self.window.title('關於')
		self.window.geometry('300x450')  # 這裏的乘是小x
 
		label = tk.Label(self.window, text='商品信息管理系統', bg='green', font=('Verdana', 20), width=30, height=2)
		label.pack()
 
		Label(self.window, text='作者:TAF_MT', font=('Verdana', 18)).pack(pady=30)
		Label(self.window, text='聯繫:**********', font=('Verdana', 18)).pack(pady=5)
 
		Button(self.window, text="返回首頁", width=8, font=tkFont.Font(size=12), command=self.back).pack(pady=100)
 
		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角關閉點擊
		self.window.mainloop()  # 進入消息循環
 
	def back(self):
		StartPage(self.window)  # 顯示主窗口 銷燬本窗口
 
 
if __name__ == '__main__':
	# 實例化Application
	window = tk.Tk()
	StartPage(window)

演示:
在這裏插入圖片描述
github地址: 點我

參考鏈接: 大佬的博文

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