Python3 Tkinter GUI 数据传输工具

10 篇文章 0 订阅
4 篇文章 0 订阅

1、实现功能

  • 数据文件导入数据库
  • 库表新增、数据追加、不同库数据传输(测试阶段)
  • 数据采用线程池操作,速度较优

2、界面展示

  • 初始化
    在这里插入图片描述
  • 导入文件,双击编辑
    在这里插入图片描述
  • 导入日志
    在这里插入图片描述

3、主要界面代码

界面采用纯tkinter编写,逻辑并不难实现,但是调试比较费时间。

  • 导入文件弹窗选择
    def openFile(self,f,tree,action_model,db_tablename,btn,actionModel_label):
        """获取文件路径
        :param f:文本框对象
        :param tree:表格对象
        :param action_model:读取文件的模式
        :param db_tablename:需要追加或者新增的库表名称
        :param btn:导入按钮对象,恢复可点击状态
        :param self.actionModel_label:底部状态栏,显示当前导入的模式
        """
        self.db_tablename = re.sub('\s', '', str(db_tablename))
        if len(self.db_tablename)==0 or self.db_tablename=='输入数据库的表名称':
            messagebox.showerror('错误提示','请在输入框输入需要追加或者新增的库表名称!')
        else:
            self.tree = tree
            l = [('CSV','.csv'),('Excel','.xlsx'),('Excel 2007','.xls'),('TXT','.txt')] # 限定打开的文件类型
            self.filename = filedialog.askopenfilename(title='选择文件',filetypes=l)
            if self.filename != '':
                btn.config(state='normal')  # 释放导入控件状态
                actionModel_label.set('当前模式:%s' % (action_model)) # 更新当前底部栏追加模式
                self.action_model = action_model
                f.set(self.filename)
                self.refreshForm()
            else:
                self.filename = ' 您没有选择任何文件'
                f.set(self.filename)
  • Treeview(表单及滚动条)
    def createWidgets(self):
        treeScroll = ttk.Scrollbar(self.tabfm1)
        treeScroll.grid(row=1, column=1, sticky=tk.N + tk.S)
        self.tree = ttk.Treeview(self.tabfm1, show='headings', yscrollcommand=treeScroll,height=15)
        self.tree['columns'] = ('1', '2', '3', '4','5','6','7')
        self.tree.column('1', width=35)
        self.tree.heading("1", text="序号")
        self.tree.column('2', width=150)
        self.tree.heading("2", text="检测列名")
        self.tree.column('3', width=80)
        self.tree.heading("3", text="检测类型")
        self.tree.column('4', width=150)
        self.tree.heading("4", text="库表对应列")
        self.tree.column('5', width=167)
        self.tree.heading("5", text="列类型")
        self.tree.column('6', width=130)
        self.tree.heading("6", text="提示")
        self.tree.heading("7", text="是否导入")
        self.tree.column('7', width=70)
        # 双击事件绑定
        self.tree.bind('<Double-1>', self.popupDialog)
        self.tree.grid(row=1, column=0)
        treeScroll.configure(command=self.tree.yview)
        self.tree.configure(yscrollcommand=treeScroll.set)

        # 读取文件模式(下拉列表)
        fm1 = tk.Frame(self.tabfm1)
        readModel = ['追加','新增','其他模式']
        self.cmbox = ttk.Combobox(fm1,values=readModel,state='readonly',width=8)
        self.cmbox.set(readModel[0])
        self.cmbox.grid(row=0,column=3,padx=1,sticky=tk.N + tk.S)

        # 功能控件
        filename = tk.StringVar(value=' 您没有选择任何文件')
        tablename = tk.StringVar(value='输入数据库的表名称')
        # tablename = tk.StringVar(value='测试的新增表')
        bt1 = tk.Button(fm1, text='选择文件', command=lambda:self.func.openFile(filename,self.tree,self.cmbox.get(),tablename.get(),bt2,self.actionModel_label)).grid(row=0,column=0)
        bt2 = tk.Button(fm1, text='开始导入', command=lambda:self.func.import_data(bt2),bg='orange')
        bt2.grid(row=0,column=4,padx=1,sticky=tk.W + tk.E)
        ety_path=tk.Entry(fm1,state='readonly',textvariable=filename,width=62).grid(row=0,column=1,padx=1,sticky=tk.N + tk.S)
        ety_name=tk.Entry(fm1,textvariable=tablename,width=20).grid(row=0,column=2,padx=1,sticky=tk.N + tk.S)
        fm1.grid(row=0, pady=1, sticky=tk.W + tk.E)

        # 底部状态栏
        fm2 = tk.Frame(self.master)
        self.actionModel_label = tk.StringVar()
        dbType_label = tk.StringVar()
        self.actionModel_label.set('当前模式:追加')
        dbType_label.set('|  数据库:Oracle  地址:127.0.0.1  用户:User')
        lb1 = tk.Label(fm2,textvariable=self.actionModel_label,fg='red').grid(row=0,column=0,padx=5)
        lb2 = tk.Label(fm2, textvariable=dbType_label).grid(row=0,column=1)

        fm2.grid(row=1, sticky=tk.W)
  • 表单双击弹窗编辑
    def popupDialog(self,event):
        for i in self.tree.selection():
            item = self.tree.item(i, 'values')

            self.master.attributes("-disabled", 1)  # 禁用主窗口
            top = tk.Toplevel()
            top.title("编辑")
            w = 305;h = 110
            x = (self.ws / 2) - (w / 2)
            y = (self.hs / 2) - (h / 2)
            top.geometry('%dx%d+%d+%d' % (w, h, x, y))
            # top.geometry('300x100')
            top.resizable(0, 0)

            tk.Label(top, text='字段名称:').grid(row=0, padx=2, pady=2)
            tk.Label(top, text='库表字段:').grid(row=1, padx=2, pady=2)
            tk.Label(top, text='字段类型:').grid(row=2, padx=2, pady=2)
            tk.Label(top, text='是否导入:').grid(row=3, padx=2, pady=2)

            # ========字段名称========
            col_name = tk.StringVar(value=item[1])
            tk.Entry(top,textvariable=col_name,state='readonly').grid(row=0,column=1,sticky=tk.W + tk.E)
            # ========库表字段========
            db_col_list = self.func.data['db_table_columns']['name']
            db_col_name = ttk.Combobox(top,values=db_col_list,state='readonly',width=8)
            if item[3].strip():
                db_col_name.set(item[3])
            else:
                db_col_name.set(db_col_list[0])
            db_col_name.grid(row=1,column=1,sticky=tk.W + tk.E)
            # ========字段类型========
            db_col_type = tk.StringVar()
            if self.cmbox.get()=='追加':
                db_col_type.set('追加模式无法定义类型')
                state_ = 'readonly'
            elif self.cmbox.get()=='新增':
                db_col_type.set(item[4])
                state_ = 'normal'
            else:
                db_col_type.set('当前模式无法定义类型')
                state_ = 'readonly'
            tk.Entry(top,state=state_,textvariable=db_col_type).grid(row=2,column=1)
            # ========是否导入========
            db_col_valid_list = ['        Y','        N']
            db_col_valid = ttk.Combobox(top, values=db_col_valid_list, state='readonly', width=8)
            db_col_valid.set(item[6])
            db_col_valid.grid(row=3,column=1,sticky=tk.W + tk.E)

            bt = tk.Button(top,text='确认',width=11,bg='orange',command=lambda:self.popupDialog_OK(top,i,item,db_col_name,db_col_type,db_col_valid))
            bt.grid(row=0,column=3,rowspan=4,padx=2,pady=2,sticky=tk.N + tk.S)
            # 关闭弹窗触发
            top.protocol("WM_DELETE_WINDOW", lambda:self.popupDialog_close(top))
  • 弹窗确认事件
    def popupDialog_OK(self,top,i,item,db_col_name,db_col_type,db_col_valid):
        :param top:子窗体对象
        :param i:双击行对象
        :param item:行对象数据
        :param db_col_name:库表字段下拉框
        :param db_col_type:库表字段类型
        :param db_col_valid:是否导入下拉框
        """

        items = self.tree.get_children()
        col_list = [self.tree.item(item,'values')[3] for item in items if self.tree.item(item,'values')[0] != self.tree.item(i, 'values')[0]]
        if db_col_name.get() in col_list:
            messagebox.showerror('错误提示', '字段已存在,请重新输入!')
            self.master.attributes("-disabled", 0)  # 激活主窗口
            top.destroy() # 销毁弹窗
        else:
            if '追加' in self.actionModel_label.get():
                idx = self.func.data['db_table_columns']['name'].index(db_col_name.get())
                db_col_type = self.func.data['db_table_columns']['type'][idx]
                new_item = [item[0], item[1], item[2],db_col_name.get(), db_col_type,item[5],db_col_valid.get()]
            elif '新增' in self.actionModel_label.get():
                new_item = [item[0], item[1], item[2], db_col_name.get(), db_col_type.get(), item[5], db_col_valid.get()]
            else:
                pass
            self.master.attributes("-disabled", 0)  # 激活主窗口
            top.destroy() # 销毁弹窗
            # 更新表单行数据
            self.tree.delete(i)
            self.tree.insert('',int(new_item[0])-1,values=new_item)

4、个人废话

工具属于半成品,如截图所示两个tab,其中数据库配置并未完成,以及一些基本功能也纯在bug,所以纯属练手项目,感兴趣的朋友可以自行下载,新手代码,不喜勿喷。
源码下载:
https://download.csdn.net/download/joson1234567890/16799096

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: Python GUI Tkinter项目是使用Python编程语言和Tkinter库创建的图形用户界面项目。它可以用于创建各种桌面应用程序,如文本编辑器、计算器、游戏等。TkinterPython标准库中的一个GUI工具包,它提供了创建窗口、按钮、标签、文本框等常见GUI组件的方法。使用Tkinter可以快速创建简单的GUI应用程序,也可以通过自定义组件和布局来创建更复杂的应用程序。 ### 回答2: Python GUI是一种图形用户界面,通常用于创建图形、图表、工具栏等。Tkinter是一个流行的Python库,专门用于创建图形用户界面的Python GUI。 使用Tkinter创建Python GUI的项目需要灵活性和创新性。创建Tkinter项目的第一步是定义窗口的类型和大小。通过设置窗口的类型,可以指定它是一个对话框、标题窗口、弹出窗口或模式窗口,也可以指定窗口的大小、颜色和其他窗口属性。 接下来,您需要选择和添加控件,例如按钮、标签、文本框、下拉列表框和单选按钮。将这些控件添加到窗口后,可以像设置窗口属性一样设置它们的属性。 控件之间的交互和数据传输Tkinter项目的重点。通过将控件与函数连接起来,可以实现按钮点击、文本框输入、下拉列表框选择等操作。对于复杂的应用程序,可以使用导航窗格、切换窗口和其他控件来组织布局,使其易于导航和使用。 为了使应用程序更加交互和响应性,可以添加功能、插件和内置任务,例如数据存储、数据处理、输入验证和结果导出。通过这些拓展,创建的Tkinter项目可以具有更广泛的应用范围。 总的来说,Tkinter非常适合创建Python GUI项目,因为它易于使用,具有良好的支持和资源,并且可以与其他Python库和框架集成。谁都可以使用Tkinter开发掌握一项技能,进行窗体界面开发。 ### 回答3: Python GUI tkinter项目是一种基于python的图形用户界面(GUI)工具集,可以帮助开发者构建具有互动性和可视化效果的应用程序。该工具集提供了各种控件来创建各种强大的GUI应用程序,比如按钮、标签、文本框、下拉列表和复选框等。 该工具集既简单易用,又灵活性高,适合于开发各种类型的应用程序,比如文本编辑器、数据库管理器、计算器等。此外,它还支持多种操作系统(如Windows,iOS,Linux)和编程语言(如C,C++,Java),因此可以轻松地在不同平台上使用。 Python GUI tkinter项目有几个主要的特点,包括: 1. 简单易用:Python GUI tkinter项目提供了各种易于使用的控件和工具,帮助开发者很容易地构建图形界面,省去了复杂的GUI编程过程。 2. 相对灵活性高:Python GUI tkinter项目非常灵活,提供了丰富的选项和配置来满足不同需求。开发者可以使用各种控件、布局、颜色等构建独特的应用程序。 3. 可移植性强: 由于Python GUI tkinter项目可以在多个操作系统和编程语言中使用,因此可以很方便地移植到不同的平台并在不同的环境下使用。 Python GUI tkinter项目的主要优势在于其易用性和灵活性。虽然它可能不如其他图形用户界面工具集(如QT或wxWidgets)功能丰富,但它是一个强大而又简单的工具,适用于各种应用程序的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOSON.

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值