数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 306|回复: 8

[other] 用 python 写个 turbo C IDE

[复制链接]
发表于 2025-10-12 22:50:58 | 显示全部楼层 |阅读模式
本帖最后由 kpj001 于 2025-10-12 23:29 编辑

bh4qix 发表于 2025-10-12 14:23
朋友,你看出这是 burbo C 代码,就推翻了这句话: burboC 不是大软件。



刚才本坛80年代穿越者 “bh4qix” 说 turbo 是个“大”软件, 然后又把帖子内容删除了。

那么试试看让免费打工人 DS 用 python 写个 “仿 turbo C IDE” , 结果大概400行代码(左);然后运行之,弹出蓝色界面(中);再写一个 c 的串口与单片机的时间同步程序,成功运行后弹出运行结果(右)

看起来有些脱了裤子放屁,直接用python写串口程序不就完了。

不过有些时候想尝试下C, 这个就有些意思了。安装虚拟机麻烦了一些,用在线IDE可以跑许多代码,但跑图上这个已经跑通的“串口程序” 这些还是一堆的报错。(这也是在线IDE的通病,稍微底层一点的硬件访问就抓虾)

啰嗦几句:当年用 mscomm.ocx 写串口程序,那个酸爽。。。没想到现在 so easy




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2025-10-12 23:14:21 | 显示全部楼层
Python太大了...


二○二五年十月十二日
回复 支持 反对

使用道具 举报

发表于 2025-10-13 13:20:30 来自手机浏览器 | 显示全部楼层
那个时候tc得2张软盘吧,dos也得一张
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-10-13 14:22:31 | 显示全部楼层
玛德陛下 发表于 2025-10-13 13:20
那个时候tc得2张软盘吧,dos也得一张

dos 基本启动1张,完全体也有3张的,加上汉卡什么的就更多了
回复 支持 反对

使用道具 举报

发表于 2025-10-15 08:45:39 | 显示全部楼层
在当年的机子中,用Python能跑起来吗?速度有多快
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
网络孤客 发表于 2025-10-15 08:45
在当年的机子中,用Python能跑起来吗?速度有多快

1991年就有了,速度肯定没问题。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
kindzhon 发表于 2025-10-23 16:21
1991年就有了,速度肯定没问题。

我意思不是说跑Python,而是跑python版的turbo C IDE
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
网络孤客 发表于 2025-10-23 16:25
我意思不是说跑Python,而是跑python版的turbo C IDE

想啥呢,python虽然可以只有几行代码出结果,但是引用的模块一多也是很吃资源的。别说当年老爷机,就是DDR4 以前的电脑都吃力。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
我也试了一下,只要100多行。但按要求装了个GCC。

  1. import tkinter as tk
  2. from tkinter import filedialog, messagebox, scrolledtext
  3. import subprocess
  4. import os
  5. import sys

  6. class TurboCIDE:
  7.     def __init__(self, root):
  8.         self.root = root
  9.         self.root.title("Turbo C IDE - Python Edition")
  10.         self.root.geometry("800x600")
  11.         self.file_path = None

  12.         # 设置经典 Turbo C 风格(蓝底白字)
  13.         self.root.configure(bg='blue')
  14.         self.root.option_add("*Background", "blue")
  15.         self.root.option_add("*Foreground", "white")
  16.         self.root.option_add("*Font", "Courier 12")

  17.         # 创建菜单栏
  18.         self.create_menu()

  19.         # 创建文本编辑区
  20.         self.text_area = scrolledtext.ScrolledText(
  21.             root,
  22.             wrap=tk.WORD,
  23.             bg='black',
  24.             fg='white',
  25.             insertbackground='white',
  26.             font=("Courier", 12)
  27.         )
  28.         self.text_area.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

  29.         # 创建状态栏
  30.         self.status_bar = tk.Label(
  31.             root,
  32.             text="Ready",
  33.             bd=1,
  34.             relief=tk.SUNKEN,
  35.             anchor=tk.W,
  36.             bg='darkblue',
  37.             fg='white'
  38.         )
  39.         self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)

  40.         # 绑定事件
  41.         self.text_area.bind("<KeyRelease>", self.on_key_release)

  42.     def create_menu(self):
  43.         menu_bar = tk.Menu(self.root, bg='blue', fg='white')
  44.         self.root.config(menu=menu_bar)

  45.         # 文件菜单
  46.         file_menu = tk.Menu(menu_bar, tearoff=0, bg='blue', fg='white')
  47.         file_menu.add_command(label="新建", command=self.new_file, accelerator="Ctrl+N")
  48.         file_menu.add_command(label="打开...", command=self.open_file, accelerator="Ctrl+O")
  49.         file_menu.add_command(label="保存", command=self.save_file, accelerator="Ctrl+S")
  50.         file_menu.add_separator()
  51.         file_menu.add_command(label="退出", command=self.root.quit)
  52.         menu_bar.add_cascade(label="文件", menu=file_menu)

  53.         # 运行菜单
  54.         run_menu = tk.Menu(menu_bar, tearoff=0, bg='blue', fg='white')
  55.         run_menu.add_command(label="编译并运行", command=self.run_code, accelerator="F9")
  56.         menu_bar.add_cascade(label="运行", menu=run_menu)

  57.         # 绑定快捷键
  58.         self.root.bind('<Control-n>', lambda e: self.new_file())
  59.         self.root.bind('<Control-o>', lambda e: self.open_file())
  60.         self.root.bind('<Control-s>', lambda e: self.save_file())
  61.         self.root.bind('<F9>', lambda e: self.run_code())

  62.     def new_file(self):
  63.         self.text_area.delete(1.0, tk.END)
  64.         self.file_path = None
  65.         self.update_status("新建文件")

  66.     def open_file(self):
  67.         path = filedialog.askopenfilename(
  68.             filetypes=[("C Files", "*.c"), ("All Files", "*.*")]
  69.         )
  70.         if path:
  71.             try:
  72.                 with open(path, 'r', encoding='utf-8') as f:
  73.                     content = f.read()
  74.                 self.text_area.delete(1.0, tk.END)
  75.                 self.text_area.insert(1.0, content)
  76.                 self.file_path = path
  77.                 self.update_status(f"打开: {path}")
  78.             except Exception as e:
  79.                 messagebox.showerror("错误", f"无法打开文件:\n{e}")

  80.     def save_file(self):
  81.         if self.file_path:
  82.             try:
  83.                 with open(self.file_path, 'w', encoding='utf-8') as f:
  84.                     f.write(self.text_area.get(1.0, tk.END))
  85.                 self.update_status(f"已保存: {self.file_path}")
  86.             except Exception as e:
  87.                 messagebox.showerror("错误", f"无法保存文件:\n{e}")
  88.         else:
  89.             self.save_as()

  90.     def save_as(self):
  91.         path = filedialog.asksaveasfilename(
  92.             defaultextension=".c",
  93.             filetypes=[("C Files", "*.c"), ("All Files", "*.*")]
  94.         )
  95.         if path:
  96.             self.file_path = path
  97.             self.save_file()

  98.     def update_status(self, msg):
  99.         self.status_bar.config(text=msg)

  100.     def on_key_release(self, event=None):
  101.         # 简单语法高亮(可选增强)
  102.         self.highlight_syntax()

  103.     def highlight_syntax(self):
  104.         # 清除已有标签
  105.         for tag in self.text_area.tag_names():
  106.             if tag != "sel":  # 保留选择高亮
  107.                 self.text_area.tag_delete(tag)

  108.         keywords = [
  109.             'int', 'char', 'float', 'double', 'void', 'if', 'else', 'for', 'while',
  110.             'do', 'return', 'include', 'stdio.h', 'stdlib.h', 'main'
  111.         ]

  112.         content = self.text_area.get(1.0, tk.END)
  113.         for word in keywords:
  114.             start = "1.0"
  115.             while True:
  116.                 pos = self.text_area.search(rf'\b{word}\b', start, stopindex=tk.END, regexp=True)
  117.                 if not pos:
  118.                     break
  119.                 end = f"{pos}+{len(word)}c"
  120.                 self.text_area.tag_add(word, pos, end)
  121.                 self.text_area.tag_config(word, foreground="yellow")
  122.                 start = end

  123.     def run_code(self):
  124.         if not self.file_path:
  125.             self.save_as()
  126.             if not self.file_path:
  127.                 return

  128.         # 保存当前内容
  129.         self.save_file()

  130.         # 编译并运行
  131.         dir_name = os.path.dirname(self.file_path)
  132.         base_name = os.path.splitext(os.path.basename(self.file_path))[0]
  133.         exe_path = os.path.join(dir_name, base_name + (".exe" if os.name == 'nt' else ""))

  134.         try:
  135.             # 编译
  136.             result = subprocess.run(
  137.                 ["gcc", self.file_path, "-o", exe_path],
  138.                 capture_output=True,
  139.                 text=True,
  140.                 cwd=dir_name
  141.             )
  142.             if result.returncode != 0:
  143.                 messagebox.showerror("编译错误", result.stderr)
  144.                 return

  145.             # 运行
  146.             run_result = subprocess.run(
  147.                 [exe_path],
  148.                 capture_output=True,
  149.                 text=True,
  150.                 cwd=dir_name
  151.             )

  152.             # 显示输出
  153.             output = run_result.stdout or "(程序无输出)"
  154.             if run_result.stderr:
  155.                 output += "\n[错误]: " + run_result.stderr

  156.             messagebox.showinfo("程序输出", output)

  157.         except FileNotFoundError:
  158.             messagebox.showerror("错误", "未找到 gcc 编译器!\n请安装 MinGW (Windows) 或确保 gcc 已安装。")
  159.         except Exception as e:
  160.             messagebox.showerror("运行错误", str(e))

  161. if __name__ == "__main__":
  162.     root = tk.Tk()
  163.     app = TurboCIDE(root)
  164.     root.mainloop()
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +30 收起 理由
网络孤客 + 30 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-10-30 17:13 , Processed in 0.249601 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表