用Tkinter打造自己的Python IDE开发工具(2)实现Python代码执行并输出信息

113 篇文章 46 订阅
105 篇文章 107 订阅

用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
#使用者请同意最后<版权声明>
#最后修改日期: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))

#放几个按钮
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也很容易。
在这里插入图片描述
好了,欢迎继续关注我的博客。
超越自己是我的每一步!我的进步就是你的进步!

  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
你可以使用Tkinter的Text控件来显示程序的输出。以下是一个简单的例子,演示如何使用Text控件来显示输出: ```python import tkinter as tk class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master self.pack() self.create_widgets() def create_widgets(self): self.output = tk.Text(self) self.output.pack() self.button = tk.Button(self, text="Run", command=self.run_program) self.button.pack() def run_program(self): # 这里是你要运行的程序 output_str = "Hello, world!" # 这里是程序的输出 self.output.insert(tk.END, output_str) root = tk.Tk() app = Application(master=root) app.mainloop() ``` 在这个例子中,我们创建了一个名为Application的类,它继承了Tkinter的Frame类。在构造函数中,我们创建了一个Text控件和一个Button控件。当用户点击Button控件时,我们调用run_program()方法来运行程序并将输出显示在Text控件中。 在run_program()方法中,你需要编写你要运行的程序,并将输出存储在一个字符串变量中。然后,通过调用Text控件的insert()方法,将输出插入到Text控件中。 注意,insert()方法的第一个参数是插入位置。在这个例子中,我们使用了tk.END,这表示插入在Text控件的末尾。你也可以使用行列号来指定插入位置。例如,使用self.output.insert("1.0", output_str)将输出插入到Text控件的第一行第一列。 希望这个例子对你有所帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荷蒲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值