用Tkinter打造自己的Python IDE开发工具(3)可调整分割布局、文件夹和文件名选择及目录树

用Tkinter打造自己的Python IDE开发工具(3)可调整分割布局、文件夹和文件名选择及目录树
这一篇重点介绍可调整分割布局。
建立可分割区域需要用控件tk.PanedWindow。使用方法见下面代码。
其中我们Tree控件使用了HP_tk.py模块中的,购买<零基础搭建量化投资系统――以Python为工具>正版书,加读者群下载源代码。在xb2g.zig压缩包中。

#分割窗口为左右两部分
#建立可分割区域paned
paned= tk.PanedWindow(root,orient=tk.HORIZONTAL,showhandle=True, \
                    sashrelief=tk.SUNKEN,sashwidth=1)  #默认是左右分布的
paned.pack(fill=tk.BOTH, expand=1) #放到主窗口,上下左右缩放
#可分割区域左面增加一个树控件tree
tree = htk.Tree(paned,ico=True,width=200,bg='black')
tree.load_path('./') #为树控件加载指定的目录树
tree.pack(expand = 1, fill = tk.BOTH)

paned.add(tree)   #把树控件增加到可调区域
paned.paneconfig(tree,width=200) #设置树控件宽度 

#在左右可调区域中创建,可上下调整区域paned2
paned2 = tk.PanedWindow(paned,orient=tk.VERTICAL, showhandle=True, sashrelief=tk.SUNKEN,width=int((winw-300)/2),sashwidth=1)
paned.add(paned2)

后面的设计要放到paned和paned2中。见图片。
用Tkinter打造自己的Python IDE开发工具(3)可调整分割布局、文件夹和文件名选择及目录树_第1张图片
下来实现选在文件夹和文件功能。
选择文件夹函数askdirectory(),选择文件函数askopenfilename()。
这2个函数在Tkinter的filedialog模块中。使用方法见下面代码,代码中有详细说明。
我们给出全部代码myide002.py。

# -*- coding: utf-8 -*-
"""
#功能:Python小白代码编辑器
#版本:Ver1.00
#设计人:独狼荷蒲
#电话:18578755056
#QQ:2775205/2886002
#小白量化中文PythonTkinter群:983815766
#百度:荷蒲指标,小白量化
#开始设计日期: 2022-01-21
#使用者请同意最后<版权声明>
#最后修改日期:2022125日
#主程序:myide.py
"""
import  tkinter  as  tk   #导入Tkinter
import  tkinter.ttk  as  ttk   #导入Tkinter.ttk
from  tkinter.scrolledtext  import ScrolledText  #导入ScrolledText
from tkinter.filedialog import *

mytitle='小白Python编辑器'

#建立主窗口
root=tk.Tk()
root.title(mytitle)
root.geometry('{}x{}+{}+{}'.format(800, 600, 100, 100))
screenwidth = root.winfo_screenwidth()  #获取屏幕宽度(单位:像素)
screenheight = root.winfo_screenheight()  #获取屏幕高度(单位:像素)
winw= root.winfo_width()   #获取窗口宽度(单位:像素)
winh = root.winfo_height()  #获取窗口高度(单位:像素)

#放几个按钮
frame=tk.Frame(root)
button1=tk.Button(frame,text='新文件')
button2=tk.Button(frame,text='读取文件')
button3=tk.Button(frame,text='另存文件')
button4=tk.Button(frame,text='执行程序')
button5=tk.Button(frame,text='清空信息窗')
button6=tk.Button(frame,text='选择目录')

button1.pack(side=tk.LEFT)
button2.pack(side=tk.LEFT)
button3.pack(side=tk.LEFT)
button4.pack(side=tk.LEFT)
button5.pack(side=tk.RIGHT)
button6.pack(side=tk.LEFT)
frame.pack(side=tk.TOP,fill=tk.BOTH)

#分割窗口为左右两部分
#建立可分割区域paned
paned= tk.PanedWindow(root,orient=tk.HORIZONTAL,showhandle=True, \
                    sashrelief=tk.SUNKEN,sashwidth=1)  #默认是左右分布的
paned.pack(fill=tk.BOTH, expand=1) #放到主窗口,上下左右缩放
#可分割区域左面增加一个树控件tree
tree = htk.Tree(paned,ico=True,width=200,bg='black')
tree.load_path('./') #为树控件加载指定的目录树
tree.pack(expand = 1, fill = tk.BOTH)

paned.add(tree)   #把树控件增加到可调区域
paned.paneconfig(tree,width=200) #设置树控件宽度 200

#选择目录
def selectdirectory():
    path_ = askdirectory()
    tree.clear()
    tree.load_path(path_ ) #为树控件加载指定的目录树

#树鼠标双击事件
def treeDoubleClick(event):
    global textPad,filename
    item = tree.tree.selection()[0]
    i2=tree.tree.parent(item)
    s2=""
    while i2!="":
        s2=tree.tree.item(i2, "text")+'\\'+s2
        i2=tree.tree.parent(i2)
    txt2=s2+tree.tree.item(item, "text")
    if txt2[-4:]=='.txt' or txt2[-3:]=='.py':
        filename2=txt2
        textPad.delete(1.0,tk.END)#delete all
        f = open(filename2,'r',encoding='utf-8',errors='ignore')
        textPad.insert(1.0,f.read())
        f.close()
        filename=filename2
tree.usepop=treeDoubleClick  #绑定双击事件

#在左右可调区域中创建,可上下调整区域paned2
paned2 = tk.PanedWindow(paned,orient=tk.VERTICAL, showhandle=True, sashrelief=tk.SUNKEN,width=int((winw-300)/2),sashwidth=1)
paned.add(paned2)

#放置一个文本框
global textPad
textPad= ScrolledText(paned2,bg='white')
textPad.pack(fill=tk.BOTH, expand=1)
textPad.focus_set()

paned2.add(textPad)
paned2.paneconfig(textPad,heigh=400)

#建立分割区域paned3
paned3 = tk.PanedWindow(paned2,orient=tk.VERTICAL, showhandle=True, sashrelief=tk.SUNKEN,width=int((winw-300)/2),bg='black',sashwidth=1)
paned2.add(paned3)

global filename
filename='newfile.py'

#实现按钮功能
def btnfunc01():  #新文件
    global textPad,filename
    textPad.delete(1.0,tk.END)
    filename='newfile.py'

def btnfunc02(): #读取文件
    global textPad,filename
    filename2 = askopenfilename(defaultextension='.py')
    if filename2 != '':
        textPad.delete(1.0,tk.END)#delete all
        f = open(filename2,'r',encoding='utf-8',errors='ignore')
        textPad.insert(1.0,f.read())
        f.close()
        filename=filename2


def btnfunc03(): #另存文件
    global textPad,filename
    filename = asksaveasfilename(initialfile = filename,defaultextension ='.py')
    if filename != '':
        fh = open(filename,'w',encoding='utf-8',errors='ignore')
        msg = textPad.get(1.0,tk.END)
        fh.write(msg)
        fh.close()

#为按钮设置功能
button1['command']=lambda:btnfunc01()
button2['command']=lambda:btnfunc02()
button3['command']=lambda:btnfunc03()

##为信息框设置一个容器
frame2=tk.LabelFrame(paned3,text='信息框',height=100)
frame2.pack(fill=tk.BOTH, expand=1)

global textMess

#放置一个文本框作为信息输出窗口
textMess= ScrolledText(frame2,bg='white', height=10)
textMess.pack(fill=tk.BOTH, expand=1)
##清空信息窗
def clearMess():
    global textMess
    textMess.delete(1.0,tk.END)

#用户输出信息
def myprint(txt):
    global textMess
    if textMess != None :
        textMess.insert(tk.END, txt)
        textMess.see(tk.END)

#输出彩色信息
def colorprint(txt,color='black'):
    global textMess
    if textMess != None :
        if color!='black':
            textMess.tag_config(color, foreground=color)   
        textMess.insert(tk.END, txt,color)
        textMess.see(tk.END)

#运行用户程序
def runpy():
    global textPad,textMess
    try:
        msg = textPad.get(1.0,tk.END)
        mg=globals()
        ml=locals()
        exec(msg,mg,ml)
    except Exception as e:
        colorprint('\n#用户代码出错:'+str(e)+'\n','red')
        
button4['command']=lambda:runpy()
button5['command']=lambda:clearMess()
button6['command']=lambda:selectdirectory()

root.mainloop() #进入Tkinter消息循环

程序运行如下图。左右和上校布局都可以动态调整。
双击目录树杨辉三角.py文件,自动装载代码。点运行代码。结果入下图。
用Tkinter打造自己的Python IDE开发工具(3)可调整分割布局、文件夹和文件名选择及目录树_第2张图片

好了,欢迎继续关注我的博客。
超越自己是我的每一步!我的进步就是你的进步!

你可能感兴趣的:(软件开发,python,源代码,python,ide,开发语言,荷蒲,Tkinter)