在好例子网,分享、交流、成长!
您当前所在位置:首页Python 开发实例Python GUI开发 → 拉拖拽生成tkinter界面

拉拖拽生成tkinter界面

Python GUI开发

下载此实例
  • 开发语言:Python
  • 实例大小:10.36M
  • 下载次数:1
  • 浏览次数:5
  • 发布时间:2026-03-31
  • 实例类别:Python GUI开发
  • 发 布 人:gdbin001
  • 文件格式:.zip
  • 所需积分:2
 相关标签: Tkinter 拉拖拽 生成 图形界面

实例介绍

【实例简介】基于 Python Tkinter 3.8 开发的可视化界面快速开发工具,支持拖拽生成 UI、控件属性编辑、事件绑定与项目管理,零代码 / 低代码快速生成桌面应用界面。
【实例截图】

【核心代码】

class mainGUI:
    def __init__(self,root):             
        style=ttk.Style()                
        style.theme_use("winnative")  #样式
        style.configure('TSizegrip',background="#a0a0a0")
        style.configure('TNotebook', borderwidth=0, tabposition='',background="#a0a0a0")
        style.configure('TNotebook.Tab', background="#a0a0a0")
        style.map("TNotebook.Tab", background= [("selected", "lightgrey")])
        style.configure('Treeview',rowheight=20,font=(cmm.t('微软雅黑'),9),background="lightgrey")#设置所有treeview表中字体、行高 
        style.configure('Treeview.Heading',background="lightgrey")
        style.map('Treeview',
                   background=[elm for elm in style.map('Treeview',query_opt='background') if elm[:2]!=('!disabled','!selected')])
        style.configure('Vertical.TScrollbar', bd=0)
        style.configure('TPanedwindow', sashwidth=8,background="#a0a0a0")
        tBar = tk.Frame(root,height=30,background="#a0a0a0") # 创建工具栏,bg='#37474f'
        tBar.pack(side='top', fill='x')  # 将工具栏放置在窗口的顶部,并水平填充
        dct={cmm.t('新建项目'):('new_project',icoNP),cmm.t('撤销'):('undo',icoCancel),cmm.t('删除'):('delete',icoDel),
             cmm.t('剪切'):('cut',icoCut),cmm.t('复制'):('copy',icoCopy),cmm.t('粘贴'):('paste',icoPaste),
             cmm.t('保存'):('save',icoSave),cmm.t('模式转换'):('mode_conversion',icoTP),cmm.t('运行'):('run',icoRun),
             cmm.t("左对齐"):('align_left',icoLeft),cmm.t("右对齐"):('align_right',icoRight),cmm.t("上对齐"):('align_top',icoUp),
             cmm.t("下对齐"):('align_bottom',icoDown),cmm.t('水平均匀分布'):('distribute_horizontally_evenly',icoHor),
             cmm.t('垂直均匀分布'):('distribute_vertically_evenly',icoVer)}     
        bi=0        
        for k,v in dct.items():
            bi =1
            if bi>1 and bi<7:  #撤销、删除、剪切、复制、粘贴按键
                btn=tk.Button(tBar,name=k,image=v[1],command=lambda x=v[0]: menuBar.normal(x))
            else: 
                btn=tk.Button(tBar,name=k,image=v[1],command=lambda x=v[0]:getattr(menuBar,x)())
            btn.pack(side='left', padx=5)  # 将按钮放置在工具栏的左侧,并设置内边距
            if k!=cmm.t('模式转换'):  #模式转换提示文字会影响按键灵敏度
                btn.bind('<Enter>',tooltip.showTip)
                btn.bind('<Leave>',tooltip.closeTip)       
            if k==cmm.t('模式转换'): cmm.btnMC=btn  #模式转换按钮
            if k==cmm.t('撤销'):cmm.btnBar.append(btn) #要禁用或者恢复的按钮
            if bi>9:cmm.btnBar.append(btn)  #要禁用或者恢复的按钮
        pw= ttk.PanedWindow(root,orient='horizontal')  #主panedWindow,左右结构 
        pw.pack(fill='both', expand=1) #pw放到主窗口,上下左右扩展
        cmm.pw=pw        
        pw.bind('<B1-Motion>',self.sashDrag)  # 鼠标拖动时
        pwL= tk.PanedWindow(pw,orient='vertical',sashrelief='flat',sashwidth=5,bd=0)  #pwL是上下结构的窗口
        pw.add(pwL)  #pw左边窗口放入pwL
        
        noteBook=ttk.Notebook(pwL) #pwL的上方的noteBook
        cmm.uNB=noteBook
        #noteBook.pack(fill='both',expand=1)
        tab1=tk.Frame(noteBook)
        tab3=tk.Frame(noteBook)
        noteBook.add(tab1,text=cmm.t('项目资源管理器'))
        #noteBook.add(tab2,text='控件')
        noteBook.add(tab3,text=cmm.t('控件关系'))
        #cmm.tab2=tab2
        #widgetPanel.guiCtrl() #在tab2中放置界面控件按钮                
        pwL.add(noteBook)  #pwL加入上方的noteBook
        pwL.paneconfig(noteBook,height=300)               
        #style.configure('my.Treeview', background='#cce8cf')  #自定义treeview。绿豆绿色#cce8cf 
        #style.map('my.Treeview',background=[('pressed', '!disabled', ''), ('active', '')])  #使绿豆绿背景色生效,点击文字变白色
        tree = ttk.Treeview(tab1, show='tree', selectmode="browse") #在tab1创建目录树,设置为单选模式
        cmm.tree=tree
        tree.pack(fill='both', expand=1,side='left')         
        tree.bind('<Button-3>', menuRight.treeSlt) # 打开右键菜单
        tree.bind('<Double-1>', menuRight.doubleLeft) # 双击文件图标
        tree.bind('<<TreeviewOpen>>',lambda e:menuRight.openFolder(e,cmm.icoFN)) #打开文件夹事件,设置打开文件夹图标
        tree.bind('<<TreeviewClose>>',lambda e:menuRight.closeFolder(e,cmm.icoFolder)) #关闭文件夹事件,设置关闭文件夹图标         
        scbY= tk.Scrollbar(tab1,command=tree.yview)  #Y滚动条
        scbY.pack(side='right', fill='y',expand=False)
        tree.config(yscrollcommand=scbY.set)          

        tree = ttk.Treeview(tab3, show='tree', selectmode="browse") #控件关系,设置为单选模式
        cmm.treeD=tree
        tree.pack(fill='both', expand=1,side='left')        
        scbY= tk.Scrollbar(tab3,command=tree.yview)  #Y滚动条
        scbY.pack(side='right', fill='y',expand=False)
        tree.config(yscrollcommand=scbY.set)  
        tree.bind("<Button-1>",self.on_select)  #选中某个控件
        tree.bind('<Button-3>',self.menuR) # 打开右键菜单
        #tree.tag_configure('slt',background='#0079D6')    #定义行色淡蓝色背景        

        noteBD=ttk.Notebook(pwL) #pwL的下方的noteBook  
        tabd1=tk.Frame(noteBD)
        noteBD.add(tabd1,text=cmm.t('属性'))
        pwL.add(noteBD)  #pwL的下方加入控件
        pwL.paneconfig(noteBD,height=400)    
        TreeView_50 = ttk.Treeview(tabd1,columns=("序号",'编号'),show="tree headings", displaycolumns="#all",selectmode="browse") #控件的属性表
        TreeView_50.pack(fill='both',expand=1,side='left' )
        TreeView_50.tag_configure('oddColor',background='white')    #定义奇数行色   #ccebf6       
        scbYTv50 = tk.Scrollbar(tabd1,orient=tk.VERTICAL,command = TreeView_50.yview)
        scbYTv50.pack(fill='y',expand=0,side='right')
        scbYTv50.bind("<B1-Motion>",cmm.etrFocusOut) #点击纵坐标,销毁entry、cbb、button
        TreeView_50.config(yscrollcommand = scbYTv50.set)
        TreeView_50.column('#0', width=45, stretch=0)  # 将首列不随窗口变化
        TreeView_50.column('序号',width=100,anchor='w',stretch=1)   #定义列,左对齐 
        TreeView_50.column('编号',width=90,anchor='w',stretch=1)   #定义列,左对齐 
        TreeView_50.heading('#0', text=cmm.t('分类'), anchor='w')  # 可以设置首列的标题为空
        TreeView_50.heading('序号',text=cmm.t('属性'),anchor='w')   #表头
        TreeView_50.heading('编号',text=cmm.t('值'),anchor='w')   #表头         
        TreeView_50.bind("<Button-1>",widgetPanel.one)   #单击响应函数  
        TreeView_50.bind("<MouseWheel>",cmm.etrFocusOut) #绑定滚轮滚动,销毁entry、cbb、button      
        #TreeView_50.bind("<FocusOut>",cmm.etrFocusOut) #失去焦点,销毁entry、cbb、button       
        cmm.table=TreeView_50    
                
        rNB = cnb.CustomNotebook(pw,{})  #由notebook派生而来。主右窗口
        pw.add(rNB)
        cmm.rNB=rNB        
        rNB.bind("<<NotebookTabChanged>>",widgetPanel.onTabChanged) # 绑定选项卡变化事件

        sttBar = tk.Frame(root,height=15,background="#a0a0a0") # 创建状态栏。黑绿色bg='#37474f'
        sttBar.pack(side='bottom', fill='x')  # 将状态栏放置在窗口的底部,并水平填充
        lblStt=tk.Label(sttBar,background="#a0a0a0")
        lblStt.pack(side='left')
        cmm.lblStt=lblStt
        sizegrip = ttk.Sizegrip(sttBar)
        sizegrip.pack(side="bottom",anchor='e')
        
        menuRight.refTree(None,cmm.parser['default']['folderPath']) #刷新项目管理器目录        
        fileOpen=cmm.parser['default']['fileOpen']  #之前打开的文件
        sltNum=cmm.parser['default']['sltNum']  #之前选中的文件        
        if fileOpen:
            lst=fileOpen.split(',')
            for it in lst:  cmm.打开文件(it)        
        if sltNum :
            try:
                rNB.select(int(sltNum))
            except:
                pass
        root.protocol('WM_DELETE_WINDOW', self.exit)                      
    def exit(self):              
        #pageON=cmm.rNB.select()  #取得当前选中的页类名 
        #print(pageON)
        #if 'text' in pageON:  #转换后或者创建时,是文本模式        
        #    pageKey=pageON[pageON.rfind('!'):]  #从页类名中取得页字典的key
         #   cmm.rNB.children[pageKey].coloring=0  #停止上色            
        fileOpen,idx='',''
        for i in range(len(cmm.filePath)):#记录已经打开的文件路径
            fileOpen =cmm.filePath[i][0] ','        
        if fileOpen: #有打开的文件
            fileOpen=fileOpen.rstrip(',')
            idx=cmm.rNB.index('current')  #当前index
        cmm.parser['default']['winW']=str(root.winfo_width()) #程序窗口宽度
        cmm.parser['default']['winH']=str(root.winfo_height()) #程序窗口高度
        cmm.parser['default']['x']=str(root.winfo_x()) #程序窗口位于屏幕x坐标
        cmm.parser['default']['y']=str(root.winfo_y()) #程序窗口位于屏幕y坐标
        cmm.parser['default']['fileOpen']=fileOpen #记录已经打开的文件路径
        cmm.parser['default']['sltNum']=str(idx) #记录选中的idx
        with open('default.ini', 'w', encoding='utf-8-sig') as cfgFile:  # 保存配置文件            
            cmm.parser.write(cfgFile)
        menuBar.关闭全部()
        root.quit()  #关闭tkinter主循环
        root.destroy()  #销毁窗口
        sys.exit(0)  #退出进程
    def sashDrag(self,e):  #拖动过程中实时重新放置bbox
        if cmm.lstIEB:
            box=cmm.table.bbox(cmm.lstIEB[0],column=1)  #取得第2列box信息   
            cmm.lstIEB[1].place(x=box[0],y=box[1],width=box[2],height=box[3])
    def on_select(self,e): #在控件关系树中,点击某个控件
        idx=cmm.rNB.index('current')  #当前index
        iidSlt =cmm.treeD.identify_row(e.y)         # 点击的iid 
        if not iidSlt: return 0
        wgtN=cmm.treeD.item(iidSlt)["text"]        
        if not wgtN:
            #cmm.treeD.selection_remove(iidSlt) 
            return 0
        pageON=cmm.rNB.select()  #取得当前选中的页类名        
        pageKey=pageON[pageON.rfind('!'):]  #从页类名中取得页字典的key
        if 'text' not in pageON:
            if wgtN=='root':  cmm.rNB.children[pageKey].canvasMD(0)
            else:cmm.filePath[idx][3][wgtN].master.mousedown(0)
        return iidSlt
    def menuR(self,event):  #右击控件关系树中某个控件
        iid =self.on_select(event)              
        if not iid: return 0
        wgtN=cmm.treeD.item(iid)["text"]  
        if not wgtN: return 0
        cmm.treeD.selection_set(iid)
        cmm.treeD.focus(iid)   
        mR =tk.Menu(tearoff=False)      
        piid=cmm.treeD.prev(iid) #上面的iid
        diid=cmm.treeD.next(iid) #下面的iid
        if piid: mR.add_command(label=cmm.t('上移'), command=lambda :self.moveWgt(1,wgtN,cmm.treeD.item(piid)["text"]))  #上移控件
        if diid: mR.add_command(label=cmm.t('下移'), command=lambda :self.moveWgt(2,wgtN,cmm.treeD.item(diid)["text"]))  #下移控件 
        mR.post(event.x_root, event.y_root)     # 光标位置显示菜单
    def moveWgt(self,upD,wgtN,mN):  #上移或者下移控件。默认处于文本模式 
        pageON=cmm.rNB.select()  #取得当前页类名路径 
        pageKey=pageON[pageON.rfind('!'):]  #从页类名中取得页字典的key 
        idx=cmm.rNB.index('current')  #当前index
        modeN=0
        if 'text' not in pageON:  #当前是图形模式
            modeN=1  
            cmm.filePath[idx][1]=menuBar.wgtToCode(idx)    #控件参数转化成文本写入filePath 1            
            lst=cmm.filePath[idx][1].split('\n')      
        else: lst=cmm.rNB.children[pageKey].get().split('\n') #当前是文本模式,文本内容从text控件中取出             
        si,ei=0,0  #界面控件语句,开始位置,结束位置
        for i,it in enumerate(lst):  #记录起止位置。其他语句要保留
            if 'def makeGUI(self,root)' in it:si=i 1   #开始位置
            elif ('def ' in it or '#------' in it) and si:  #找到结束位置
                ei=i-1  #结束位置
                break        
        lstW=[]
        for i in range(ei,si-1,-1):  #查找此控件保存代码
            if lst[i].split('.')[1] and wgtN in lst[i].split('.')[1]:  #找到此控件
                lstW.append(lst[i]) 
                del lst[i]
        if upD==1:  #上移控件
            for i in range(si,ei-len(lstW)):  #查找上面的控件
                if mN in lst[i].split('.')[1]: #找到上面的控件
                    for it in lstW: lst.insert(i,it)#在此插入此控件
                    break            
        else:  #下移控件
            for i in range(ei-len(lstW),si-1,-1):  #查找下面的控件
                if mN in lst[i].split('.')[1]: #找到下面的控件
                    for it in lstW: lst.insert(i 1,it)#在此插入此控件cmm.t("运行")
                    break        
        cmm.filePath[idx][1]='\n'.join(lst)  #还原代码文本
        if modeN:  #当前是图形模式 
            cmm.prmToRC(idx)
            for k,v in cmm.filePath[idx][3].items():  #删除界面中所有控件
                if k=='cvsGUI':continue                    
                v.master.destroy()
            cmm.showGUI(idx)
            cmm.lstSW[0]=cmm.filePath[idx][3][wgtN].master
        else:  #当前是文本模式            
            cmm.rNB.children[pageKey]._lineHash.clear()
            cmm.rNB.children[pageKey].textNow.delete('1.0','end')
            cmm.rNB.children[pageKey].insert('1.0',cmm.filePath[idx][1])  #显示文本内容            
            cmm.prmToRC(idx)
        cmm.showSG()
        cmm.filePath[idx][4]=1  #代码文本编辑标志设为已经编辑
if __name__ == "__main__":
    #sys.path.insert(0, r".\packages")  #添加搜索库路径
    cmm.parser=configparser.ConfigParser()  # 创建一个ConfigParser对象
    cmm.parser.optionxform = str          # 保持大小写
    if not cmm.parser.read('default.ini', encoding="utf-8-sig"): # 读取配置文件,windows用utf-8-sig
        messagebox.showwarning('Configuration File Error','default.ini file not found or failed to read!')
        sys.exit(0)  #退出进程
    cmm.language=cmm.parser['default']['language']  
    if cmm.language!='简体中文':  #其他文字
        cmm.initLg(cmm.language)  #之前选中的语言,空值是英文版本
    cmm.pythonV=cmm.parser['default']['pythonV']  #选择的python编译器版本,空值是3.8版本
    cmm.fontN=cmm.parser['default']['fontN']  #字体
    cmm.fontSz=cmm.parser['default']['fontSz']  #字体大小
    root = tk.Tk()
    root.title('SeeTk')   # 设置标题  
    cmm.root=root 
    root.option_add("*Font","cmm.t('微软雅黑')" " 10")  #tk全局字体,控制基于root的控件的字体大小
    root.option_add("*Menu.font","cmm.t('微软雅黑')" " 10")  #tk各菜单项字体     
    icoRun=tk.PhotoImage(file='ico/run.png')  #运行图标
    icoLeft=tk.PhotoImage(file='ico/left.png')  #左对齐图标
    icoRight=tk.PhotoImage(file='ico/right.png')  #右对齐图标
    icoUp=tk.PhotoImage(file='ico/up.png')  #上对齐图标
    icoDown=tk.PhotoImage(file='ico/down.png')  #下对齐图标  
    icoHor=tk.PhotoImage(file='ico/hor.png')  #下对齐图标
    icoVer=tk.PhotoImage(file='ico/ver.png')  #下对齐图标 
    icoTP=tk.PhotoImage(file='ico/textPic2.png')  #下对齐图标  
    icoSave=tk.PhotoImage(file='ico/save.png')  #保存
    icoNP=tk.PhotoImage(file='ico/newP.png')  #新建工程
    icoOF=tk.PhotoImage(file='ico/openF.png')  #打开文件
    icoCopy=tk.PhotoImage(file='ico/copy.png')  #复制文件
    icoPaste=tk.PhotoImage(file='ico/paste.png')  #粘贴文件
    icoCancel=tk.PhotoImage(file='ico/undo.png')  #
    icoDel=tk.PhotoImage(file='ico/del3.png')  #
    icoCut=tk.PhotoImage(file='ico/cut.png')  #
    cmm.icoFolder=tk.PhotoImage(file='ico/folder2.png')  #文件夹关闭图标
    cmm.icoFN=tk.PhotoImage(file='ico/folder3.png')  #文件夹打开图标
    cmm.icoFile=tk.PhotoImage(file='ico/txt.png')  #文件图标    
    cmm.myDlg=mainGUI(root)  #调用类mainGUI,创建界面  
    if cmm.parser['default']['winW']:winW=int(cmm.parser['default']['winW']) #程序窗口宽
    else: winW=1300
    if cmm.parser['default']['winH']:winH=int(cmm.parser['default']['winH']) #程序窗口高
    else: winH=740
    screenW = root.winfo_screenwidth() #屏幕宽
    screenH = root.winfo_screenheight() #屏幕高
    if cmm.parser['default']['x']:x=int(cmm.parser['default']['x'])
    else:x=(screenW-winW)//2 #x坐标
    if cmm.parser['default']['y']:y=int(cmm.parser['default']['y'])
    else:y=(screenH-winH)//2-20 #y坐标,20是标题 菜单栏的高度
    root.geometry(f'{winW}x{winH} {x} {y}')  #'宽度x高度 X偏移 Y偏移'
    root.resizable(width=True, height=True)  # 设置窗口是否可变长、宽(True:可变,False:不可变)
    menuBar.menu(root)   
    root.bind('<F9>',lambda e:menuBar.run())     #F9运行用户编写的程序
    root.mainloop()  #开启消息循环

实例下载地址

拉拖拽生成tkinter界面

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警