From 46b11056b7f416a14d2f86ad864fec8db832e2dc Mon Sep 17 00:00:00 2001 From: 78793 <787934074@qq.com> Date: Tue, 2 Jul 2024 11:08:30 +0800 Subject: [PATCH] first commit --- BaseWindow.py | 17 + Pymysql_Sample.py | 17 + README.md | 3 +- X1/StuSys_X1_1.py | 57 +++ X1/StuSys_X1_3.py | 86 ++++ X1/StuSys_X1_4.py | 31 ++ X2/StuSys_X2_bootstrap.py | 214 ++++++++++ .../StuSys_X2_bootstrap.cpython-37.pyc | Bin 0 -> 7511 bytes .../StuSys_X2_bootstrap.cpython-39.pyc | Bin 0 -> 7749 bytes X3/StuSys_X3_bootstrap.py | 129 ++++++ X4/StuSys_X4_bootstrap.py | 199 +++++++++ X5/StuSys_X5_11.py | 248 ++++++++++++ X5/StuSys_X5_12.py | 301 ++++++++++++++ X5/StuSys_X5_13.py | 315 +++++++++++++++ X5/StuSys_X5_14.py | 309 ++++++++++++++ X5/StuSys_X5_15.py | 335 +++++++++++++++ X5/StuSys_X5_final.py | 382 ++++++++++++++++++ X5/basic.png | Bin 0 -> 223272 bytes draft.py | 63 +++ 19 files changed, 2704 insertions(+), 2 deletions(-) create mode 100644 BaseWindow.py create mode 100644 Pymysql_Sample.py create mode 100644 X1/StuSys_X1_1.py create mode 100644 X1/StuSys_X1_3.py create mode 100644 X1/StuSys_X1_4.py create mode 100644 X2/StuSys_X2_bootstrap.py create mode 100644 X2/__pycache__/StuSys_X2_bootstrap.cpython-37.pyc create mode 100644 X2/__pycache__/StuSys_X2_bootstrap.cpython-39.pyc create mode 100644 X3/StuSys_X3_bootstrap.py create mode 100644 X4/StuSys_X4_bootstrap.py create mode 100644 X5/StuSys_X5_11.py create mode 100644 X5/StuSys_X5_12.py create mode 100644 X5/StuSys_X5_13.py create mode 100644 X5/StuSys_X5_14.py create mode 100644 X5/StuSys_X5_15.py create mode 100644 X5/StuSys_X5_final.py create mode 100644 X5/basic.png create mode 100644 draft.py diff --git a/BaseWindow.py b/BaseWindow.py new file mode 100644 index 0000000..d2d5f67 --- /dev/null +++ b/BaseWindow.py @@ -0,0 +1,17 @@ +import tkinter.font as tkFont +import tkinter +from tkinter import * +from tkinter import ttk, messagebox + +import pymysql + + +class BaseWindow(Frame): + def __init__(self, master, attr): + super().__init__(master) + self.attr = attr + self.master = master + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + # self.conn = pymysql.connect(user="root", password="123123", database="stu_sys", host="127.0.0.1", port=3306) diff --git a/Pymysql_Sample.py b/Pymysql_Sample.py new file mode 100644 index 0000000..8a54c92 --- /dev/null +++ b/Pymysql_Sample.py @@ -0,0 +1,17 @@ +import pymysql + +if __name__ == '__main__': + # 建立数据库连接的语句connection + connection = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + cursor = connection.cursor() # 创建游标 + sql = "select * from student" # SQL语句字符串 + # 为了防止SQL注入等安全问题,可以使用参数化查询。 + try: + cursor.execute(sql) # 执行SQL语句 + ResultList = cursor.fetchall() # 获取游标中的数据 + print(ResultList) # Student[(S#,Sname,Sage,...),...] + except pymysql.Error as e: # 捕获报错信息 + print("MySQL Error:", e) # 打印报错信息 + finally: + cursor.close() # 关闭游标 + connection.close() # 关闭数据库连接 diff --git a/README.md b/README.md index 5a632a6..374bfdc 100644 --- a/README.md +++ b/README.md @@ -1,2 +1 @@ -# DatabaseThinkingandRelationalDatabase - +# DatabaseThinkingandRelationalDatabase \ No newline at end of file diff --git a/X1/StuSys_X1_1.py b/X1/StuSys_X1_1.py new file mode 100644 index 0000000..47232d1 --- /dev/null +++ b/X1/StuSys_X1_1.py @@ -0,0 +1,57 @@ +import pymysql + + +def create_database(conn): + cursor = conn.cursor() # 创建游标 + cursor.execute("DROP DATABASE IF EXISTS SCT") + # 创建数据库 + cursor.execute("CREATE DATABASE SCT CHARACTER SET utf8 COLLATE utf8_general_ci") + cursor.close() # 关闭游标 + +def create_table(conn): + cursor = conn.cursor() # 创建游标 + cursor.execute("USE SCT") # 指定数据库 + # 创建student数据表 + cursor.execute(""" + CREATE TABLE IF NOT EXISTS student + ( + sid CHAR(8) PRIMARY KEY, + sname CHAR(10), + ssex CHAR(2), + sage INTEGER, + sclass CHAR(6) + ) + """) + # 创建Course数据表 + cursor.execute(""" + CREATE TABLE IF NOT EXISTS course + ( + cid CHAR(4) PRIMARY KEY, + cname CHAR(30), + credit FLOAT(1), + chours INTEGER, + t CHAR(3) + ) + """) + # 创建SC数据表 + cursor.execute(""" + CREATE TABLE IF NOT EXISTS sc + ( + sid CHAR(8), + cid CHAR(4), + score FLOAT(1), + CONSTRAINT sc_course_cid_fk + FOREIGN KEY (cid) REFERENCES course (cid), + CONSTRAINT sc_student_sid_fk + FOREIGN KEY (sid) REFERENCES student (sid) + ) + """) + cursor.close() + + +if __name__ == '__main__': + # conn = pymysql.connect(user="root", password="123456", database="SCT", host="127.0.0.1", port=3306) + conn = pymysql.connect(user="root", password="Wyz010810", host="127.0.0.1", port=3306) + create_database(conn) + create_table(conn) + conn.close() # 关闭数据库连接 diff --git a/X1/StuSys_X1_3.py b/X1/StuSys_X1_3.py new file mode 100644 index 0000000..e29ab4e --- /dev/null +++ b/X1/StuSys_X1_3.py @@ -0,0 +1,86 @@ +# encoding: utf8 +import time +import pymysql +import random + +last_names = "李,王,张,刘,陈,杨,黄,赵,周,吴,徐,孙,朱,马,胡,郭,林,何,高,梁,郑,罗,宋,谢,唐,韩,曹,许,邓,萧,冯,曾,程,蔡,彭,潘,袁,于,董,余,苏,叶,吕,魏,蒋,田,杜,丁,沈,姜,范,江,傅,钟,卢,汪,戴,崔,任,陆,廖,姚,方,金,邱,夏,谭,韦,贾,邹,石,熊,孟,秦,阎,薛,侯,雷,白,龙,段,郝,孔,邵,史,毛,常,万,顾,赖,武,康,贺,严,尹,钱,施,牛,洪,龚" +last_names_list = last_names.split(",") +course_names = "语文、数学、外语、历史、思想政治、地理、 化学、物理、生物、体育、美术、音乐、技术、微积分、体育、毛泽东思想概论、思想道德修养、高等数学、线性代数、概率论与数理统计、离散数学、计算机原理、人工智能、程序设计基础、面向对象程序设计、数字逻辑电路、电路电子技术、数据结构与算法、WEB程序设计、计算机组成与结构、操作系统、数据库系统原理、编译原理、计算机网络" +course_names_list = course_names.split("、") + +# 随机生成10000条学生表数据 +def student_random_record(conn, cursor): + """ + # 随机生成10000条学生表数据 + :return: + """ + year = time.localtime().tm_year # 获取当前系统时间的年份 + num = 1 + class_num = 1 + class_id = 1 + for i in range(10000): + sid = "%d" % year + "%04d" % num + sname = random.choice(last_names_list) + sid + ssex = random.choice(["男", "女"]) + sage = random.randint(15, 35) + sclass = "%d" % year + "%02d" % class_id + sql = f"INSERT INTO student VALUES ('{sid}', '{sname}', '{ssex}', {sage}, '{sclass}')" + cursor.execute(sql) + sid_list.append(sid) + if num == 2500: # 每年学生数2500 + year += 1 + num = 1 + class_id = 1 + if class_num == 30: # 班级学生数30 + class_id += 1 + class_num = 1 + num += 1 + class_num += 1 + conn.commit() + + +def course_random_record(conn, cursor): + """ + 随机生成1000条课程表数据 + :return: + """ + hours = [i for i in range(8, 192 + 1, 8)] + for i in range(1000): + cid = "%03d" % (i + 1) + cname = random.choice(course_names_list)# course_names_list为样例课程名列表 + hour = random.choice(hours) + credit = round(hour / 16, 2) + sql = f"INSERT INTO course (cid, cname, credit, chours) VALUES ('{cid}', '{cname}', {credit}, {hour})" + cursor.execute(sql) + cid_list.append(cid) + conn.commit() + + +def sc_random_record(conn, cursor): + """ + 随机生成10000 * 30条以上选课表数据 + :return: + """ + for sid in sid_list: + year = int(sid[:4]) # 取sid的前四位学年 + for i in range((year - time.localtime().tm_year + 1) * 16): # 学习课程按学年有16、32、48、64门按学年递增分布 + cid = random.choice(cid_list) + score = random.randint(0, 101) + sql = f"INSERT INTO sc(sid, cid, score) VALUES ('{sid}', '{cid}', {score})" + cursor.execute(sql) + conn.commit() + + +if __name__ == '__main__': + # 创建mysql连接 + conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + # 创建游标 + cursor = conn.cursor() + sid_list = [] # 用于存储生成的sid + cid_list = [] # 用于存储生成的cid + student_random_record(conn, cursor) + course_random_record(conn, cursor) + sc_random_record(conn, cursor) + # 关闭数据库连接 + cursor.close() + conn.close() \ No newline at end of file diff --git a/X1/StuSys_X1_4.py b/X1/StuSys_X1_4.py new file mode 100644 index 0000000..c9d5682 --- /dev/null +++ b/X1/StuSys_X1_4.py @@ -0,0 +1,31 @@ +import pymysql + +# 创建mysql连接(连接并打开数据库) +conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) +cursor = conn.cursor() # 游标的定义、打开 +# 字符串型SQL语句的执行 +SQLString = "INSERT INTO student VALUES ('20220001', '张三', '男', 20, '01')" +cursor.execute(SQLString) +SQLString = "INSERT INTO course VALUES ('1001', '数据库', 3, 48, 'T01')" +cursor.execute(SQLString) +SQLString = "INSERT INTO sc VALUES ('20230001', '1001', 85)" +cursor.execute(SQLString) +conn.commit() + +def query_data(table_name): + """ + 游标数据的读写处理,读写游标数据 + :param table_name: 表名称 + :return: 游标数据 + """ + SQLString = f"SELECT * FROM {table_name}" + cursor.execute(SQLString) # 执行查询sql语句 + data = cursor.fetchall() # 获取游标中的数据 + return data + +StudentList = query_data("student") +CourseList = query_data("course") +SCList = query_data("sc") +# 关闭数据库连接 +cursor.close() +conn.close() \ No newline at end of file diff --git a/X2/StuSys_X2_bootstrap.py b/X2/StuSys_X2_bootstrap.py new file mode 100644 index 0000000..6a1f77e --- /dev/null +++ b/X2/StuSys_X2_bootstrap.py @@ -0,0 +1,214 @@ +from tkinter import Frame +import tkinter.font as tkFont + +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql +from ttkbootstrap.tableview import Tableview + +from BaseWindow import BaseWindow + + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + +conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + +class LoadElement(Frame): + def __init__(self, master, table_name): + super().__init__(master) + self.master = master + self.table_name = table_name + self.TableList = pd.read_sql(f"select * from {self.table_name} limit 0", conn) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.create_widget() + self.create_tree_widget() + + def create_widget(self): + # 创建装载按钮 + label = Label(self, width=10, font=self.font_style, text=self.table_name, style="inverse-secondary") + label.grid(column=0, row=0) + Button(self, text="装载", width=10, command=self.load).grid(column=1, row=0, padx=5, sticky=NSEW) + + def create_tree_widget(self): + frame = Frame(self, width=50, height=220) + frame.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=5) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = self.TableList.keys().tolist() + style = ttk.Style() + style.configure("Custom.Treeview.Heading", font=("宋体", 15)) + style.configure("Custom.Treeview", rowheight=30, font=("宋体", 15)) + tree = ttk.Treeview(frame, columns=columns, show="headings", style="Custom.Treeview", selectmode=BROWSE) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, width=80) + if columns.index(i) == 1 or columns.index(i) == 0: + tree.column(i, anchor=CENTER, width=120) + for row in self.TableList.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + y_scrollbar = ttk.Scrollbar(self, orient='vertical', command=tree.yview) + x_scrollbar = ttk.Scrollbar(frame, orient="horizontal", command=tree.xview) + tree.configure(yscrollcommand=y_scrollbar.set) + tree.config(height=6) + tree.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=5) + y_scrollbar.grid(row=1, column=3, sticky='ns') + x_scrollbar.grid(row=2, column=0, columnspan=2, sticky='ew') + frame.grid_propagate(False) + + def load(self): + """ + 加载数据 + :return: + """ + SQLString = f"select * from {self.table_name}" + # 执行SQL语句 并返回列表数据 + self.TableList = pd.read_sql(SQLString, conn) + # 调用X2界面函数将self.TableList数据展示出来 + self.create_tree_widget() + + +class FormElement(Frame): + def __init__(self, master): + super().__init__(master) + self.master = master + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.default_query_sql = "select * from student" + self.create_form() + fields_mapping = {'sid': '学号', 'sname': '姓名', 'ssex': '性别', 'sage': '年龄', 'sclass': '班级'} + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn), fields_mapping) + + + def create_form(self): + # 创建表单区域 + self.sql_text = Text(self, width=75, height=4, font=self.font_style) + self.sql_text.grid(row=0, column=0, rowspan=2) + Button(self, text="\n\n执行SQL\n\n", command=self.execute_sql, width=7, style=INFO, compound=TOP).grid(column=1, row=0, rowspan=2, padx=10) + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + """ + 执行sql方法 + :return: + """ + # 获取text组件中用户输入的值 + sql = get_text_content(self.sql_text).lower().strip() + print(sql) + + def create_treeview(self, data_frame,fields_mapping): + """ + 创建数据列表展示组件 + :param data_frame: + :return: + """ + frame = Frame(self, height=700) # 创建一个 Frame (框架) 组件,作为树形视图的容器 + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW) + # 这两行代码使得框架内的行和列可以随着窗口大小的改变而伸缩。 + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + # columns = data_frame.keys().tolist() + # 使用字段名映射将列名转换为中文 + columns = [fields_mapping.get(col, col) for col in data_frame.keys().tolist()] + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, + selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: # 通过循环,为每一列设置标题(列名) + tree.heading(column=i, text=i) + for i in columns: # 通过循环,为每一列设置列宽 + tree.column(i, anchor=CENTER, minwidth=100, width=100) + for row in data_frame.itertuples(): # 循环遍历 DataFrame 的每一行,并将数据插入到树形视图中 + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) # 创建一个垂直滚动条,并将其与树形视图的垂直滚动事件绑定 + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) # 禁止框架自动调整其大小以适应其中的内容 + + +class StuSys_X2(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + + def create_left_plate(self): + # 创建左侧装载区域的组件 + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + + def create_right_plate(self): + # 创建右侧表单以及数据展示的组件 + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame) + form_element.pack(side=TOP, pady=10, anchor=NE) + + +# if __name__ == '__main__': +# """ +# minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar +# cyborg, vapor, simplex, cerculean, +# """ +# style = "morph" +# root = Window(themename=style) +# screenwidth = root.winfo_screenwidth() +# screenheight = root.winfo_screenheight() +# root.columnconfigure(0, weight=1) +# root.rowconfigure(1, weight=1) +# root_attr = { +# "width": screenwidth * 0.83, +# "height": screenheight * 0.85, +# } +# alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, +# (screenheight - root_attr['height']) / 2) +# root.geometry(alignstr) +# root.resizable(width=False, height=False) +# app = StuSys_X2(root, root_attr) +# +# ttk.Style().configure("TButton", font="-size 18") +# root.mainloop() + + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + # "width": screenwidth * 0.83, + # "height": screenheight * 0.85, + "width": screenwidth * 0.61, + "height": screenheight * 0.63, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + app = StuSys_X2(root, root_attr) + + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() \ No newline at end of file diff --git a/X2/__pycache__/StuSys_X2_bootstrap.cpython-37.pyc b/X2/__pycache__/StuSys_X2_bootstrap.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8cb4a08978b4d5f8aaa86749fad03cb0beb3ff2 GIT binary patch literal 7511 zcmbtZ+izUQeLnX++zYv+C{omwwk0=fTZ|;Ph@%>^V_C9;s+420P_U4@UF{r_yF7c* zoU^95ShfME!gd-qDO@KA90yA@MctweTC^z8xPIwh(8prXr#4c|^rbHWiahoE=Ikz) zqF|)xSL<8Cxy(*NKwr+3}FZ}H0oy2G?}+T zt8Nz^owq}GIjM7t9@^|M)i3+SG2J&^Oyli@nR>RE)nnW+SI-r5$a^An-zbg;>Dq+w z#h6HojL3@Ij$6#XW{7byao-RVfw^rLCsEFeNt7pbc?#tzaRlWfK@ROlf@v|mZhgm; zE8=MJXfP8T6*D_#aW;yGIEWOyype<$AD)ocRpM*mC(! z7`$B#Hc&{vQjUUK)rM$pR3IMx@a-U7MT(|Dx<(IT6V|TPGleajT~6;VcI*oa7nB_| zgfi2=H0KMJvR8vxrDV_w%as7rJ8^I?{!2qkA_Jbe&!-Mz#{Pt4ZUfPV} zpnm)7m->a$*DsasG@Ef0%W`X>wW;!$uEZ%ym1ZLj8u0{|WPuo_90yg7M1Pg4Y_46n zcoBO zIPKuE`HhN~)q@=rM*C<(C3)GICo-0tU*&jllAK9_D%lcI8*T(p9 z;qI`U?w7rOIRjy3sRMZDv@RG}Olq++9tB}giRYi0Uy;rFe8-;;tMzI;f1#7R(XLcQ zdHyw7Zirxy5{D?gm2$lrZYn3Lc7i>ccVS$)QM*M>mP*w|H7=EuS1&_`Ql-JqFeo*k zXv%7V!!js~Qgk;|4n)`JE8UGMnC->u*C9>iXqsL@z7)lqVW2X1+Hu@$lvt&56-*Ha zrH!hfQcd-Xu?z-v1sjVC!W9XRW5_dHA+)EUqo#_!dEev)xv<7M$UD#Em=yi}7tkr^{a4ca7d&k{^0BaPA7K>@b4*Gby7c^tX zL7R`ZvDg#o9qsNQl+2<$f%!U<)yCU_jDqt~0A7i*+$=cC#lGV;<&YOLgKpqGnIvhQ z6i=lYw(AXL%jQPgL)~Y8_J^N+`f0(|o#k^Jk*YN7b;xv&WA>G!$(IF!yc5H~vuVr9^7UDxL&WcG0 z*131QYrSf`HMQk-om#Hzc3m;Wv3I|9%eeQtZhKj`jd$I6LL3p(oT+Q|@?CcqD_*yv ze;bzEbxVGXd6K?IlfHL9#!Q!?Om1&-*TA=)d(S|hDKQft(Jluu<-Q+J3nxDMuCZ-y zV?EoZnB#Zu{?9G0dIsut9Ajn?BkV0t*O=lYYL4le6msdVSDO>3cIaoE+HrAOoayIH zaP1&py&8Ev&&Z;8lR_CD2I(nrmI~Z8dnd#>`Yb{J^7P`~C5UeC-$9@pTKl}Upt`yi zOEze&-J>bV=h?;88mM(qr4vn#TIGiP4K!-K+=MB68+wAy?A3M@H|q<_Fnxxth1cO* zs*Tlxr4|3dkN@bWpT57x&`>ZXgG^`Qkr8|J5HOlC7)yUu?5F&-WTprP2VrD}0SK4xDihFM)(|P4aWvwaocK7aafKj2T@!?(>M2{fpAi4^-@m6-r zd>6c%GycT7>n!z+hUSCCSqP?P6bTOOLUr5$Cw@ zV%V&d!{`b!gW+(PUaKq-j+Bd#AHewEE{E+PQa&6I+(0>`XKBhRy2y+8j!I*H)ed|R znoKpm8C7I63RJeISS6ogZ)ZK&j1W+o+@iAMcwM})=K73YVsz(p4luV z493*O%)R}BR)>LV=#W-G|8qzY&C7s`okrr%N6MSiR@$60)5x7fOWu4Ar75&zb!p1% zoc?_EIi$xr{4q4>pk{n%d}M8zvDve_W^8L@f{@p9hv?I8QvuTR{pZ0qdx%aCKls~+ zJ3k&)UY0@JmW|89ibp}pV!_jqNX}y}`2@+6Bow|R2l|1iIJWe)8%wc-Q%DR)Mt5)8f#G*eR9Qt58H940LqMo30C{cXvq zRj!XWDnS?yFo!m1Q$EX{dJ(h85mrTvalV;N`<{PNvbKUWeC&Si{{=d)H)VYQI%!;d z_$G$o2O>JE!=RJyiJ-Fv(8-XSgxVb!wO*X6`3$)XvnY@C%jtd@M=jJI0G{!9Z2|!e zbu~|9cdTKc$SukVd|&2CCP5CPbvea0`b|lmNdh-H1M&z^mB&yA1(;*|aT1NDjvmCh zQQQ{rW^i6M?6Q!TC)tyLP{T&$@F<{Ct zhkA_a`67p2W4i!8I^d5l?)?_Nvd0hykN+HAIt=LetE0VqDQOx81Dp$+8;tU8+C)12 z@V&qIZ1-C*+;n=6$_Y@w;Hu+JGNE>lJ|kbV-4F?opo~XRtlZ`pp3+v4@cj2ng|u>( zacI;+Q$8f5&yZ3_nHSJSWrBM_rH#XdKA?Pc@%l|=FW-DauAx!>J_y7^fcvO3`2*Ay zk+dBf)-+t|S+g@cDwz>gIN(ERf?7C)A{0)|+=llAKDB{MO&l0d26IiIDXUGVKJi$P_i zh%z-i#E1hM8(~>x;8&<|L&*LHba0?`JJuGCvD7?h5+FJtyQcwrqJM<%&?NNWiD^(W z89oTvw`_VC9E0uTA}1b$CVE>=oa&{~3J6}yXno9zaXk;q6Cw|$W-;3&wHC15*09|J z*v)mluGfd{-vQV@t=nd{*f!qvG;Aku$GE$HjrJD+Z}THid{P{Zr!*9w5wn2eM?@-~ z9)aS=G!*~WTLjhw&JOl#1E6C*?Bpm86a?opLnxlVg5QuCl3co=rx4t z@F@gTpAx&vlN-DYU{l_0sKKi0?$JJo({-(A0frf+Z}+5+JC7a!vU z2<-HM<*`^?ehniv>Xb{!9e~K1#e^+#nN61b9p;J1v65TN(+wSh+SeBgbB`cuN&S&; zkuWUC63Oq8XfBg?l2$M8kPzU>fJC!*g*p1w#4}cztC6gegd}y6Cdplp0mx17tDcl> z)JhOBrRDFkMQtKST^azmte^77Bx}jV;bZr65#!;na%-q> z3q9C*3Wo}PA&NWD19yc~SWX)~2{M3fU0lV&eHx4(`i&UU56tEw6lsWY)MP&%g~3W( z!mVr^3~$mTPv=P;6iJ6W#wO*I<5&)MzpwD**n3=v2f_mfFv-+#&4&>Q7tO9$k)ke0 z67=AsErA2Dur!vmQMPMN?BZrj->D`(leNO##u0;;I4IrZ>zc*;%p{|W9I%P$b!dPNrWS0Cc zN2E1(wWH=(wayGETBZLLZh`gqA6JlyIFvL3zplq4WV!O>R^hD^1>j z1VIwfRc5p>HQJus>8WhepQdV$2dz-C;cuTy?Gtgd2*$gKv=dJxM^GzZ`& z|EZzua;vo;BLOiW(y-ZVjcDD_O)CGzEk-V1)2x-XeS6xwk~ Z`MI>~Kr`8j7-xCt$?KXlN@;7#{9gyG@Du<5 literal 0 HcmV?d00001 diff --git a/X2/__pycache__/StuSys_X2_bootstrap.cpython-39.pyc b/X2/__pycache__/StuSys_X2_bootstrap.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de4214c99770dd22af63cc6a9d37cd2c6e4052bc GIT binary patch literal 7749 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 '{self.start_age.get()}')" + if self.end_age.get() != "": + SQLString += f" and (sage < '{self.end_age.get()}')" + if SQLString == "select * from student where 1=1": + SQLString = "select * from student" + SQLString = SQLString.replace("1=1 and", "") + if (self.sid_var and self.ssex_var and self.sage_var and self.sclass_var and self.sname_var == 0): + pass + else: + data = [] + data.append("sid")if self.sid_var.get() == 1 else "" + data.append("sname")if self.sname_var.get() == 1 else "" + data.append("ssex")if self.ssex_var.get() == 1 else "" + data.append("sage")if self.sage_var.get() == 1 else "" + data.append("sclass")if self.sclass_var.get() == 1 else "" + SQLString = SQLString.replace("select *", f"select {', '.join(data)} ") + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, SQLString) + + +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + + def create_left_plate(self): + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10, fill=BOTH) + form_element = FormElement(self.right_frame) + form_element.pack(side=TOP, pady=10, anchor=NE, fill=BOTH) + + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.83, + "height": screenheight * 0.85, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + app = StuSys_X4(root, root_attr) + + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/StuSys_X5_11.py b/X5/StuSys_X5_11.py new file mode 100644 index 0000000..7e968b8 --- /dev/null +++ b/X5/StuSys_X5_11.py @@ -0,0 +1,248 @@ +from tkinter import Frame +import tkinter.font as tkFont + +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql +from ttkbootstrap.toast import ToastNotification + +from BaseWindow import BaseWindow +from X2.StuSys_X2_bootstrap import LoadElement + + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + + +class FormElement(Frame): + def __init__(self, master): + super().__init__(master) + self.master = master + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.default_query_sql = "select * from student" + self.create_form() + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn)) + + + def create_form(self): + self.sid_var = IntVar()#学号 + self.sname_var = IntVar()#姓名 + self.sclass_var = IntVar()#班级 + self.ssex_var = IntVar()#性别 + self.sage_var = IntVar()#年龄自 + self.score_var = IntVar()#成绩大于 + self.courseId_var = IntVar()#课号 + self.cname_var = IntVar()#课名 + self.credit_var = IntVar() + self.chours_var = IntVar() + + # 表明标签:学生/student + Label(self, text="学生/student", font=("Lucida Grande", 20), style="inverse").grid(row=0, column=0, sticky=W) + # 学号标签 + Label(self, text="学号", font=self.font_style).grid(row=1, column=0, sticky=E) + # 创建复选框,表示选择条件的选择状态,并将变量进行关联 + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sid_var).grid(row=1, column=1, sticky=W) + # 选择条件文本框 + self.sid = Entry(self, width=20, font=self.font_style) + self.sid.grid(row=1, column=2, sticky=W) + # ...其他字段部分的创建类似,以下省略 + # 姓名 + Label(self, text="姓名", font=self.font_style).grid(row=1, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sname_var).grid(row=1, column=4, sticky=W) + self.sname = Entry(self, width=20, font=self.font_style) + self.sname.grid(row=1, column=5, sticky=W) + + Label(self, text="班级", font=self.font_style).grid(row=2, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sclass_var).grid(row=2, column=1, sticky=W) + self.sclass = Entry(self, width=20, font=self.font_style) + self.sclass.grid(row=2, column=2, sticky=W) + Label(self, text="性别", font=self.font_style).grid(row=2, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.ssex_var).grid(row=2, column=4, sticky=W) + self.ssex = Entry(self, width=20, font=self.font_style) + self.ssex.grid(row=2, column=5, sticky=W, pady=10) + + Label(self, text="年龄自", font=self.font_style).grid(row=3, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sage_var).grid(row=3, column=1, sticky=W) + self.start_age = Entry(self, width=20, font=self.font_style) + self.start_age.grid(row=3, column=2, sticky=W) + Label(self, text="到", font=self.font_style).grid(row=3, column=3, sticky=E) + Label(self, text="", font=self.font_style).grid(row=3, column=4, sticky=W) + self.end_age = Entry(self, width=20, font=self.font_style) + self.end_age.grid(row=3, column=5, sticky=W, pady=10) + + Label(self, text="课程/course", font=("Lucida Grande", 20), style="inverse").grid(row=4, column=0, sticky=W) + Label(self, text="课号", font=self.font_style).grid(row=5, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.courseId_var).grid(row=5, column=1, sticky=W) + self.course_id = Entry(self, width=20, font=self.font_style) + self.course_id.grid(row=5, column=2, sticky=W) + Label(self, text="课名", font=self.font_style).grid(row=5, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.cname_var).grid(row=5, column=4, sticky=W) + self.course_name = Entry(self, width=20, font=self.font_style) + self.course_name.grid(row=5, column=5, sticky=W, pady=10) + + Label(self, text="选课/sc", font=("Lucida Grande", 20), style="inverse").grid(row=6, column=0, sticky=W) + Label(self, text="成绩大于", font=self.font_style).grid(row=7, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.score_var).grid(row=7, column=1, sticky=W) + self.sc_start = Entry(self, width=20, font=self.font_style) + self.sc_start.grid(row=7, column=2, sticky=W) + Label(self, text="小于", font=self.font_style).grid(row=7, column=3, sticky=E) + Label(self, text="", font=self.font_style).grid(row=7, column=4, sticky=W) + self.sc_end = Entry(self, width=20, font=self.font_style) + self.sc_end.grid(row=7, column=5, sticky=W, pady=10) + # 配置并创建一个"构造SQL"按钮 + Button(self, text="\n\n构造SQL\n\n", command=self.make_sql, width=8, + ).grid(column=8, row=0, rowspan=8) + # 创建一个"执行SQL"按钮,用于执行文本框中的SQL命令 + self.sql_text = Text(self, height=3, font=self.font_style, width=75) + self.sql_text.grid(row=8, column=0, rowspan=2, columnspan=7, sticky=W) + Button(self, text="\n执行SQL\n", command=self.execute_sql, width=8, + ).grid(column=8, row=8, rowspan=2, padx=10) + # 插入默认的查询SQL + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + sql = get_text_content(self.sql_text).lower().strip() + if sql.startswith("select"): + data_frame = pd.read_sql(sql, con=self.conn) + self.create_treeview(data_frame) + ToastNotification(message="语句执行成功", + title="提示", + duration=1500, + position=(int(self.winfo_screenwidth() / 2) - 150, 80, "ne"), + bootstyle="success", + icon="").show_toast() + + def create_treeview(self, data_frame): + frame = Frame(self, height=400) + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = data_frame.keys().tolist() + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, + selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, minwidth=100, width=100) + for row in data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) + + + def make_sql(self): + sql = "select * from student where 1=1" + if self.course_id and self.course_name and self.sc_start and self.sc_end != "": + # 如果条件满足,则调整SQL查询以包含多个表 + sql = "select * from student s join sc on sc.sid=s.sid join course c on c.cid=sc.cid" + if self.sid.get() != "": + sql += f" and (s.sid like '{self.sid.get()}')" + if self.sname.get() != "": + sql += f" and (s.sname like '{self.sname.get()}')" + if self.sclass.get() != "": + sql += f" and (s.sclass like '{self.sclass.get()}')" + if self.ssex.get() != "": + sql += f" and (s.ssex like '{self.ssex.get()}')" + if self.start_age.get() != "": + sql += f" and (s.sage > '{self.start_age.get()}')" + if self.end_age.get() != "": + sql += f" and (s.sage < '{self.end_age.get()}')" + if self.course_id.get() != "": + sql += f" and (c.cid like '{self.course_id.get()}')" + if self.course_name.get() != "": + sql += f" and (c.cname like '{self.course_name.get()}')" + if self.sc_start.get() != "": + sql += f" and (sc.score > {self.sc_start.get()})" + if self.sc_end.get() != "": + sql += f" and (sc.score < {self.sc_end.get()})" + else: + if self.sid.get() != "": + sql += f" and (sid like '{self.sid.get()}')" + if self.sname.get() != "": + sql += f" and (sname like '{self.sname.get()}')" + if self.sclass.get() != "": + sql += f" and (sclass like '{self.sclass.get()}')" + if self.start_age.get() != "": + sql += f" and (sage > '{self.start_age.get()}')" + if self.end_age.get() != "": + sql += f" and (sage < '{self.end_age.get()}')" + if sql == "select * from student where 1=1": + sql = "select * from student" + if (self.sid_var and self.ssex_var and self.sage_var and self.sclass_var and self.sname_var and self.score_var and self.cname_var and self.credit_var and self.chours_var == 0): + pass + else: + data = [] + data.append("s.sid")if self.sid_var.get() == 1 else "" + data.append("s.sname")if self.sname_var.get() == 1 else "" + data.append("s.ssex")if self.ssex_var.get() == 1 else "" + data.append("s.sage")if self.sage_var.get() == 1 else "" + data.append("s.sclass")if self.sclass_var.get() == 1 else "" + data.append("sc.score")if self.score_var.get() == 1 else "" + data.append("c.cid")if self.courseId_var.get() == 1 else "" + data.append("c.cname")if self.cname_var.get() == 1 else "" + data.append("c.credit")if self.credit_var.get() == 1 else "" + data.append("c.chours")if self.chours_var.get() == 1 else "" + sql = sql.replace("select *", f"select {', '.join(data)} ") + sql = sql.replace("1=1 and", "")# 如果查询条件未改变,则简化查询语句,移除字符串中无用的部分 + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, sql)# 插入新构造的SQL查询字符串 + +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + + def create_left_plate(self): + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame) + form_element.pack(side=TOP, pady=10, anchor=NE) + + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.83, + "height": screenheight * 0.85, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + app = StuSys_X4(root, root_attr) + + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/StuSys_X5_12.py b/X5/StuSys_X5_12.py new file mode 100644 index 0000000..725cb89 --- /dev/null +++ b/X5/StuSys_X5_12.py @@ -0,0 +1,301 @@ +from tkinter import Frame +import tkinter.font as tkFont + +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql +from ttkbootstrap.toast import ToastNotification + +from BaseWindow import BaseWindow + + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + + +class LoadElement(Frame): + def __init__(self, master, table_name): + super().__init__(master) + self.master = master + self.table_name = table_name + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.data_frame = pd.read_sql(f"select * from {self.table_name} limit 0", self.conn) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.create_widget() + self.select_value(None) + self.create_tree_widget() + + def select_value(self, event): + self.table_name = self.select_stringVar.get() + + def create_widget(self): + data_frame = pd.read_sql("show tables", self.conn) + tables = [i[0] for i in data_frame.values.tolist()] + style = ttk.Style() + self.select_stringVar = StringVar() + self.select_stringVar.set(self.table_name) + combo = ttk.Combobox(self, width=10, textvariable=self.select_stringVar,font=self.font_style, style="TCombobox") + combo["values"] = tables + combo.bind('<>', self.select_value) + combo.grid(column=0, row=0) + Button(self, text="装载", width=10, command=self.load).grid(column=1, row=0, padx=5) + + def create_tree_widget(self): + frame = Frame(self, width=50, height=220) + frame.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=5) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = self.data_frame.keys().tolist() + style = ttk.Style() + style.configure("Custom.Treeview.Heading", font=("宋体", 15)) + style.configure("Custom.Treeview", rowheight=30, font=("宋体", 15)) + tree = ttk.Treeview(frame, columns=columns, show="headings", style="Custom.Treeview", selectmode=BROWSE) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, width=80) + if columns.index(i) == 1 or columns.index(i) == 0: + tree.column(i, anchor=CENTER, width=120) + for row in self.data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + y_scrollbar = ttk.Scrollbar(self, orient='vertical', command=tree.yview) + x_scrollbar = ttk.Scrollbar(frame, orient="horizontal", command=tree.xview) + tree.configure(yscrollcommand=y_scrollbar.set) + tree.config(height=6) + tree.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=5) + y_scrollbar.grid(row=1, column=3, sticky='ns') + x_scrollbar.grid(row=2, column=0, columnspan=2, sticky='ew') + frame.grid_propagate(False) + + def load(self): + # 加载数据 + self.data_frame = pd.read_sql(f"select * from {self.table_name}", self.conn) + self.create_tree_widget() + + +class FormElement(Frame): + def __init__(self, master): + super().__init__(master) + self.master = master + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.default_query_sql = "select * from student" + self.create_form() + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn)) + + + def create_form(self): + self.sid_var = IntVar() + self.sname_var = IntVar() + self.sclass_var = IntVar() + self.ssex_var = IntVar() + self.sage_var = IntVar() + self.score_var = IntVar() + self.courseId_var = IntVar() + self.cname_var = IntVar() + self.credit_var = IntVar() + self.chours_var = IntVar() + Label(self, text="学生/student", font=("Lucida Grande", 20), style="inverse").grid(row=0, column=0, sticky=W) + Label(self, text="学号", font=self.font_style).grid(row=1, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sid_var).grid(row=1, column=1, sticky=W) + self.sid = Entry(self, width=20, font=self.font_style) + self.sid.grid(row=1, column=2, sticky=W) + Label(self, text="姓名", font=self.font_style).grid(row=1, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sname_var).grid(row=1, column=4, sticky=W) + self.sname = Entry(self, width=20, font=self.font_style) + self.sname.grid(row=1, column=5, sticky=W) + + Label(self, text="班级", font=self.font_style).grid(row=2, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sclass_var).grid(row=2, column=1, sticky=W) + self.sclass = Entry(self, width=20, font=self.font_style) + self.sclass.grid(row=2, column=2, sticky=W) + Label(self, text="性别", font=self.font_style).grid(row=2, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.ssex_var).grid(row=2, column=4, sticky=W) + self.ssex = Entry(self, width=20, font=self.font_style) + self.ssex.grid(row=2, column=5, sticky=W, pady=10) + + Label(self, text="年龄自", font=self.font_style).grid(row=3, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sage_var).grid(row=3, column=1, sticky=W) + self.start_age = Entry(self, width=20, font=self.font_style) + self.start_age.grid(row=3, column=2, sticky=W) + Label(self, text="到", font=self.font_style).grid(row=3, column=3, sticky=E) + Label(self, text="", font=self.font_style).grid(row=3, column=4, sticky=W) + self.end_age = Entry(self, width=20, font=self.font_style) + self.end_age.grid(row=3, column=5, sticky=W, pady=10) + + Label(self, text="课程/course", font=("Lucida Grande", 20), style="inverse").grid(row=4, column=0, sticky=W) + Label(self, text="课号", font=self.font_style).grid(row=5, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.courseId_var).grid(row=5, column=1, sticky=W) + self.course_id = Entry(self, width=20, font=self.font_style) + self.course_id.grid(row=5, column=2, sticky=W) + Label(self, text="课名", font=self.font_style).grid(row=5, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.cname_var).grid(row=5, column=4, sticky=W) + self.course_name = Entry(self, width=20, font=self.font_style) + self.course_name.grid(row=5, column=5, sticky=W, pady=10) + + Label(self, text="选课/sc", font=("Lucida Grande", 20), style="inverse").grid(row=6, column=0, sticky=W) + Label(self, text="成绩大于", font=self.font_style).grid(row=7, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.score_var).grid(row=7, column=1, sticky=W) + self.sc_start = Entry(self, width=20, font=self.font_style) + self.sc_start.grid(row=7, column=2, sticky=W) + Label(self, text="小于", font=self.font_style).grid(row=7, column=3, sticky=E) + Label(self, text="", font=self.font_style).grid(row=7, column=4, sticky=W) + self.sc_end = Entry(self, width=20, font=self.font_style) + self.sc_end.grid(row=7, column=5, sticky=W, pady=10) + + Button(self, text="\n\n构造SQL\n\n", command=self.make_sql, width=8, + ).grid(column=8, row=0, rowspan=8) + + self.sql_text = Text(self, height=3, font=self.font_style, width=75) + self.sql_text.grid(row=8, column=0, rowspan=2, columnspan=7, sticky=W) + Button(self, text="\n执行SQL\n", command=self.execute_sql, width=8, + ).grid(column=8, row=8, rowspan=2, padx=10) + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + sql = get_text_content(self.sql_text).lower().strip() + if sql.startswith("select"): + data_frame = pd.read_sql(sql, con=self.conn) + self.create_treeview(data_frame) + ToastNotification(message="语句执行成功", + title="提示", + duration=1500, + position=(int(self.winfo_screenwidth() / 2) - 150, 80, "ne"), + bootstyle="success", + icon="").show_toast() + + def create_treeview(self, data_frame): + frame = Frame(self, height=400) + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = data_frame.keys().tolist() + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, + selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, minwidth=100, width=100) + for row in data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) + + + def make_sql(self): + sql = "select * from student where 1=1" + if self.course_id and self.course_name and self.sc_start and self.sc_end != "": + sql = "select * from student s join sc on sc.sid=s.sid join course c on c.cid=sc.cid" + if self.sid.get() != "": + sql += f" and (s.sid like '{self.sid.get()}')" + if self.sname.get() != "": + sql += f" and (s.sname like '{self.sname.get()}')" + if self.sclass.get() != "": + sql += f" and (s.sclass like '{self.sclass.get()}')" + if self.ssex.get() != "": + sql += f" and (s.ssex like '{self.ssex.get()}')" + if self.start_age.get() != "": + sql += f" and (s.sage > '{self.start_age.get()}')" + if self.end_age.get() != "": + sql += f" and (s.sage < '{self.end_age.get()}')" + if self.course_id.get() != "": + sql += f" and (c.cid like '{self.course_id.get()}')" + if self.course_name.get() != "": + sql += f" and (c.cname like '{self.course_name.get()}')" + if self.sc_start.get() != "": + sql += f" and (sc.score > {self.sc_start.get()})" + if self.sc_end.get() != "": + sql += f" and (sc.score < {self.sc_end.get()})" + else: + if self.sid.get() != "": + sql += f" and (sid like '{self.sid.get()}')" + if self.sname.get() != "": + sql += f" and (sname like '{self.sname.get()}')" + if self.sclass.get() != "": + sql += f" and (sclass like '{self.sclass.get()}')" + if self.start_age.get() != "": + sql += f" and (sage > '{self.start_age.get()}')" + if self.end_age.get() != "": + sql += f" and (sage < '{self.end_age.get()}')" + if sql == "select * from student where 1=1": + sql = "select * from student" + if (self.sid_var and self.ssex_var and self.sage_var and self.sclass_var and self.sname_var and self.score_var and self.cname_var and self.credit_var and self.chours_var == 0): + pass + else: + data = [] + data.append("s.sid")if self.sid_var.get() == 1 else "" + data.append("s.sname")if self.sname_var.get() == 1 else "" + data.append("s.ssex")if self.ssex_var.get() == 1 else "" + data.append("s.sage")if self.sage_var.get() == 1 else "" + data.append("s.sclass")if self.sclass_var.get() == 1 else "" + data.append("sc.score")if self.score_var.get() == 1 else "" + data.append("c.cid")if self.courseId_var.get() == 1 else "" + data.append("c.cname")if self.cname_var.get() == 1 else "" + data.append("c.credit")if self.credit_var.get() == 1 else "" + data.append("c.chours")if self.chours_var.get() == 1 else "" + sql = sql.replace("select *", f"select {', '.join(data)} ") + sql = sql.replace("1=1 and", "") + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, sql) + +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + + def create_left_plate(self): + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame) + form_element.pack(side=TOP, pady=10, anchor=NE) + + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.83, + "height": screenheight * 0.85, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + app = StuSys_X4(root, root_attr) + + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/StuSys_X5_13.py b/X5/StuSys_X5_13.py new file mode 100644 index 0000000..d9b7a54 --- /dev/null +++ b/X5/StuSys_X5_13.py @@ -0,0 +1,315 @@ +from tkinter import Frame, messagebox +import tkinter.font as tkFont + +from pandas import DataFrame +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql +from ttkbootstrap.toast import ToastNotification + +from BaseWindow import BaseWindow + +import warnings +warnings.simplefilter(action='ignore', category=UserWarning) + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + + +class LoadElement(Frame): + def __init__(self, master, table_name): + super().__init__(master) + self.master = master + self.table_name = table_name + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.data_frame = pd.read_sql(f"select * from {self.table_name} limit 0", self.conn) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.create_widget() + self.select_value(None) + self.create_tree_widget() + + def select_value(self, event): + self.table_name = self.select_stringVar.get() + + def get_table(self) -> DataFrame: + TableList = pd.read_sql("show tables", self.conn) + return TableList + + def create_widget(self): + data_frame = self.get_table() + tables = [i[0] for i in data_frame.values.tolist()] + style = ttk.Style() + # 设置字体和字体大小 + style.configure('TCombobox', font=('Arial', 100)) + self.select_stringVar = StringVar() + self.select_stringVar.set(self.table_name) + self.combo = ttk.Combobox(self, width=10, height=1, textvariable=self.select_stringVar, font=self.font_style, style="TCombobox") + self.combo["values"] = tables + self.combo.bind('<>', self.select_value) + self.combo.grid(column=0, row=0) + Button(self, text="装载", width=10, command=self.load).grid(column=1, row=0, padx=5) + + def create_tree_widget(self): + frame = Frame(self, width=50, height=220) + frame.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=5) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = self.data_frame.keys().tolist() + style = ttk.Style() + style.configure("Custom.Treeview.Heading", font=("宋体", 15)) + style.configure("Custom.Treeview", rowheight=30, font=("宋体", 15)) + tree = ttk.Treeview(frame, columns=columns, show="headings", style="Custom.Treeview", selectmode=BROWSE) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, width=80) + if columns.index(i) == 1 or columns.index(i) == 0: + tree.column(i, anchor=CENTER, width=120) + for row in self.data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + y_scrollbar = ttk.Scrollbar(self, orient='vertical', command=tree.yview) + x_scrollbar = ttk.Scrollbar(frame, orient="horizontal", command=tree.xview) + tree.configure(yscrollcommand=y_scrollbar.set) + tree.config(height=6) + tree.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=5) + y_scrollbar.grid(row=1, column=3, sticky='ns') + x_scrollbar.grid(row=2, column=0, columnspan=2, sticky='ew') + frame.grid_propagate(False) + + def load(self): + # 加载数据 + self.data_frame = pd.read_sql(f"select * from {self.table_name}", self.conn) + self.create_tree_widget() + + +class FormElement(Frame): + def __init__(self, master): + super().__init__(master) + self.master = master + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.default_query_sql = "select * from student" + self.create_form() + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn)) + + + def create_form(self): + self.sid_var = IntVar() + self.sname_var = IntVar() + self.sclass_var = IntVar() + self.ssex_var = IntVar() + self.sage_var = IntVar() + self.score_var = IntVar() + self.courseId_var = IntVar() + self.cname_var = IntVar() + self.credit_var = IntVar() + self.chours_var = IntVar() + Label(self, text="学生/student", font=("Lucida Grande", 20), style="inverse").grid(row=0, column=0, sticky=W) + Label(self, text="学号", font=self.font_style).grid(row=1, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sid_var).grid(row=1, column=1, sticky=W) + self.sid = Entry(self, width=20, font=self.font_style) + self.sid.grid(row=1, column=2, sticky=W) + Label(self, text="姓名", font=self.font_style).grid(row=1, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sname_var).grid(row=1, column=4, sticky=W) + self.sname = Entry(self, width=20, font=self.font_style) + self.sname.grid(row=1, column=5, sticky=W) + + Label(self, text="班级", font=self.font_style).grid(row=2, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sclass_var).grid(row=2, column=1, sticky=W) + self.sclass = Entry(self, width=20, font=self.font_style) + self.sclass.grid(row=2, column=2, sticky=W) + Label(self, text="性别", font=self.font_style).grid(row=2, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.ssex_var).grid(row=2, column=4, sticky=W) + self.ssex = Entry(self, width=20, font=self.font_style) + self.ssex.grid(row=2, column=5, sticky=W, pady=10) + + Label(self, text="年龄自", font=self.font_style).grid(row=3, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.sage_var).grid(row=3, column=1, sticky=W) + self.start_age = Entry(self, width=20, font=self.font_style) + self.start_age.grid(row=3, column=2, sticky=W) + Label(self, text="到", font=self.font_style).grid(row=3, column=3, sticky=E) + Label(self, text="", font=self.font_style).grid(row=3, column=4, sticky=W) + self.end_age = Entry(self, width=20, font=self.font_style) + self.end_age.grid(row=3, column=5, sticky=W, pady=10) + + Label(self, text="课程/course", font=("Lucida Grande", 20), style="inverse").grid(row=4, column=0, sticky=W) + Label(self, text="课号", font=self.font_style).grid(row=5, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.courseId_var).grid(row=5, column=1, sticky=W) + self.course_id = Entry(self, width=20, font=self.font_style) + self.course_id.grid(row=5, column=2, sticky=W) + Label(self, text="课名", font=self.font_style).grid(row=5, column=3, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.cname_var).grid(row=5, column=4, sticky=W) + self.course_name = Entry(self, width=20, font=self.font_style) + self.course_name.grid(row=5, column=5, sticky=W, pady=10) + + Label(self, text="选课/sc", font=("Lucida Grande", 20), style="inverse").grid(row=6, column=0, sticky=W) + Label(self, text="成绩大于", font=self.font_style).grid(row=7, column=0, sticky=E) + Checkbutton(self, onvalue=1, offvalue=0, variable=self.score_var).grid(row=7, column=1, sticky=W) + self.sc_start = Entry(self, width=20, font=self.font_style) + self.sc_start.grid(row=7, column=2, sticky=W) + Label(self, text="小于", font=self.font_style).grid(row=7, column=3, sticky=E) + Label(self, text="", font=self.font_style).grid(row=7, column=4, sticky=W) + self.sc_end = Entry(self, width=20, font=self.font_style) + self.sc_end.grid(row=7, column=5, sticky=W, pady=10) + + Button(self, text="\n\n构造SQL\n\n", command=self.make_sql, width=8, + ).grid(column=8, row=0, rowspan=8) + + self.sql_text = Text(self, height=3, font=self.font_style, width=75) + self.sql_text.grid(row=8, column=0, rowspan=2, columnspan=7, sticky=W) + Button(self, text="\n执行SQL\n", command=self.execute_sql, width=8, + ).grid(column=8, row=8, rowspan=2, padx=10) + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + cursor = self.conn.cursor() + try: + sql = get_text_content(self.sql_text).lower().strip() + cursor.execute(sql) + if sql.startswith("select"): + data_frame = pd.read_sql(sql, con=self.conn) + self.create_treeview(data_frame) + ToastNotification(message="语句执行成功", + title="提示", + duration=1500, + position=(int(self.winfo_screenwidth() / 2) - 150, 80, "ne"), + bootstyle="success", + icon="").show_toast() + except pymysql.Error as e: + messagebox.showerror(str(e.args[0]), str(e.args[1])) + finally: + cursor.close() + + def create_treeview(self, data_frame): + frame = Frame(self, height=400) + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = data_frame.keys().tolist() + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, + selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, minwidth=100, width=100) + for row in data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) + + + def make_sql(self): + sql = "select * from student where 1=1" + if self.course_id and self.course_name and self.sc_start and self.sc_end != "": + sql = "select * from student s join sc on sc.sid=s.sid join course c on c.cid=sc.cid" + if self.sid.get() != "": + sql += f" and (s.sid like '{self.sid.get()}')" + if self.sname.get() != "": + sql += f" and (s.sname like '{self.sname.get()}')" + if self.sclass.get() != "": + sql += f" and (s.sclass like '{self.sclass.get()}')" + if self.ssex.get() != "": + sql += f" and (s.ssex like '{self.ssex.get()}')" + if self.start_age.get() != "": + sql += f" and (s.sage > '{self.start_age.get()}')" + if self.end_age.get() != "": + sql += f" and (s.sage < '{self.end_age.get()}')" + if self.course_id.get() != "": + sql += f" and (c.cid like '{self.course_id.get()}')" + if self.course_name.get() != "": + sql += f" and (c.cname like '{self.course_name.get()}')" + if self.sc_start.get() != "": + sql += f" and (sc.score > {self.sc_start.get()})" + if self.sc_end.get() != "": + sql += f" and (sc.score < {self.sc_end.get()})" + else: + if self.sid.get() != "": + sql += f" and (sid like '{self.sid.get()}')" + if self.sname.get() != "": + sql += f" and (sname like '{self.sname.get()}')" + if self.sclass.get() != "": + sql += f" and (sclass like '{self.sclass.get()}')" + if self.start_age.get() != "": + sql += f" and (sage > '{self.start_age.get()}')" + if self.end_age.get() != "": + sql += f" and (sage < '{self.end_age.get()}')" + if sql == "select * from student where 1=1": + sql = "select * from student" + if (self.sid_var and self.ssex_var and self.sage_var and self.sclass_var and self.sname_var and self.score_var and self.cname_var and self.credit_var and self.chours_var == 0): + pass + else: + data = [] + data.append("s.sid")if self.sid_var.get() == 1 else "" + data.append("s.sname")if self.sname_var.get() == 1 else "" + data.append("s.ssex")if self.ssex_var.get() == 1 else "" + data.append("s.sage")if self.sage_var.get() == 1 else "" + data.append("s.sclass")if self.sclass_var.get() == 1 else "" + data.append("sc.score")if self.score_var.get() == 1 else "" + data.append("c.cid")if self.courseId_var.get() == 1 else "" + data.append("c.cname")if self.cname_var.get() == 1 else "" + data.append("c.credit")if self.credit_var.get() == 1 else "" + data.append("c.chours")if self.chours_var.get() == 1 else "" + sql = sql.replace("select *", f"select {', '.join(data)} ") + sql = sql.replace("1=1 and", "") + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, sql) + +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + + def create_left_plate(self): + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame) + form_element.pack(side=TOP, pady=10, anchor=NE) + + +if __name__ == '__main__': + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.83, + "height": screenheight * 0.85, + } + # 配置界面大小 + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) # 禁止用户调整界面大小 + app = StuSys_X4(root, root_attr) + app.create_left_plate() + app.create_right_plate() + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/StuSys_X5_14.py b/X5/StuSys_X5_14.py new file mode 100644 index 0000000..2debb56 --- /dev/null +++ b/X5/StuSys_X5_14.py @@ -0,0 +1,309 @@ +import uuid +from tkinter import messagebox +import tkinter.font as tkFont + +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql + +from BaseWindow import BaseWindow + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + + +class LoadElement(Frame): + def __init__(self, master, table_name): + super().__init__(master) + self.master = master + self.table_name = table_name + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.data_frame = pd.read_sql(f"select * from {self.table_name} limit 0", self.conn) + #左侧三框框数据 + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.create_widget() + self.select_value(None) + self.create_tree_widget() + + def select_value(self, event): + self.table_name = self.select_stringVar.get() + + def create_widget(self): + data_frame = pd.read_sql("show tables", self.conn) + tables = [i[0] for i in data_frame.values.tolist()] + style = ttk.Style() + # 设置字体和字体大小 + style.configure('TCombobox', font=('Arial', 100)) + self.select_stringVar = StringVar() + self.select_stringVar.set(self.table_name) + combo = ttk.Combobox(self, width=10, height=1, textvariable=self.select_stringVar, font=self.font_style, + style="TCombobox") + combo["values"] = tables + combo.bind('<>', self.select_value) + combo.grid(column=0, row=0) + Button(self, text="装载", width=9, command=self.load).grid(column=1, row=0, padx=5) + + def create_tree_widget(self): + # 创建画布,用于展示装载后的数据 + frame = Frame(self, width=50, height=250) + frame.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=5) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = self.data_frame.keys().tolist() + style = ttk.Style() + style.configure("Custom.Treeview.Heading", font=("宋体", 15)) + style.configure("Custom.Treeview", rowheight=30, font=("宋体", 15)) + tree = ttk.Treeview(frame, columns=columns, show="headings", style="Custom.Treeview", selectmode=BROWSE) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, width=80) + if columns.index(i) == 1 or columns.index(i) == 0: + tree.column(i, anchor=CENTER, width=120) + for row in self.data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + y_scrollbar = ttk.Scrollbar(self, orient='vertical', command=tree.yview) + x_scrollbar = ttk.Scrollbar(frame, orient="horizontal", command=tree.xview) + tree.configure(yscrollcommand=y_scrollbar.set) + tree.config(height=6) + tree.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=5) + y_scrollbar.grid(row=1, column=3, sticky='ns') + x_scrollbar.grid(row=2, column=0, columnspan=2, sticky='ew') + frame.grid_propagate(False) + + def load(self): + # 加载数据 + self.data_frame = pd.read_sql(f"select * from {self.table_name}", self.conn) + self.create_tree_widget() + + +class FormElement(Frame): + def __init__(self, master, node): + super().__init__(master) + self.node = node + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.table_names = [] + self.form_content = {} + self.get_table_names() + self.table_name = self.table_names[0] + self.default_query_sql = f"SELECT * FROM {self.table_name}" + self.create_form() + self.select_table(None) + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn)) + + def get_table_names(self): + """ + 获取该数据库下所有的表 + :return: + """ + data_frame = pd.read_sql("show tables", self.conn) + self.table_names = [i[0] for i in data_frame.values.tolist()] + + def select_table(self, event): + """ + 当下拉框选择表之后,触发该函数,并将tableName改为选择的tableName + :param event: + :return: + """ + for value in self.form_content.values(): + value[0].grid_forget() + value[2].grid_forget() + value[3].grid_forget() + self.form_content.clear() + self.table_name = self.select_table_name.get() + self.create_form() + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, f"SELECT * FROM {self.table_name}") + + def get_field_names(self): + """ + 获取所有数据表的所有字段 + :return: 返回表内的所有字段 + """ + data_frame = pd.read_sql(f"desc {self.table_name}", self.conn) + """ + field_names = [] + for field in data_frame["Field"]: + field_names.append(f"{self.table_name}.{field}") + return field_names + """ + return data_frame["Field"].values.tolist() + + def create_form(self): + """ + 创建表单区域,根据数据表自动生成表单 + :return: + """ + self.select_table_name = StringVar() + self.select_table_name.set(self.table_name) + combo = ttk.Combobox(self, width=8, height=1, textvariable=self.select_table_name, font=self.font_style, + style="TCombobox") + combo["values"] = self.table_names + combo.bind('<>', self.select_table) + combo.grid(column=0, row=0, sticky=W) + fields = self.get_field_names() + num_fields = len(fields) + num_rows = (num_fields + 1) // 2 + for i in range(num_rows): + for j in range(2): + field_idx = i * 2 + j + if field_idx >= num_fields: + break + field_name = fields[field_idx] + label = Label(self, text=field_name, font=self.font_style) + label.grid(row=i + 1, column=j * 2, padx=5, pady=5, sticky=W) + checkbutton_var = IntVar() + checkbutton = Checkbutton(self, text='', variable=checkbutton_var) + checkbutton.grid(row=i + 1, column=j * 2, padx=5, pady=5, sticky=E) + entry = Entry(self, font=self.font_style) + entry.grid(row=i + 1, column=j * 2 + 1, padx=5, pady=5, sticky=W) + self.form_content[field_name] = (entry, checkbutton_var, label, checkbutton) + style = Style() + style.configure("custom.TButton", padding=(10, 40, 10, 40)) + Button(self, text="构造SQL", command=self.make_sql, width=8, style="custom.TButton" + ).grid(column=8, row=0, rowspan=8) + + self.sql_text = Text(self, height=3, font=self.font_style, width=62) + self.sql_text.grid(row=8, column=0, rowspan=2, columnspan=7, sticky=W) + Button(self, text="\n执行SQL\n", command=self.execute_sql, width=8, + ).grid(column=8, row=8, rowspan=2, padx=10) + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + cursor = self.conn.cursor() + sql = get_text_content(self.sql_text).lower().strip() + try: + cursor.execute(sql) + if sql.startswith("select"): + data_frame = pd.read_sql(sql, con=self.conn) + self.create_treeview(data_frame) + self.node.message.insert(0, f"{sql}执行成功!共查询到{len(data_frame)}条数据-{uuid.uuid4()}-true") + return + self.node.message.insert(0, f"{sql}执行成功!-{uuid.uuid4()}-true") + except pymysql.Error as e: + messagebox.showerror(str(e.args[0]), str(e.args[1])) + self.node.message.insert(0, f"{sql}执行失败!{e}-{uuid.uuid4()}-false") + finally: + cursor.close() + self.node.update_message() + + def create_treeview(self, data_frame): + frame = Frame(self, height=580) + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW, pady=10) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + unique_columns = data_frame.columns[~data_frame.columns.duplicated()] + columns = unique_columns.tolist() + # 获取查询的列名,将其转换为列表 + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, minwidth=100, width=100) + for row in data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) + + def make_sql(self): + sql = f"SELECT * FROM {self.table_name}" + conditions = [] + select_fields = [] + for field, (entry, checkbox_var, i, j) in self.form_content.items(): + if entry.get(): + conditions.append("{} like '{}'".format(field, entry.get())) + if checkbox_var.get() == 1: + select_fields.append("{}".format(field)) + if conditions: + sql = "SELECT * FROM {} WHERE {}".format(self.table_name, " AND ".join(conditions)) + if select_fields: + sql = sql.replace("*", ",".join(select_fields)) + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, sql) + + +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + self.message = [] + + def create_left_plate(self): + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=RIGHT, anchor=NW, pady=10, padx=10) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + message_frame = Frame(self.right_frame, width=50, height=180) + message_frame.pack(side=TOP, pady=10, fill=BOTH) + self.canvas = Canvas(message_frame, width=280, height=1000, bg="#f0f5fa") + self.canvas.configure(background="#f0f5fa") + y_scrollbar = Scrollbar(message_frame, orient="vertical", command=self.canvas.yview) + x_scrollbar = Scrollbar(message_frame, orient="horizontal", command=self.canvas.xview) + y_scrollbar.pack(side=RIGHT, fill=BOTH) + x_scrollbar.pack(side=BOTTOM, fill=BOTH) + self.canvas.pack(side=TOP, fill=BOTH) + self.canvas.configure(yscrollcommand=y_scrollbar.set) + self.canvas.configure(xscrollcommand=x_scrollbar.set) + + def update_message(self): + self.canvas.delete(ALL) + for message in self.message: + index = self.message.index(message) + self.canvas.create_text(0, 20 * index, anchor="nw", + text=message.split("-")[0], font=("", 15), fill="black" if message.split("-")[-1] == "true" else "red") + self.canvas.update() + self.canvas.configure(scrollregion=self.canvas.bbox("all")) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame, self) + form_element.pack(side=TOP, pady=10, anchor=NE) + + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.88, + "height": screenheight * 0.90, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + + app = StuSys_X4(root, root_attr) + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/StuSys_X5_15.py b/X5/StuSys_X5_15.py new file mode 100644 index 0000000..5716eb4 --- /dev/null +++ b/X5/StuSys_X5_15.py @@ -0,0 +1,335 @@ +import uuid +import random +from tkinter import messagebox +import tkinter.font as tkFont + +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql + +from BaseWindow import BaseWindow + + +import warnings +warnings.simplefilter(action='ignore', category=UserWarning) + +# 添加第三个任务 + + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + + +class LoadElement(Frame): + def __init__(self, master, table_name): + super().__init__(master) + self.master = master + self.table_name = table_name + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.data_frame = pd.read_sql(f"select * from {self.table_name} limit 0", self.conn) + #左侧三框框数据 + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.create_widget() + self.select_value(None) + self.create_tree_widget() + + def select_value(self, event): + self.table_name = self.select_stringVar.get() + + def create_widget(self): + data_frame = pd.read_sql("show tables", self.conn) + tables = [i[0] for i in data_frame.values.tolist()] + style = ttk.Style() + # 设置字体和字体大小 + style.configure('TCombobox', font=('Arial', 100)) + self.select_stringVar = StringVar() + self.select_stringVar.set(self.table_name) + combo = ttk.Combobox(self, width=10, height=1, textvariable=self.select_stringVar, font=self.font_style, + style="TCombobox") + combo["values"] = tables + combo.bind('<>', self.select_value) + combo.grid(column=0, row=0) + Button(self, text="装载", width=9, command=self.load).grid(column=1, row=0, padx=5) + + def create_tree_widget(self): + # 创建画布,用于展示装载后的数据 + frame = Frame(self, width=50, height=250) + frame.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=5) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = self.data_frame.keys().tolist() + style = ttk.Style() + style.configure("Custom.Treeview.Heading", font=("宋体", 15)) + style.configure("Custom.Treeview", rowheight=30, font=("宋体", 15)) + tree = ttk.Treeview(frame, columns=columns, show="headings", style="Custom.Treeview", selectmode=BROWSE) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, width=80) + if columns.index(i) == 1 or columns.index(i) == 0: + tree.column(i, anchor=CENTER, width=120) + for row in self.data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + y_scrollbar = ttk.Scrollbar(self, orient='vertical', command=tree.yview) + x_scrollbar = ttk.Scrollbar(frame, orient="horizontal", command=tree.xview) + tree.configure(yscrollcommand=y_scrollbar.set) + tree.config(height=6) + tree.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=5) + y_scrollbar.grid(row=1, column=3, sticky='ns') + x_scrollbar.grid(row=2, column=0, columnspan=2, sticky='ew') + frame.grid_propagate(False) + + def load(self): + # 加载数据 + self.data_frame = pd.read_sql(f"select * from {self.table_name}", self.conn) + self.create_tree_widget() + + +class FormElement(Frame): + def __init__(self, master, node): + super().__init__(master) + self.node = node + self.data = [] + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.table_names = [] + self.form_content = {} + self.get_table_names() + self.table_name = self.table_names[0] + self.default_query_sql = f"SELECT * FROM {self.table_name}" + self.create_form() + self.select_table(None) + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn)) + + def get_table_names(self): + """ + 获取该数据库下所有的表 + :return: + """ + data_frame = pd.read_sql("show tables", self.conn) + self.table_names = [i[0] for i in data_frame.values.tolist()] + + def select_table(self, event): + """ + 当下拉框选择表之后,触发该函数,并将tableName改为选择的tableName + :param event: + :return: + """ + for value in self.form_content.values(): + value[0].grid_forget() + value[2].grid_forget() + value[3].grid_forget() + self.form_content.clear() + self.table_name = self.select_table_name.get() + self.create_form() + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, f"SELECT * FROM {self.table_name}") + + def get_field_names(self): + """ + 获取所有数据表的所有字段 + :return: 返回表内的所有字段 + """ + data_frame = pd.read_sql(f"desc {self.table_name}", self.conn) + """ + field_names = [] + for field in data_frame["Field"]: + field_names.append(f"{self.table_name}.{field}") + return field_names + """ + return data_frame["Field"].values.tolist() + + def create_form(self): + """ + 创建表单区域,根据数据表自动生成表单 + :return: + """ + self.select_table_name = StringVar() + self.select_table_name.set(self.table_name) + combo = ttk.Combobox(self, width=8, height=1, textvariable=self.select_table_name, font=self.font_style, + style="TCombobox") + combo["values"] = self.table_names + combo.bind('<>', self.select_table) + combo.grid(column=0, row=0, sticky=W) + fields = self.get_field_names() + num_fields = len(fields) + num_rows = (num_fields + 1) // 2 + for i in range(num_rows): + for j in range(2): + field_idx = i * 2 + j + if field_idx >= num_fields: + break + field_name = fields[field_idx] + label = Label(self, text=field_name, font=self.font_style) + label.grid(row=i + 1, column=j * 2, padx=5, pady=5, sticky=W) + checkbutton_var = IntVar() + checkbutton = Checkbutton(self, text='', variable=checkbutton_var) + checkbutton.grid(row=i + 1, column=j * 2, padx=5, pady=5, sticky=E) + entry = Entry(self, font=self.font_style) + entry.grid(row=i + 1, column=j * 2 + 1, padx=5, pady=5, sticky=W) + self.form_content[field_name] = (entry, checkbutton_var, label, checkbutton) + style = Style() + style.configure("custom.TButton", padding=(10, 40, 10, 40)) + Button(self, text="构造SQL", command=self.make_sql, width=8, style="custom.TButton" + ).grid(column=8, row=0, rowspan=8) + + self.sql_text = Text(self, height=3, font=self.font_style, width=62) + self.sql_text.grid(row=8, column=0, rowspan=2, columnspan=7, sticky=W) + Button(self, text="\n执行SQL\n", command=self.execute_sql, width=8, + ).grid(column=8, row=8, rowspan=2, padx=10) + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + cursor = self.conn.cursor() + # 获取文本框中的sql语句 + sql = get_text_content(self.sql_text).lower().strip() + try: + cursor.execute(sql) + # 如果是查询语句 + if sql.startswith("select"): + data_frame = pd.read_sql(sql, con=self.conn) + self.create_treeview(data_frame) + self.node.message.insert(0, f"{sql}执行成功!共查询到{len(data_frame)}条数据-{uuid.uuid4()}-true") # uuid标识事件的唯一性 + return + # 如果不是查询语句 + self.node.message.insert(0, f"{sql}执行成功!-{uuid.uuid4()}-true") + except pymysql.Error as e: + messagebox.showerror(str(e.args[0]), str(e.args[1])) + self.node.message.insert(0, f"{sql}执行失败!{e}-{uuid.uuid4()}-false") + finally: + cursor.close() + self.node.update_message() + + def create_treeview(self, data_frame): + frame = Frame(self, height=580) + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW, pady=10) + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + unique_columns = data_frame.columns[~data_frame.columns.duplicated()] + columns = unique_columns.tolist() + # 获取查询的列名,将其转换为列表 + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) + for i in columns: + tree.column(i, anchor=CENTER, minwidth=100, width=100) + for row in data_frame.itertuples(): + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) + + def make_sql(self): + sql = f"SELECT * FROM {self.table_name}" + conditions = [] + select_fields = [] + + condition_statements = [ + "{} LIKE '{}'", + "{} = '{}'", + "NOT ({} != '{}')", + "{} IN ('{}')" + ] + + for field, (entry, checkbox_var, i, j) in self.form_content.items(): + if entry.get(): + + # conditions.append("{} like '{}'".format(field, entry.get())) + # conditions.append("{} = '{}'".format(field, entry.get())) + # conditions.append("NOT ({} != '{}')".format(field, entry.get())) + # conditions.append("{} IN ('{}')".format(field, entry.get())) + conditions.append(random.choice(condition_statements).format(field, entry.get())) + + if checkbox_var.get() == 1: + select_fields.append("{}".format(field)) + if conditions: + sql = "SELECT * FROM {} WHERE {}".format(self.table_name, " AND ".join(conditions)) + print(sql) + if select_fields: + sql = sql.replace("*", ",".join(select_fields)) + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, sql) + + +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + self.message = [] + + def create_left_plate(self): + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=RIGHT, anchor=NW, pady=10, padx=10) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element2 = LoadElement(self.left_frame, "sc") + load_element2.pack(side=TOP, pady=10) + message_frame = Frame(self.right_frame, width=50, height=180) + message_frame.pack(side=TOP, pady=10, fill=BOTH) + self.canvas = Canvas(message_frame, width=280, height=1000, bg="#f0f5fa") + self.canvas.configure(background="#f0f5fa") + y_scrollbar = Scrollbar(message_frame, orient="vertical", command=self.canvas.yview) + x_scrollbar = Scrollbar(message_frame, orient="horizontal", command=self.canvas.xview) + y_scrollbar.pack(side=RIGHT, fill=BOTH) + x_scrollbar.pack(side=BOTTOM, fill=BOTH) + self.canvas.pack(side=TOP, fill=BOTH) + self.canvas.configure(yscrollcommand=y_scrollbar.set) + self.canvas.configure(xscrollcommand=x_scrollbar.set) + + def update_message(self): + self.canvas.delete(ALL) + for message in self.message: + index = self.message.index(message) + self.canvas.create_text(0, 20 * index, anchor="nw", + text=message.split("-")[0], font=("", 15), fill="black" if message.split("-")[-1] == "true" else "red") + self.canvas.update() + self.canvas.configure(scrollregion=self.canvas.bbox("all")) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame, self) + form_element.pack(side=TOP, pady=10, anchor=NE) + + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.88, + "height": screenheight * 0.90, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + + app = StuSys_X4(root, root_attr) + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/StuSys_X5_final.py b/X5/StuSys_X5_final.py new file mode 100644 index 0000000..af14913 --- /dev/null +++ b/X5/StuSys_X5_final.py @@ -0,0 +1,382 @@ +import uuid +import random +from tkinter import messagebox +import tkinter.font as tkFont + +from ttkbootstrap import * +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + +import pandas as pd +import pymysql +from ttkbootstrap.toast import ToastNotification + +from BaseWindow import BaseWindow + +import warnings +warnings.simplefilter(action='ignore', category=UserWarning) + + +def get_text_content(text): + return text.get("0.0", "end").replace("\n", " ") + +class LoadElement(Frame): + def __init__(self, master, table_name): + super().__init__(master) + self.master = master + self.table_name = table_name # 默认装载的表名 + self.data = [] + # self.conn = pymysql.connect(user="root", password="123123", database="stu_sys", host="127.0.0.1", port=3306) + self.conn = pymysql.connect(user="root", password="Wyz010810", database="SCT", host="127.0.0.1", port=3306) + # self.data_frame = pd.read_sql(f"select * from {self.table_name} limit 0", self.conn) + self.data_frame = pd.DataFrame([]) # 创建一个空的 DataFrame。而不是执行获得并限制返回数量为0 + + # 定义字体和按钮的格式 + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.create_widget() + self.select_value(None) + self.create_tree_widget() + + # 获取下拉框中的table_name以供后续装载等使用 + def select_value(self, event): + self.table_name = self.select_stringVar.get() + + # 固定的版本 + def create_widget_label(self): + # 不再需要查询数据库获取表名,也不需要创建下拉框 + # data_frame = pd.read_sql("show tables", self.conn) + # tables = [i[0] for i in data_frame.values.tolist()] + + style = ttk.Style() + # 设置 Label 的字体和字体大小 + style.configure('TLabel', font=('Arial', 20)) # 根据需要调整字体大小 + + # 创建 Label 控件以显示表名 + label = ttk.Label(self, text=self.table_name, font=self.font_style, style='TLabel') + label.grid(column=0, row=0) + # 创建装载按钮 + Button(self, text="装载", width=9, command=self.load).grid(column=1, row=0, padx=5) + + # 创建小控件,包括下拉按钮以及装载按钮 + def create_widget(self): + data_frame = pd.read_sql("show tables", self.conn) + tables = [i[0] for i in data_frame.values.tolist()] + style = ttk.Style() + # 设置字体和字体大小 + style.configure('TCombobox', font=('Arial', 100)) + self.select_stringVar = StringVar() + self.select_stringVar.set(self.table_name) + combo = ttk.Combobox(self, width=10, height=1, textvariable=self.select_stringVar, font=self.font_style, + style="TCombobox") + combo["values"] = tables + combo.bind('<>', self.select_value) + combo.grid(column=0, row=0) + Button(self, text="装载", width=9, command=self.load).grid(column=1, row=0, padx=5) + + # 创建一个带有滚动条并定义好样式的树形视图控件,用于显示查询结果 + def create_tree_widget(self): + # 创建画布,用于展示装载后的数据 + frame = Frame(self, width=50, height=250) + frame.grid(row=1, column=0, columnspan=2, sticky=NSEW, pady=5) + # 设置框架的列和行能够随窗口大小调整而伸缩。 + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + columns = self.data_frame.keys().tolist() + style = ttk.Style() + style.configure("Custom.Treeview.Heading", font=("宋体", 15)) + style.configure("Custom.Treeview", rowheight=30, font=("宋体", 15)) + tree = ttk.Treeview(frame, columns=columns, show="headings", style="Custom.Treeview", selectmode=BROWSE) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) # 为每个列设置标题 + for i in columns: + tree.column(i, anchor=CENTER, width=80) # 为每个列设置对齐方式 + if columns.index(i) == 1 or columns.index(i) == 0: + tree.column(i, anchor=CENTER, width=120) + for row in self.data_frame.itertuples(): # 将数据的每一行插入到树形视图中 + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + y_scrollbar = ttk.Scrollbar(self, orient='vertical', command=tree.yview) + x_scrollbar = ttk.Scrollbar(frame, orient="horizontal", command=tree.xview) + tree.configure(yscrollcommand=y_scrollbar.set) + tree.config(height=6) + tree.grid(row=0, column=0, columnspan=2, sticky=NSEW, pady=5) + y_scrollbar.grid(row=1, column=3, sticky='ns') + x_scrollbar.grid(row=2, column=0, columnspan=2, sticky='ew') + frame.grid_propagate(False) + + def load(self): + # 加载数据 + self.data_frame = pd.read_sql(f"select * from {self.table_name}", self.conn) + self.create_tree_widget() + + +class FormElement(Frame): + def __init__(self, master, node): + super().__init__(master) + self.node = node + self.data = [] # 好像没用到 + # self.conn = pymysql.connect(user="root", password="123123", database="stu_sys", host="127.0.0.1", port=3306) + self.conn = pymysql.connect(user="root", password="Wyz010810", database="sct", host="127.0.0.1", port=3306) + self.font_style = tkFont.Font(family="Lucida Grande", size=20) + self.button_font = tkFont.Font(family="Lucida Grande", size=10) + self.table_names = [] # 用于存储下拉表单的数据库表名 + self.form_content = {} + self.get_table_names() + self.table_name = self.table_names[0] + self.default_query_sql = f"SELECT * FROM {self.table_name}" + self.create_form() + self.select_table(None) + self.create_treeview(pd.read_sql(self.default_query_sql, con=self.conn)) + + + def select_table(self, event): + """ + 当下拉框选择表之后,触发该函数,并将tableName改为选择的tableName + :param event: + :return: + """ + for value in self.form_content.values(): + value[0].grid_forget() + value[2].grid_forget() + value[3].grid_forget() + self.form_content.clear() + self.table_name = self.select_table_name.get() + self.create_form() + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, f"SELECT * FROM {self.table_name}") + + def get_table_names(self): + """ + 获取该数据库下所有的表 + :return: + """ + data_frame = pd.read_sql("show tables", self.conn) + self.table_names = [i[0] for i in data_frame.values.tolist()] + + def get_field_names(self): + """ + 获取所有数据表的所有字段 + :return: 返回表内的所有字段 + """ + data_frame = pd.read_sql(f"desc {self.table_name}", self.conn) + """ + field_names = [] + for field in data_frame["Field"]: + field_names.append(f"{self.table_name}.{field}") + return field_names + """ + return data_frame["Field"].values.tolist() + + def create_form(self): + """ + 创建表单区域,根据数据表自动生成表单 + :return: + """ + self.select_table_name = StringVar() # 初始化一个StringVar对象,用于存储当前选中的表名 + self.select_table_name.set(self.table_name) # 设置默认表名 + combo = ttk.Combobox(self, width=8, height=1, textvariable=self.select_table_name, font=self.font_style, + style="TCombobox") # 创建一个下拉选择框,允许用户选择一个数据表 + combo["values"] = self.table_names # 设置下拉选项为所有表名 + combo.bind('<>', self.select_table) # 绑定选择事件处理函数 + combo.grid(column=0, row=0, sticky=W) # 放置组件 + # 获取当前表的所有字段名 + fields = self.get_field_names() + num_fields = len(fields) + num_rows = (num_fields + 1) // 2 # 计算需要的行数,以每行放置两个字段 + # 根据字段生成表单元素 + for i in range(num_rows): + for j in range(2): # 每行两列布局 + field_idx = i * 2 + j + if field_idx >= num_fields: + break # 如果字段索引超出范围,则退出循环 + field_name = fields[field_idx] # 获取字段名称 + # 为每个字段创建一个标签 + label = Label(self, text=field_name, font=self.font_style) + label.grid(row=i + 1, column=j * 2, padx=20, pady=5, sticky=W) + # 创建一个复选框,可能用于指示选择状态 + checkbutton_var = IntVar() + checkbutton = Checkbutton(self, text='', variable=checkbutton_var) + checkbutton.grid(row=i + 1, column=j * 2, padx=0, pady=5, sticky=E) + # 创建一个文本输入框,用于输入或显示字段值 + entry = Entry(self, font=self.font_style, width=12) + # entry = Entry(self, font=self.font_style) + entry.grid(row=i + 1, column=j * 2 + 1, padx=5, pady=5, sticky=W) + # 存储表单组件引用,以便后续使用 + self.form_content[field_name] = (entry, checkbutton_var, label, checkbutton) + # 配置并创建一个"构造SQL"按钮 + style = Style() + style.configure("custom.TButton", padding=(10, 40, 10, 40)) + Button(self, text="构造SQL", command=self.make_sql, width=8, style="custom.TButton" + ).grid(column=8, row=0, rowspan=8) + # 创建一个文本框,用于显示或编辑SQL命令 + self.sql_text = Text(self, height=3, font=self.font_style, width=46) + self.sql_text.grid(row=8, column=0, rowspan=2, columnspan=7, sticky=W) + # 创建一个"执行SQL"按钮,用于执行文本框中的SQL命令 + Button(self, text="\n执行SQL\n", command=self.execute_sql, width=8, + ).grid(column=8, row=8, rowspan=2, padx=10) + # 插入默认的查询SQL + self.sql_text.insert(1.0, self.default_query_sql) + + def execute_sql(self): + cursor = self.conn.cursor() + sql = get_text_content(self.sql_text).lower().strip() # 获取文本框中的sql语句 + try: + cursor.execute(sql) + # 如果是查询语句 + if sql.startswith("select"): + data_frame = pd.read_sql(sql, con=self.conn) + self.create_treeview(data_frame) + self.node.message.insert(0, f"{sql}执行成功!共查询到{len(data_frame)}条数据-{uuid.uuid4()}-true") # uuid标识事件的唯一性 + return + # 如果不是查询语句 + self.node.message.insert(0, f"{sql}执行成功!-{uuid.uuid4()}-true") + except pymysql.Error as e: + # 如果执行过程中遇到pymysql相关错误,则弹出错误信息框 + messagebox.showerror(str(e.args[0]), str(e.args[1])) + self.node.message.insert(0, f"{sql}执行失败!{e}-{uuid.uuid4()}-false") + finally: + cursor.close() + self.node.update_message() + + # 创建一个带有滚动条并定义好样式的树形视图控件,用于显示查询结果 + def create_treeview(self, data_frame): + frame = Frame(self, height=580) + frame.grid(row=10, column=0, columnspan=10, rowspan=5, sticky=NSEW, pady=10) + # 设置框架的列和行能够随窗口大小调整而伸缩。 + frame.grid_columnconfigure(0, weight=1) + frame.grid_rowconfigure(0, weight=1) + unique_columns = data_frame.columns[~data_frame.columns.duplicated()] + columns = unique_columns.tolist() + # 获取查询的列名,将其转换为列表 + tree = ttk.Treeview(frame, columns=columns, show="headings", style="mystyle.Treeview", height=50, + selectmode=BROWSE) + style = ttk.Style() + style.configure("Treeview.Heading", font=self.font_style) + style.configure("Treeview", rowheight=30, font=self.font_style, borderwidth=1) + # 根据dataFrame结构生成表 + for i in columns: + tree.heading(column=i, text=i) # 为每个列设置标题 + for i in columns: + tree.column(i, anchor=CENTER, minwidth=100, width=100) # 为每个列设置对齐方式 + for row in data_frame.itertuples(): # 将数据的每一行插入到树形视图中 + tree.insert(parent="", index=END, values=[row[i] for i in range(1, len(row))]) + tree.grid(row=0, column=0, sticky=NSEW, pady=10) + y_scrollbar = ttk.Scrollbar(frame, orient='vertical', command=tree.yview) + tree.configure(yscrollcommand=y_scrollbar.set) + y_scrollbar.grid(row=0, column=1, sticky='ns') + frame.grid_propagate(False) + + def make_sql(self): + sql = f"SELECT * FROM {self.table_name}" + conditions = [] + select_fields = [] + + condition_statements = [ + "{} LIKE '{}'", + "{} = '{}'", + "NOT ({} != '{}')", + "{} IN ('{}')" + ] + + for field, (entry, checkbox_var, i, j) in self.form_content.items(): + if entry.get(): + + # conditions.append("{} like '{}'".format(field, entry.get())) + # conditions.append("{} = '{}'".format(field, entry.get())) + # conditions.append("NOT ({} != '{}')".format(field, entry.get())) + # conditions.append("{} IN ('{}')".format(field, entry.get())) + conditions.append(random.choice(condition_statements).format(field, entry.get())) + + if checkbox_var.get() == 1: + select_fields.append("{}".format(field)) + if conditions: + sql = "SELECT * FROM {} WHERE {}".format(self.table_name, " AND ".join(conditions)) + print(sql) + if select_fields: + sql = sql.replace("*", ",".join(select_fields)) + self.sql_text.delete(0.0, END) + self.sql_text.insert(1.0, sql) + + +# 该类用于创建一个界面窗口 +class StuSys_X4(BaseWindow): + def __init__(self, master, attr): + super().__init__(master, attr) + self.create_left_plate() + self.create_right_plate() + self.message = [] + + # 这里创建了左边的三个小的查询的表 + def create_left_plate(self): + # 创建左侧框架并打包定位 + self.left_frame = Frame(self.master, height=self.attr["height"]) + self.left_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + load_element1 = LoadElement(self.left_frame, "student") + load_element1.pack(side=TOP, pady=10) + # ...course与sc的装载表的创建方式类似 + load_element2 = LoadElement(self.left_frame, "course") + load_element2.pack(side=TOP, pady=10) + load_element3 = LoadElement(self.left_frame, "sc") + load_element3.pack(side=TOP, pady=10) + + # 以下是消息框部分的内容 + + # 创建右侧框架并打包定位 + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=RIGHT, anchor=NW, pady=10, padx=10) + + # 创建消息框架和画布,可能用于显示信息或更复杂的交互元素 + message_frame = Frame(self.right_frame, width=50, height=180) + message_frame.pack(side=TOP, pady=10, fill=BOTH) + self.canvas = Canvas(message_frame, width=280, height=1000, bg="#f0f5fa") + self.canvas.configure(background="#f0f5fa") + # 配置滚动条 + y_scrollbar = Scrollbar(message_frame, orient="vertical", command=self.canvas.yview) + x_scrollbar = Scrollbar(message_frame, orient="horizontal", command=self.canvas.xview) + y_scrollbar.pack(side=RIGHT, fill=BOTH) + x_scrollbar.pack(side=BOTTOM, fill=BOTH) + self.canvas.pack(side=TOP, fill=BOTH) + self.canvas.configure(yscrollcommand=y_scrollbar.set) + self.canvas.configure(xscrollcommand=x_scrollbar.set) + + # 在查询后调用这个函数,更新查询记录部分 + def update_message(self): + self.canvas.delete(ALL) + for message in self.message: + index = self.message.index(message) + self.canvas.create_text(0, 20 * index, anchor="nw", + text=message.split("-")[0], font=("", 15), + fill="black" if message.split("-")[-1] == "true" else "red") + self.canvas.update() + self.canvas.configure(scrollregion=self.canvas.bbox("all")) + + def create_right_plate(self): + self.right_frame = Frame(self.master, height=self.attr["height"]) + self.right_frame.pack(side=LEFT, anchor=NW, pady=10, padx=10) + form_element = FormElement(self.right_frame, self) + form_element.pack(side=TOP, pady=10, anchor=NE) + +if __name__ == '__main__': + """ + minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar + cyborg, vapor, simplex, cerculean, + """ + style = "morph" + root = Window(themename=style) + screenwidth = root.winfo_screenwidth() + screenheight = root.winfo_screenheight() + root.columnconfigure(0, weight=1) + root.rowconfigure(1, weight=1) + root_attr = { + "width": screenwidth * 0.88, + "height": screenheight * 0.90, + } + alignstr = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (screenwidth - root_attr['width']) / 2, + (screenheight - root_attr['height']) / 2) + root.geometry(alignstr) + root.resizable(width=False, height=False) + + app = StuSys_X4(root, root_attr) + ttk.Style().configure("TButton", font="-size 18") + root.mainloop() diff --git a/X5/basic.png b/X5/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..c0012fe9b8c851a67a36f719c719d921dff5146e GIT binary patch literal 223272 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