一、需求分析

软件需求

部门有大量工艺数据,一直放在Excel中,非常不安全且杂乱无章,希望能找到一个安全可靠的软件去存放数据。

功能描述

  1. 登录界面:输入密码后才可查看数据
  2. 基本功能:对数据进行增删改查
  3. 画图:每插入一个数据,都能实时观察图像变化以监测数据
  4. 导出至Excel:将整个表格导出以对数据进行更多操作
  5. 新建、删除存放数据的表格
  6. 能多人在不同电脑上登陆,对数据进行操作

二、代码展示

话不多说,直接上代码。
ps: 因为是给公司做的,涉及公司隐私的就码掉啦~

登录代码

from tkinter import *
from tkinter import messagebox
from select_db_tb import Select_DB_TBclass Login:def __init__(self):# 界面尺寸标签等设置 self.login_root = Tk()    self.login_root.title('welcome to 工艺数据库~')self.login_root.geometry('1300x850+100+30')textLabel = Label(self.login_root,text='工艺数据库管理平台登陆界面',font=('黑体',45), fg='black')textLabel.place(relx=0.2, rely=0.2)# 用户及输入框lab_user = Label(self.login_root, text='账户:', font=('黑体',24))lab_user.place(relx=0.35, rely=0.44)v_user = StringVar()self.text_user = Entry(self.login_root, textvariable = v_user, font=('黑体',24), bd=4, width=15)v_user.set('zkx')self.text_user.place(relx=0.45, rely=0.44, height=38)# 密码及输入框lab_pwd = Label(self.login_root, text='密码:', font=('黑体',24))lab_pwd.place(relx=0.35, rely=0.54)v_pwd = StringVar()self.text_pwd = Entry(self.login_root, textvariable = v_pwd, font=('黑体',24), show='*', bd=4, width=15)self.text_pwd.place(relx=0.45, rely=0.54, height=38)        # 按钮Button(self.login_root, text='确定',width=10, bd=5, bg='cornflowerblue',fg='white', \command=self.login_confirm, font=('黑体',24))\.place(relx=0.64, rely=0.68, height=55)Button(self.login_root, text='退出', width=10, bd=5, bg='lightgray',fg='red',\command=self.login_root.quit, font=('黑体',24))\.place(relx=0.24, rely=0.68, height=55)        mainloop()def login_confirm(self):mysql_user = self.text_user.get()mysql_pwd = self.text_pwd.get()# 查看用户名(MySQL加了一个远程用户)和密码是否正确if (mysql_user=='root' or mysql_user=='***') and mysql_pwd=='******':messagebox.showinfo(title='login success~', message='登陆成功!\n点击确认进入数据库吧~')self.login_root.destroy()Select_DB_TB()else:messagebox.showerror(title='login faild!', message='登陆失败,请检查用户名或密码是否正确')if __name__ == '__main__':Login()

数据库和表的操作及数据界面的代码

由于代码太长,所以只放了其中一个数据库中一类表的代码。有不懂的或者需要改正或改进的欢迎随时提出

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from fnmatch import fnmatchcase as match
import pymysqlfrom mo_rs import Mo_Rs
from mo_pa import Mo_PA
from draw_info import Draw_Infoclass Select_DB_TB():tb_name=''  # 操作的表名,因为有多个表def __init__(self):self.select_db_tb = Tk()    self.select_db_tb.title('欢迎进入工艺数据库~')self.select_db_tb.geometry('1300x850+100+30')self.select_db_tb.resizable(0,0)# 用ttk.Frame做出多个选择界面,可用于界面之间的切换,就像是桌子上的桌布self.DB_frame = ttk.Frame(self.select_db_tb, width=1300, height=850)self.DB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))self.mo_TB_frame = ttk.Frame(self.select_db_tb, width=1300, height=850)self.mo_TB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))self.pro_TB_frame = ttk.Frame(self.select_db_tb, width=1300, height=850)self.pro_TB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))# 各表数据操作的界面self.mo_Rs = ttk.Frame(self.select_db_tb, width=1300, height=850)self.mo_Rs.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))self.mo_PA = ttk.Frame(self.select_db_tb, width=1300, height=850)self.mo_PA.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))# 数据操作界面的分页标签:数据操作和画图界面self.tabControl = ttk.Notebook(self.mo_Rs)self.tab1 = ttk.Frame()self.tabControl.add(self.tab1, text='数据管理')self.tabControl.place(relx=0,rely=0,width=1300,height=860)self.tab2 = ttk.Frame()self.tabControl.add(self.tab2, text='Rs点检图')# 为每个界面创建小部件的函数self.create_widgetd_in_DB_frame()self.create_widgetd_in_mo_TB_frame()self.create_widgetd_in_pro_TB_frame()self.create_widgetd_in_mo_Rs()self.create_widgetd_in_mo_PA()# 将某些界面隐藏起来self.mo_TB_frame.grid_forget()self.pro_TB_frame.grid_forget()self.mo_Rs.grid_forget()self.mo_PA.grid_forget()# 顶级菜单:左上角的选项menubar = Menu(self.select_db_tb)filemenu = Menu(menubar, tearoff=False)  # 下拉菜单filemenu.add_command(label='选择数据库',command=self.call_DB_frame, font=('宋体',10))filemenu.add_separator()  # 分割线filemenu.add_command(label='退出',command=self.quit, font=('宋体',10))menubar.add_cascade(label='选项', menu=filemenu)self.select_db_tb.config(menu=menubar)      mainloop()# 远程连接MySQL数据库def conn_mysql(self):  try:self.conn = pymysql.connect(host = '00.000.00.000',  # MySQL数据库所在的主机的IP地址user = '***',  # 远程授权的用户名password = '******',   # 密码database = self.v_db.get(),  # 要选择的数据库charset = 'utf8')  # 字符串编码,一般有中文就是'utf-8'self.cursor=self.conn.cursor()except:messagebox.showerror('connect failed', '连接数据库失败!\n请找数据库管理员查询原因')# 关闭数据库的连接def mysql_close(self):try:self.cursor.close()self.conn.close()except:passdef quit(self):if messagebox.askokcancel('Are you sure?','确定退出么?'):self.mysql_close()self.select_db_tb.destroy()# 连接到所选的数据库    def conn_confirm(self):self.conn_mysql()self.mysql_close()if self.v_db.get()=='monitor':self.DB_frame.grid_forget()self.mo_TB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))else:self.DB_frame.grid_forget()self.pro_TB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))# 创建数据库的选择的函数def create_widgetd_in_DB_frame(self):    db_frame = LabelFrame(self.DB_frame, text='请选择一个数据库进行操作:',\borderwidth=5,font=('黑体',40), pady=45)db_frame.place(relx=0.21, rely=0.2, height=410)databases = {('点检数据','monitor'),('工艺数据','process')}self.v_db = StringVar()  # 多个按钮只需一个变量self.v_db.set('monitor')Radiobutton(db_frame, text='点检数据库', variable=self.v_db, value='monitor', font=('helcetica 16 bold italic', 26),fg='blue',\pady=35).pack(fill=X)Radiobutton(db_frame, text='工艺数据库', variable=self.v_db, value='process', font=('helcetica 16 bold italic', 26),fg='blue',\pady=35).pack(fill=X)# 按钮Button(self.DB_frame, text='确定', command=self.conn_confirm, width=10, bd=5, bg='cornflowerblue',fg='white',  font=('黑体',24))\.place(relx=0.65, rely=0.76, height=55)Button(self.DB_frame, text='退出', bd=5, bg='lightgray',fg='red', width=10, command=self.quit, font=('黑体',24))\.place(relx=0.18, rely=0.76, height=55)# 创建表的选择界面的小部件       def create_widgetd_in_mo_TB_frame(self):mo_lbframe = LabelFrame(self.mo_TB_frame, text='请选择点检数据库中的一个表\n\n(PS:产品型号-Recipe-点检类型)',\borderwidth=6,font=('黑体',35), pady=40)mo_lbframe.place(relx=0.18, rely=0.1, height=650)# 添加多行选项+滚动条sb = Scrollbar(mo_lbframe) sb.pack(side=RIGHT, fill=Y)global mo_LBmo_LB = Listbox(mo_lbframe, selectmode=SINGLE, yscrollcommand=sb.set, background='white', font=('helcetica 16 bold italic', 26),\fg='blue', height=25, selectforeground='white', selectborderwidth=8)mo_LB.pack(fill=BOTH)self.conn_mysql()sql = 'SHOW TABLES;'self.cursor.execute(sql)mo_TB = self.cursor.fetchall()for i in mo_TB:mo_LB.insert(END,i[0].upper())self.mysql_close()sb.config(command=mo_LB.yview)# 按钮mo_ok_buttom = Button(self.mo_TB_frame, text='确定', command=self.call_mo_table, width=10, bd=5, bg='cornflowerblue',fg='white',  font=('黑体',24))\.place(relx=0.62, rely=0.81, height=55)mo_back_buttom = Button(self.mo_TB_frame, text='返回', bd=5, width=10, bg='lightgray',fg='red',command=self.call_DB_frame, font=('黑体',24))\.place(relx=0.2, rely=0.81, height=55)new_Rs_button = Button(self.mo_TB_frame, text='新建Rs表格', command=self.create_new_moRs, width=10, bd=5, bg='cornflowerblue',fg='white',  font=('黑体',22))\.place(relx=0.81, rely=0.38, height=55)new_PA_button = Button(self.mo_TB_frame, text='新建PA表格', command=self.create_new_moPA, width=10, bd=5, bg='cornflowerblue',fg='white',  font=('黑体',22))\.place(relx=0.81, rely=0.52, height=55)drop_table_button = Button(self.mo_TB_frame, text='删除表格', command=self.drop_table, width=10, bd=5, bg='lightgray',fg='red',  font=('黑体',22))\.place(relx=0.81, rely=0.66, height=55)# 新建表的函数,只放了其中一种表的新建def create_new_moRs(self):new_moRs = ttk.Frame(self.select_db_tb, width=1300, height=950)new_moRs.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))Label(new_moRs, text='请填写新建Rs点检表的信息:', font=('黑体',35, 'bold'), fg='black')\.place(relx=0.26, rely=0.11)dev_no = Label(new_moRs, text='机台型号:', font=('黑体',24))dev_no.place(relx=0.3, rely=0.25)Dev_No = StringVar()text_dev_no = Entry(new_moRs, textvariable = Dev_No, font=('黑体',24), bd=3, width=15)text_dev_no.place(relx=0.5, rely=0.25, height=36)recipe = Label(new_moRs, text='Recipe:', font=('黑体',24))recipe.place(relx=0.3, rely=0.35)Recipe = StringVar()text_recipe = Entry(new_moRs, textvariable = Recipe, font=('黑体',24), bd=3, width=15)text_recipe.place(relx=0.5, rely=0.35, height=36)target = Label(new_moRs, text='Target值:', font=('黑体',24))target.place(relx=0.3, rely=0.45)Target = StringVar()text_target = Entry(new_moRs, textvariable = Target, font=('黑体',24), bd=3, width=15)text_target.place(relx=0.5, rely=0.45, height=36)lcl = Label(new_moRs, text='LCL值:', font=('黑体',24))lcl.place(relx=0.3, rely=0.55)LCL = StringVar()text_lcl = Entry(new_moRs, textvariable = LCL, font=('黑体',24), bd=3, width=15)text_lcl.place(relx=0.5, rely=0.55, height=36)ucl = Label(new_moRs, text='UCL值:', font=('黑体',24))ucl.place(relx=0.3, rely=0.65)UCL = StringVar()text_ucl = Entry(new_moRs, textvariable = UCL, font=('黑体',24), bd=3, width=15)text_ucl.place(relx=0.5, rely=0.65, height=36)        def ok():            try:if not(Dev_No.get().strip() and Recipe.get().strip() and Target.get().strip() and LCL.get().strip() and UCL.get().strip()):raise ValueError self.tb_name = Dev_No.get().upper() + '_' + Recipe.get().upper() + '_RS'self.conn_mysql()sql = "CREATE TABLE %s(`Date` DATE NOT NULL, Mean DOUBLE NOT NULL, `Min` DOUBLE, `Max` DOUBLE, `Std_Dev(%%)` DOUBLE NOT NULL, Target INT(11) DEFAULT %s, LCL INT(11) DEFAULT %s, UCL INT(11) DEFAULT %s);" %\(self.tb_name, Target.get(), LCL.get(), UCL.get())self.cursor.execute(sql)self.conn.commit()messagebox.showinfo('create success~', '成功创建Rs点检表!')self.mysql_close()except ValueError :messagebox.showerror('create failed', '创建失败,所有空格必须全部填写!')mo_LB.insert(0,self.tb_name)def back():new_moRs.grid_forget()ok_button = Button(new_moRs, text='确认创建', command=ok, width=10, bd=5, bg='cornflowerblue',fg='white',  font=('黑体',24))\.place(relx=0.65, rely=0.78, height=55)back_button = Button(new_moRs, text='返回', command=back, width=10, bd=5, bg='lightgray',fg='red',  font=('黑体',24))\.place(relx=0.2, rely=0.78, height=55)# 删除表的函数def drop_table(self):try:if messagebox.askokcancel('Are you sure?','确定删除表格?\n警告:表中所有数据都将丢失!'):tb_name = mo_LB.get(mo_LB.curselection())self.conn_mysql()sql = "DROP TABLE %s" %\tb_nameself.cursor.execute(sql)self.conn.commit()mo_LB.delete(ACTIVE)messagebox.showinfo('drop success', '删除成功!')              self.mysql_close()except:messagebox.showerror('drop failed', '删除失败!请检查网络是否连接')# 创建表中数据界面的增删改查等小部件def create_widgetd_in_mo_Rs(self):# 日期date = Label(self.tab1, text='* 日期(格式:yyyy-mm-dd):', font=('黑体',16))date.place(relx=0.02, rely=0.065)Date = StringVar()text_data = Entry(self.tab1, textvariable = Date, font=('黑体',16), bd=3, width=12)text_data.place(relx=0.265, rely=0.065, height=36)# Rs MeanRs_Mean = Label(self.tab1, text='* Rs_Mean值:', font=('黑体',16))Rs_Mean.place(relx=0.417, rely=0.065)Mean = StringVar()text_Rs_Mean = Entry(self.tab1, textvariable = Mean, font=('黑体',16), bd=3, width=12)text_Rs_Mean.place(relx=0.537, rely=0.065, height=36)# Rs Min值Rs_Min = Label(self.tab1, text='Rs_Min值:', font=('黑体',16))Rs_Min.place(relx=0.52, rely=0.115)Min = StringVar()text_Rs_Min = Entry(self.tab1, textvariable = Min, font=('黑体',16), bd=3, width=12)text_Rs_Min.place(relx=0.615, rely=0.115, height=36)# Rs Max值Rs_Max = Label(self.tab1, text='Rs_Max值:', font=('黑体',16))Rs_Max.place(relx=0.75, rely=0.115)Max = StringVar()text_Rs_Max = Entry(self.tab1, textvariable = Max, font=('黑体',16), bd=3, width=12)text_Rs_Max.place(relx=0.845, rely=0.115, height=36)# *Std_Dev(%)值std_Dev = Label(self.tab1, text='* Std_Dev(%)值:', font=('黑体',16))std_Dev.place(relx=0.685, rely=0.065)Std_Dev = StringVar()text_Std_Dev = Entry(self.tab1, textvariable = Std_Dev, font=('黑体',16), bd=3, width=12)text_Std_Dev.place(relx=0.83, rely=0.065, height=36)# Target值target = Label(self.tab1, text='Target值:', font=('黑体',16))target.place(relx=0.01, rely=0.115)Target = StringVar()Target.set('默认值')text_Target = Entry(self.tab1, textvariable = Target, font=('黑体',16), bd=3, width=8)text_Target.place(relx=0.1, rely=0.115, height=36)# LCL值lcl = Label(self.tab1, text='LCL值:', font=('黑体',16))lcl.place(relx=0.195, rely=0.115)LCL = StringVar()LCL.set('默认值')text_LCL = Entry(self.tab1, textvariable = LCL, font=('黑体',16), bd=3, width=8)text_LCL.place(relx=0.26, rely=0.115, height=36)# UCL值ucl = Label(self.tab1, text='UCL值:', font=('黑体',16))ucl.place(relx=0.35, rely=0.115)UCL = StringVar()UCL.set('默认值')text_UCL = Entry(self.tab1, textvariable = UCL, font=('黑体',16), bd=3, width=8)text_UCL.place(relx=0.415, rely=0.115, height=36)# 创建表格tree_frame = LabelFrame(self.tab1, text='数据信息表格', borderwidth=5,font=('黑体',16), pady=20)tree_frame.place(relx=0.02, rely=0.26, height=580)self.tree_view = ttk.Treeview(tree_frame,show='headings', column=('Date','Mean','Min','Max','Std_Dev','Target','LCL','UCL'))sb = Scrollbar(tree_frame, orient='vertical',command=self.tree_view.yview)sb.pack(side=RIGHT, fill=Y)self.tree_view.configure(yscrollcommand=sb.set)# 设置每列属性self.tree_view.column('Date', width=130, anchor='center')self.tree_view.column('Mean', width=130, anchor='center')self.tree_view.column('Min', width=130, anchor='center')self.tree_view.column('Max', width=130, anchor='center')self.tree_view.column('Std_Dev', width=130, anchor='center')self.tree_view.column('Target', width=130, anchor='center')self.tree_view.column('LCL', width=130, anchor='center')self.tree_view.column('UCL', width=130, anchor='center')# 设置每行属性self.tree_view.heading('Date', text='Date')self.tree_view.heading('Mean', text='Rs_Mean')self.tree_view.heading('Min', text='Rs_Min')self.tree_view.heading('Max', text='Rs_Max')self.tree_view.heading('Std_Dev', text='Std_Dev(%)')self.tree_view.heading('Target', text='Target')self.tree_view.heading('LCL', text='LCL')self.tree_view.heading('UCL', text='UCL')# 设置表格位置self.tree_view.pack(side=LEFT, fill=BOTH)#单击表格中一项数据后将显示在相应文本框上def tree_view_click(event):for item in self.tree_view.selection():item_text = self.tree_view.item(item, 'value')Date.set(item_text[0])Mean.set(item_text[1])Min.set(item_text[2])Max.set(item_text[3])Std_Dev.set(item_text[4])Target.set(item_text[5])LCL.set(item_text[6])UCL.set(item_text[7])if Min.get()=='None':Min.set('Null')if Max.get()=='None':Max.set('Null')# 绑定单击事件self.tree_view.bind('<ButtonRelease-1>', tree_view_click)        # 上方按钮Button(self.tab1, text='显示点检数据',width=15, bd=5, bg='cornflowerblue',fg='white', font=('黑体',16),\command=lambda: Mo_Rs.show_all_info(Mo_Rs(), self.tree_view, self.tb_name))\.place(relx=0.03, rely=0.18, height=50)Button(self.tab1, text='添加点检数据',width=15, bd=5, bg='cornflowerblue',fg='white', font=('黑体',16),\command=lambda: Mo_Rs.add_info(Mo_Rs(), self.tree_view, Date, Mean, Min, Max, Std_Dev, Target, LCL, UCL, self.tb_name))\.place(relx=0.22, rely=0.18, height=50)Button(self.tab1, text='查询点检数据',width=15, bd=5, bg='cornflowerblue',fg='white', \command=lambda: Mo_Rs.search_info(Mo_Rs(), self.tree_view, Date, self.tb_name), font=('黑体',16))\.place(relx=0.41, rely=0.18, height=50)Button(self.tab1, text='修改点检数据',width=15, bd=5, bg='cornflowerblue',fg='white', \command=lambda: Mo_Rs.modify_info(Mo_Rs(), self.tree_view, Date, Mean, Min, Max, Std_Dev, self.tb_name), font=('黑体',16))\.place(relx=0.6, rely=0.18, height=50)Button(self.tab1, text='删除点检数据',width=15, bd=5, bg='cornflowerblue',fg='white', \command=lambda: Mo_Rs.delete_info(Mo_Rs(), self.tree_view, Date, Mean, Std_Dev, self.tb_name), font=('黑体',16))\.place(relx=0.79, rely=0.18, height=50)# 底部按钮def clear():Date.set('')Mean.set('')Min.set('')Max.set('')Std_Dev.set('')Button(self.tab1, text='清空\n键入数据',width=10, bd=5, bg='lightgray',fg='red', \command=clear, font=('黑体',16))\.place(relx=0.87, rely=0.28, height=75)Button(self.tab1, text='导出至\nExcel文件',width=10, bd=5, bg='lightgray',fg='red', \command=lambda: Mo_Rs.export_excel(Mo_Rs(), self.tb_name), font=('黑体',16))\.place(relx=0.87, rely=0.6, height=75)Button(self.tab1, text='返回\n上级',width=8, bd=5, bg='lightgray',fg='red', \command=self.call_mo_TB_frame, font=('黑体',16))\.place(relx=0.88, rely=0.85, height=75)            def updateFig(tb_name):self.tabControl.forget(1)self.tab2 = ttk.Frame()self.tabControl.add(self.tab2,text='Rs点检图')self.tabControl.select(self.tab2)Draw_Info(self.tab2).mo_Rs_plot(self.tb_name)Button(self.tab1, text='更新/查看\n图表',width=10, bd=5, bg='lightgray',fg='red', \command=lambda: updateFig(self.tb_name), font=('黑体',16))\.place(relx=0.87, rely=0.44, height=75)            # 切换到表的选择、新建及删除的界面    def call_mo_TB_frame(self):# 清空表格rs = self.tree_view.get_children()for item in rs:self.tree_view.delete(item)pa = self.tree_view_p.get_children()for item in pa:self.tree_view_p.delete(item)# 清空图表self.tabControl.forget(1)self.tab2 = ttk.Frame()self.tabControl.add(self.tab2,text='Rs点检图')self.tabControl_p.forget(1)self.tab_p2 = ttk.Frame()self.tabControl_p.add(self.tab_p2,text='颗粒点检图')self.mo_Rs.grid_forget()self.mo_PA.grid_forget()self.mo_TB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))#切换到选择的表数据界面进行增删改查等操作def call_mo_table(self):try:    self.tb_name = mo_LB.get(mo_LB.curselection())self.mo_TB_frame.grid_forget()self.conn_mysql()if match(self.tb_name, '*RS'):Label(self.tab1, text=self.tb_name, font=('黑体',23, 'bold'), fg='black')\.place(relx=0.3, rely=0.0)self.mo_Rs.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))# 显示数据# 清空表格中显示的内容x = self.tree_view.get_children()for item in x:self.tree_view.delete(item)sql = "SELECT `Date`,`Mean`,`Min`,`Max`,`Std_Dev(%%)`,Target,LCL,UCL FROM %s ORDER BY `Date` DESC;" % self.tb_nameself.cursor.execute(sql)rs_tuple = self.cursor.fetchall()for info in rs_tuple:self.tree_view.insert('', 'end', values=info)elif match(self.tb_name, '*PATICAL'):Label(self.tab_p1, text=self.tb_name, font=('黑体',23, 'bold'), fg='black')\.place(relx=0.4, rely=0.0)self.mo_PA.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))x = self.tree_view_p.get_children()for item in x:self.tree_view_p.delete(item)sql = "SELECT `Date`,RECIPE,`SUM`,AREA,SUM_UCL,AREA_UCL FROM %s ORDER BY `Date` DESC;" % self.tb_nameself.cursor.execute(sql)pa_tuple = self.cursor.fetchall()for info in pa_tuple:self.tree_view_p.insert('', 'end', values=info)                        self.mysql_close()              except:pass    # 没有选某个表直接点确定的错误pass掉# 切换到数据库的选择界面def call_DB_frame(self):# 清空表格rs = self.tree_view.get_children()for item in rs:self.tree_view.delete(item)pa = self.tree_view_p.get_children()for item in pa:self.tree_view_p.delete(item)# 清空图表self.tabControl.forget(1)self.tab2 = ttk.Frame()self.tabControl.add(self.tab2,text='Rs点检图')self.tabControl_p.forget(1)self.tab_p2 = ttk.Frame()self.tabControl_p.add(self.tab_p2,text='颗粒点检图')try:cursor.close()conn.close()except:passself.mo_TB_frame.grid_forget()self.pro_TB_frame.grid_forget()self.mo_Rs.grid_forget()self.mo_PA.grid_forget()self.DB_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(W, N, E))

代码太长,怕看疲劳了。所以分成两篇~

三、界面图

登陆界面


数据库的选择界面

因为我们的数据分为监控和工艺,两种数据需求不太一样,所以分成两个库。这里主要介绍点检数据库的代码。

表的选择界面

新建表的界面

删除表的界面

打开表的数据界面

数据的增删改查、实时画图监测数据、导出至Excel等功能代码及界面展示见下篇。

python的tkinter做界面连接MySQL(上)相关推荐

  1. python使用tkinter做界面之颜色

    from tkinter import * colors = '''#FFB6C1 LightPink 浅粉红 #FFC0CB Pink 粉红 #DC143C Crimson 深红/猩红 #FFF0F ...

  2. 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)

    用python的tkinter做游戏 系列: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用python自带的tkinter做游戏(二)-- 俄罗斯方块 篇 用python自带的t ...

  3. GUI界面连接Mysql数据库

    GUI界面连接Mysql数据库 GUI程序不仅界面美观,而且使用方便,各种软件的操作上也可统一,本实验通过Java来编写GUI程序.Java提供了编写GUI程序所需要的各种类,其中在本次实验中用到了j ...

  4. 用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇

    不知不觉这已经是第七篇文章了,今天来谈谈python中类(class)在游戏中的应用. 老规矩,先展现一下之前的几篇博文: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用pytho ...

  5. python mysql ssh隧道_在python中使用ssh隧道连接mysql

    通常为了保证数据库安全,不会允许直接连接数据库,而是需要通过SSH隧道去连接服务器背后的数据库: 今天我在用Python连接远程的MySQL时,直连遇到了无法连接的情况,使用了SSH隧道之后解决了问题 ...

  6. tkinter message_【莫烦Python】Tkinter 做简单的窗口视窗lt;学习笔记(2)gt;

    接(1) 还有五个苹果:[莫烦Python]Tkinter 做简单的窗口视窗<学习笔记>​zhuanlan.zhihu.com 登录窗口小例子(pickle存取) import

  7. |python|用tkinter做minecraft启动器 第一章:python配置

    哈啰啊,这是发的第一篇文章,做的不好,多多关照 好进入正题今天是配置python,先看后期的图片 好,我们首先得下载python(链接加载有点慢) python下载 | 传送门 | 然后点这个(红框框 ...

  8. python界面设计实例-【Python】Tkinter图形界面设计(GUI)

    简介 作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一.目前,市面上支持 Python 的"GUI 工具包"很多,各有特点,虽然大多数工具包的基础类似,但要学习 ...

  9. 【Python】Tkinter图形界面设计(GUI)

    简介 作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一.目前,市面上支持 Python 的"GUI 工具包"很多,各有特点,虽然大多数工具包的基础类似,但要学习 ...

最新文章

  1. java动态代理【一】
  2. Web API之基于H5客户端分段上传大文件
  3. 2020:编程语言大盘点
  4. AndroidStudio报错:Emulator: I/O warning : failed to load external entity file:/C:/Users/Administrator
  5. Google分布式系统三驾马车: GFS,mapreduce,Bigtable
  6. LeetCode - 121. 买卖股票的最佳时机
  7. mysql安装了老版本_Windows环境下MySQL安装教程
  8. 软件测试模型-其他模型(W模型|H模型|X模型)
  9. SQL数据库的使用:创建表结构
  10. div加载异步加载html,初始化页面,异步加载组件的问题
  11. 微信小程序----相对路径图片不显示
  12. 2、matplotlib中的 ax=fig.add_axes([0,0,1,1])详解
  13. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.
  14. 随机前沿方法和数据包络分析
  15. 尜尜送的诗,以及我回的句
  16. Photoshop调出美女人体金黄色肌肤
  17. 关闭网站服务器端口,cmd关闭端口的命令是什么_网站服务器运行维护
  18. 基于python-django的neo4j人民的名义关系图谱查询系统
  19. jdk动态代理,cglib代理
  20. 2021年Java工程师飞升成神之路

热门文章

  1. python创建画布大小_要绘制图形,首先需要显示画布,并设置画布的大小。其中turtle.setup()函数可以显示画布,并设置画布的大小,及画布在屏幕上的相对位置。_学小易找答案...
  2. css 隐藏 光标,利用css隐藏input的光标方法
  3. 【小黑chenchen】9话:栈和队列
  4. postgresql源码学习(一)—— 源码编译安装与gdb调试入门
  5. 【电影漫谈】谈谈我心目中的香港武术指导
  6. 从实战中来,到实战中去——Elasticsearch 技能更快提升方法论
  7. 吴军:如果没有智能技术,几乎不要想做到世界最好
  8. steam搬砖是什么?怎么做呀?
  9. 你所在的IT公司,每年会调薪吗?
  10. python与mysql交互详解