用Tkinter打造自己的Python IDE开发工具(2)实现Python代码执行并输出信息
上一篇我们介绍了编辑器的实现。这篇介绍实现Python代码执行并输出信息。
执行Python代码,我们使用函数exec()。其用法如下。
exec(object[, globals[, locals]])
具体使用,我们见后面的代码,有详细注释,如果不清楚可以来我的QQ群咨询。
我们创建一个输出信息窗。
为了美观,我们使用了LabelFrame容器控件。
在这个控件中再放置一个ScrolledText控件,作为输出信息框textMess。
再增加2个按钮,【执行程序】【清空信息窗】。
整个界面就设计完成了,见下图。
首先我们想把程序输出信息输出到信息窗口中。我们目前不能直接用print()语句进行输出,也不能用input()语句进行输入。以后再教如何实现。
如果你想了解怎么接管或截取print()和input()语句,可以参考我开发的模块HP_tk.py中的源代码。
class console就是接管print()和input()语句。
购买<零基础搭建量化投资系统――以Python为工具>正版书,加读者群下载源代码。在xb2g.zig压缩包中。
京东购买网址
https://item.jd.com/61567375505.html
天猫购买网址
https://detail.tmall.com/item.htm?id=607469269858
我们这里先仿print()语句,输出到信息框。
我们设计了2个输出函数,文本输出函数myprint()和输出彩色信息函数colorprint()。实现代码如下。
#用户输出信息 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)
最后再实现【执行程序】【清空信息窗】这2个按钮的操作。
##清空信息窗 def clearMess(): global textMess textMess.delete(1.0,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')
下面我们给出完成程序代码myide001.py。
# -*- coding: utf-8 -*- """ #功能:Python小白代码编辑器 #版本:Ver1.00 #设计人:独狼荷蒲 #电话:18578755056 #QQ:2775205/2886002 #小白量化中文PythonTkinter群:983815766 #百度:荷蒲指标,小白量化 #开始设计日期: 2022-01-21 #使用者请同意最后<版权声明> #最后修改日期:2022年1月25日 #主程序: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)) #放几个按钮 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='清空信息窗') 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) frame.pack(side=tk.TOP,fill=tk.BOTH) #放置一个文本框 global textPad textPad= ScrolledText(bg='white') textPad.pack(fill=tk.BOTH, expand=1) textPad.focus_set() 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(root,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() root.mainloop() #进入Tkinter消息循环
这个程序的运行结果见上图。
我建议读者将这个编辑器改名为自己喜欢的编辑器的名字。
mytitle='小白Python编辑器'
修改这里就可以了。
我们在这个编辑器中,编写并执行自己开发的代码。
我们用Python设计一个杨辉三角程序,这个程序只能在我们开发的IDE中运行,完成程序代码如下:
#杨辉三角 def triangles(): N=[1] #初始化为[1],杨辉三角的每一行为一个list while True: yield N #yield 实现记录功能,没有下一个next将跳出循环, S=N[:] #将list N赋给S,通过S计算每一行 S.append(0) #将list添加0,作为最后一个元素,长度增加1 N=[S[i-1]+S[i] for i in range(len(S))] #通过S来计算得出N colorprint('杨辉三角\n','blue') n = 0 results = [] for t in triangles(): myprint(t) myprint('\n') #换行 results.append(t) n = n + 1 if n == 10: break colorprint('超越自己,是我的每一步,我的进步就是你的进步。','red') colorprint(' 小白量化中文PythonTkinter群:983815766 \n','blue')
程序运行结果见下图。
也许一些读者说这个IDE太简单了,我们这里是通过设计IDE引导大家学习Python的兴趣,并逐步成为Python大牛。
设计下面的IDE也很容易。
好了,欢迎继续关注我的博客。
超越自己是我的每一步!我的进步就是你的进步!