|
|
我也试了一下,只要100多行。但按要求装了个GCC。
- import tkinter as tk
- from tkinter import filedialog, messagebox, scrolledtext
- import subprocess
- import os
- import sys
- class TurboCIDE:
- def __init__(self, root):
- self.root = root
- self.root.title("Turbo C IDE - Python Edition")
- self.root.geometry("800x600")
- self.file_path = None
- # 设置经典 Turbo C 风格(蓝底白字)
- self.root.configure(bg='blue')
- self.root.option_add("*Background", "blue")
- self.root.option_add("*Foreground", "white")
- self.root.option_add("*Font", "Courier 12")
- # 创建菜单栏
- self.create_menu()
- # 创建文本编辑区
- self.text_area = scrolledtext.ScrolledText(
- root,
- wrap=tk.WORD,
- bg='black',
- fg='white',
- insertbackground='white',
- font=("Courier", 12)
- )
- self.text_area.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
- # 创建状态栏
- self.status_bar = tk.Label(
- root,
- text="Ready",
- bd=1,
- relief=tk.SUNKEN,
- anchor=tk.W,
- bg='darkblue',
- fg='white'
- )
- self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
- # 绑定事件
- self.text_area.bind("<KeyRelease>", self.on_key_release)
- def create_menu(self):
- menu_bar = tk.Menu(self.root, bg='blue', fg='white')
- self.root.config(menu=menu_bar)
- # 文件菜单
- file_menu = tk.Menu(menu_bar, tearoff=0, bg='blue', fg='white')
- file_menu.add_command(label="新建", command=self.new_file, accelerator="Ctrl+N")
- file_menu.add_command(label="打开...", command=self.open_file, accelerator="Ctrl+O")
- file_menu.add_command(label="保存", command=self.save_file, accelerator="Ctrl+S")
- file_menu.add_separator()
- file_menu.add_command(label="退出", command=self.root.quit)
- menu_bar.add_cascade(label="文件", menu=file_menu)
- # 运行菜单
- run_menu = tk.Menu(menu_bar, tearoff=0, bg='blue', fg='white')
- run_menu.add_command(label="编译并运行", command=self.run_code, accelerator="F9")
- menu_bar.add_cascade(label="运行", menu=run_menu)
- # 绑定快捷键
- self.root.bind('<Control-n>', lambda e: self.new_file())
- self.root.bind('<Control-o>', lambda e: self.open_file())
- self.root.bind('<Control-s>', lambda e: self.save_file())
- self.root.bind('<F9>', lambda e: self.run_code())
- def new_file(self):
- self.text_area.delete(1.0, tk.END)
- self.file_path = None
- self.update_status("新建文件")
- def open_file(self):
- path = filedialog.askopenfilename(
- filetypes=[("C Files", "*.c"), ("All Files", "*.*")]
- )
- if path:
- try:
- with open(path, 'r', encoding='utf-8') as f:
- content = f.read()
- self.text_area.delete(1.0, tk.END)
- self.text_area.insert(1.0, content)
- self.file_path = path
- self.update_status(f"打开: {path}")
- except Exception as e:
- messagebox.showerror("错误", f"无法打开文件:\n{e}")
- def save_file(self):
- if self.file_path:
- try:
- with open(self.file_path, 'w', encoding='utf-8') as f:
- f.write(self.text_area.get(1.0, tk.END))
- self.update_status(f"已保存: {self.file_path}")
- except Exception as e:
- messagebox.showerror("错误", f"无法保存文件:\n{e}")
- else:
- self.save_as()
- def save_as(self):
- path = filedialog.asksaveasfilename(
- defaultextension=".c",
- filetypes=[("C Files", "*.c"), ("All Files", "*.*")]
- )
- if path:
- self.file_path = path
- self.save_file()
- def update_status(self, msg):
- self.status_bar.config(text=msg)
- def on_key_release(self, event=None):
- # 简单语法高亮(可选增强)
- self.highlight_syntax()
- def highlight_syntax(self):
- # 清除已有标签
- for tag in self.text_area.tag_names():
- if tag != "sel": # 保留选择高亮
- self.text_area.tag_delete(tag)
- keywords = [
- 'int', 'char', 'float', 'double', 'void', 'if', 'else', 'for', 'while',
- 'do', 'return', 'include', 'stdio.h', 'stdlib.h', 'main'
- ]
- content = self.text_area.get(1.0, tk.END)
- for word in keywords:
- start = "1.0"
- while True:
- pos = self.text_area.search(rf'\b{word}\b', start, stopindex=tk.END, regexp=True)
- if not pos:
- break
- end = f"{pos}+{len(word)}c"
- self.text_area.tag_add(word, pos, end)
- self.text_area.tag_config(word, foreground="yellow")
- start = end
- def run_code(self):
- if not self.file_path:
- self.save_as()
- if not self.file_path:
- return
- # 保存当前内容
- self.save_file()
- # 编译并运行
- dir_name = os.path.dirname(self.file_path)
- base_name = os.path.splitext(os.path.basename(self.file_path))[0]
- exe_path = os.path.join(dir_name, base_name + (".exe" if os.name == 'nt' else ""))
- try:
- # 编译
- result = subprocess.run(
- ["gcc", self.file_path, "-o", exe_path],
- capture_output=True,
- text=True,
- cwd=dir_name
- )
- if result.returncode != 0:
- messagebox.showerror("编译错误", result.stderr)
- return
- # 运行
- run_result = subprocess.run(
- [exe_path],
- capture_output=True,
- text=True,
- cwd=dir_name
- )
- # 显示输出
- output = run_result.stdout or "(程序无输出)"
- if run_result.stderr:
- output += "\n[错误]: " + run_result.stderr
- messagebox.showinfo("程序输出", output)
- except FileNotFoundError:
- messagebox.showerror("错误", "未找到 gcc 编译器!\n请安装 MinGW (Windows) 或确保 gcc 已安装。")
- except Exception as e:
- messagebox.showerror("运行错误", str(e))
- if __name__ == "__main__":
- root = tk.Tk()
- app = TurboCIDE(root)
- root.mainloop()
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|