import pymssql
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from tkinter import * # 圖形界面庫
import tkinter.messagebox as messagebox # 彈窗
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 界面的長度
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()
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', '2020', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
cursor = db.cursor() # 使用cursor()方法獲取操作遊標
sql = "delete from t_goods; delete from t_buyer; delete from t_order;"
try:
# 執行SQL語句
cursor.execute(sql)
db.commit() # 提交
messagebox.showinfo('提示', '數據庫已成功初始化')
except:
print("Error: unable to fetch data")
messagebox.showinfo('警告!', '數據庫連接失敗!')
db.close() # 關閉數據庫連接
#管理員登陸頁面
class AdminPage:
def __init__(self, parent_window):
parent_window.destroy() # 銷燬主界面
self.window = tk.Tk() # 初始框的聲明
self.window.title('管理員登陸頁面')
self.window.geometry('300x450+500+100') # 這裏的乘是小x
label = tk.Label(self.window, text='管理員登陸', bg='green', font=('Verdana', 20), width=30, height=2)
label.pack() # 指定位置
Label(self.window, text='管理員賬號:', 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='管理員密碼:', 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='*') # Entry爲輸入
self.admin_pass.pack()
Button(self.window, text="登陸", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40)
Button(self.window, text="返回首頁", width=8, font=tkFont.Font(size=12), command=self.back).pack()
self.window.protocol("WM_DELETE_WINDOW", self.back) # 捕捉右上角關閉點擊
self.window.mainloop() # 進入消息循環
def login(self):
print(str(self.admin_username.get()))
print(str(self.admin_pass.get()))
admin_pass = None
# 數據庫操作 查詢管理員表
db = pymssql.connect('TAF_MT', '2020', '123456789', 'EMIS') # 服務器名,賬戶,密碼,數據庫名
cursor = db.cursor() # 使用cursor()方法獲取操作遊標
sql = "SELECT * FROM admin_login_k 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("正在登陸管理員管理界面.......")
if self.admin_pass.get() == admin_pass:
All_admin(self.window) # 進入管理員子菜單操作界面
# AdminManage(self.window) # 進入管理員操作界面
else:
messagebox.showinfo('警告!', '用戶名或密碼不正確!')
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') # 這裏的乘是小x
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')
# 調用方法獲取表格內容插入(滾動條類)
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', '2020', '123456789', 'EMIS')
cursor = db.cursor() # 使用cursor()方法獲取操作遊標
sql = "SELECT * FROM t_goods" # 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) # 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() # 聲明年齡
# 學號
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() # 先將表格內的內容全部清空
# print(self.chaxun.get()) # 輸入框內的內容
# 打開數據庫連接,準備查找指定的信息
db = pymssql.connect('TAF_MT', '2020', '123456789', 'EMIS')
cursor = db.cursor() # 使用cursor()方法獲取操作遊標
sql = "SELECT * FROM t_goods 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 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))
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('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', '2020', '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', '2020', '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', '2020', '123456789', 'EMIS')
cursor = db.cursor() # 使用cursor()方法獲取操作遊標
sql = "DELETE FROM t_goods 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.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', '2020', '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', '2020', '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))
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('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', '2020', '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', '2020', '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', '2020', '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', '2020', '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', '2020', '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() != '':
# 打開數據庫連接
db = pymssql.connect('TAF_MT', '2020', '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', '2020', '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', '2020', '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)
python 商品信息管理系統、界面、sql server數據庫(草稿)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.