- 浏览: 205095 次
- 性别:
- 来自: Wgt
最新评论
-
pxiaozei:
楼主,你这样用,需要在SVN服务器上建Git服务器端么?
SVN+GIT=鱼与熊掌兼得 -
southwolf:
这个项目还在维护吗……
OpenCV+Ruby构建图像处理研究平台 -
w87848608:
请问,比如我利用git,开了一个branch A,做了功能A, ...
SVN+GIT=鱼与熊掌兼得 -
sxlkk:
callmechen 写道本质上还是没有解决合并的繁琐。换汤不 ...
SVN+GIT=鱼与熊掌兼得 -
清气上升:
本地提交,本地错误恢复,eclipse有local histo ...
SVN+GIT=鱼与熊掌兼得
我也标题党一回:300行代码你能做什么?本文介绍一个具有builder风格的RubyGnome2布局器(GtkSimpleLayout)不到300行代码,还包括几个实用的除布局之外的增强功能。
前言
随着RubyGnome2库越来越完善,以及ruby1.9的性能提升,用Ruby编写GUI程序渐渐从我的业余爱好转为我工作的一个重要部分。
用Ruby写程序确实很有乐趣,它可以让你的想法快速地以一种优雅的方式实现。本文介绍的一个gem就是一个例子,用很少的代码,实现很有趣的功能,让编写Ruby GUI程序变得轻松愉快。
RubyGnome2介绍
虽然我以前也曾经多次地介绍过RubyGnome2,但我还是想再一次地推荐RubyGnome2,它实在是使用Ruby编写GUI程序的首选。
RubyGnome2是GTK+库的一个ruby扩展。它对GTK+的对象模型仔细地用Ruby的方式进行封装,保留了GTK+ API命名方式和含义,因此GTK+的文档对于RubyGnome2也是适用的---尽管我认为RubyGnome2的文档已经做得非常不错了,需要回去借鉴GTK文档的地方实在不多。
虽然GTK本身是由C编写的,但它有一套完整的精心设计对象体系,使得它的GUI元件可以非常灵活的自由组合,以实现复杂的,功能强大的界面。
由于GTK非常重视它的对象体系的灵活性,因此刚开始使用GTK编程并不容易。很多时候表面上看起来很简单的一个功能,在GTK里面却要绕几个弯才能实现。例如要设置一个label的字体,要通过Pango来实现,Pango接管了GTK的所有字体渲染事务....这种“多绕几个弯”的情况很多,它确实使得编写GTK程序不那么直接了当。但换来的是整个GTK系统变得非常灵活,以较少的代价实现强大的功能,在跨平台,换肤,国际化上面都有很好的表现。
RubyGnome2继承了GTK的所有特点,包括优点和缺点。
GUI布局
GTK程序的布局很灵活,有许多种容器可选择。在布局的时候,大多数都是推荐相对位置而不是绝对位置,这样GUI程序可以更好的适应不同分辨率的屏幕,也有利于特定风格对UI的fine tune。
最常见的容器就是“盒子”,包括“水平盒子”和“垂直盒子”。将可视的UI元件放入“盒子”,不同的“盒子”互相组合叠放就可以构建出目标布局。
理论上用盒子就可以构建任何相对位置布局,但是为了方面,GTK还提供了像table这样的更高级的容器。
盒子模型对于许多刚开始GTK编程的人觉得很难适应,即使用了可视化布局工具例如Glade,初学者也往往被盒子模型困扰。可视化布局器最擅长的是固定位置布局。对于相对位置布局,很多时候用代码构建界面比用Glade反而来的快捷方便。
但是用代码构建界面有一个显著的缺点,那就是“不直观”,即很难从代码中看出UI布局,这样会给后期维护以及变更带来麻烦。
有一些GUI库如Shose,用builder风格的代码来描述UI,使得UI布局可以通过代码形象地体现出来,如以下这个例子来自shooose.net:
Shoes.app { stack(:margin => 4) { button "Mice" button "Eagles" button "Quail" } }
这样,我们就可以从代码中一下子看出UI布局了。
builder风格的代码和HTML很类似,对于熟悉HTML的web界面设计者来说,可视化的编辑器并没有多大的必要。
RubyGnome2没有为我们提供builder方式的布局,因此UI代码写起来就像:
class MyWin < Gtk::Window def initialize super vbox = Gtk::VBox.new btn_mice = Gtk::Button.new 'Mice' vbox.pack_start btn_mice btn_eagles = Gtk::Button.new 'Eagles' vbox.pack_start btn_eagles btn_quail = Gtk::Button.new 'Quail' vbox.pack_start btn_quail add vbox end end
从上面的代码中很难一下子看出UI布局。
如果也为RubyGnome2构建一个builder风格的布局器,那么代码就会变成:
class MyWin < Gtk::Window def initialize super add my_layout end def my_layout vbox do button 'Mice' button 'Eagles' button 'Quail' end end end
嗯,这个代码就和Shose差不多了,可以从代码中一眼看出UI布局。
本文所介绍的GtkSimpleLayout其功能之一就是为RubyGnome2提供builder风格的布局器。
GtkSimpleLayout布局器
这个简单的布局器原先只有200行不到的代码,我经常是直接拷贝到项目中使用。后来逐渐添了些功能,觉得它变得更有用了,于是便发布到github生成gem,方便感兴趣者使用。
Source: git://github.com/rickyzheng/GtkSimpleLayout.git
or:
gem source -a http://gems.github.com && gem install rickyzheng-GtkSimpleLayout
以下是主要功能介绍以及简单例子。
提供Builder风格布局
正如上面的例子中所介绍的,GtkSimpleLayout为RubyGnome2带来了builder风格的布局功能,只需要为布局的类扩展GtkSimpleLayout::Base即可,一个完整的例子:
require 'gtk2' require 'simple_layout' class MyWin < Gtk::Window include SimpleLayout::Base def initialize super add my_layout signal_connect('destroy') do Gtk.main_quit end end def my_layout hbox do label 'Hello, ' button 'World !' end end end MyWin.new.show_all Gtk.main
从上面的例子中可以看出,GtkSimpleLayout并没有改变RubyGnome2程序的主框架,它只是一个扩充。
属性设置
在放置UI元件的时候,往往需要设置初始属性,或者要指定布局参数。GtkSimpleLayout用Hash来传递这些属性与参数,例如:
vbox do button 'sensitive = false', :sensitive => false # 初始为disable状态 button 'expand space', :layout => [true, true] # 指定这个button填充剩余空间 end
上面这个例子中,第一个button的初始状态为disable。 ":sensitive => false"这个参数最终被转换成属性设置:Gtk::Button#sensitive=false,至于Gtk::Button有那些属性可以设置,请参阅RubyGnome2 API文档或GTK文档。GtkSimpleLayout在这里只是作一个简单参数的转换而已。
第二个button的":layout => [true, true]"有点特殊。":layout" 参数是GtkSimpleLayout的保留参数,它会被转换成当这个UI被放入容器时候的参数。这个例子中,容器是vbox(Gtk::VBox),默认的加入方法是Gtk::VBox#pack_start,这个例子中的[true, true] 最终会被传递到pack_start,因此这个button在被加入vbox的时候调用的方法以及参数是:"Gtk::VBox#pack_start( button, true, true)"。
因此,要使用GtkSimpleLayout,就首先要熟悉RubyGnome2的各个元件,容器的用法,以及参数。当你熟悉了RubyGnome2以后,用GtkSimpleLayout就会非常简单。
批量属性设置
在UI布局的时候,经常碰到要对一组UI元件设置相同的属性的情况,例如:
hbox do button 'C', :layout => [false, false, 5] button 'D', :layout => [false, false, 5] button 'E', :layout => [false, false, 5] end
这个时候,可以用"with_attr"来简化:
hbox do with_attr :layout => [false, false, 5] do button 'C' button 'D' button 'E' end end
特殊容器
有些容器的放置子元件的时候有 特殊要求,例如Gtk::HPaned,左边子窗口要用Gtk::HPaned#add1()来添加,右边的用Gtk::HPaned#add2()。对于这种容器,GtkSimpleLayout要特别对待,就以hpaned为例:
hpaned do area_first do frame 'first area' end area_second do frame 'second area' end end
需要特殊对待的容器有:
- hpaned/vpaned : 用area_first和area_second来添加子窗口。
- table : 用grid来填充格子。
-
nodebook
: 用page来添加子页。
标识UI元件
GtkSimpleLayout用":id => ??"这个参数为UI元件进行标识,例如:
hbox do button 'first', :id => :btn_first button 'second', :id => :btn_second end
之后,可以用component()函数取得这个UI元件:
my_first_button = component(:btn_first) my_second_button = component(:btn_second) ... my_first_button.signal_connect('clicked') do puts "first button clicked" end my_second_button.signal_connect('clicked') do puts "second button clicked" end
如果嫌麻烦,GtkSimpleLayout还提供了expose_components()用于自动将所有已标识的元件添加为实例读属性(getter):
expose_components() # 将自动添加btn_first和btn_second这两个读属性(getter)。 ... btn_first.signal_connect('clicked') do puts "first button clicked" end btn_second.signal_connect('clicked') do puts "second button clicked" end
自动事件响应映射
如果你嫌显式调用signal_connect来注册事件麻烦,那么GtkSimpleLayout为你提供了自动事件响应映射的功能:
require 'gtk2' require 'simple_layout' class MyWin < Gtk::Window include SimpleLayout::Base def initialize super add my_layout register_auto_events() # 注册自动事件响应映射 end def my_layout hbox do button "First', :btn_first button "Second", :btn_second end end # 事件响应函数 def btn_first_on_clicked(*_) puts "First button clicked" end # 事件响应函数 def btn_second_on_clicked(*_) puts "Second button clicked" end # 退出事件响应函数 def self_on_destroy(*_) Gtk.main_quit end end
最后那个'self‘是指宿主容器。
UI分组
有时候你希望对UI元件进行分组,这样就可以对同一组的UI元件进行控制,如使能或禁止整个组。GtkSimpleLayout允许你在布局的时候指定UI组。
GtkSimpleLayout的UI分组规则如下:
- 默认情况下,已命名的容器(即传入了:id参数)自动对自己所属的子元件建立一个组,组名就是容器明。
- 如果容器传入:gid=>??参数,则以此名称为所属子元件建立组。
- 允许多个容器的:gid名字相同,这种情况下所属子元件将归为同一个组。
- 可以用“group”来显式对UI分组,group可以看作是一个虚拟的容器。
用component_children(group_name)来获取UI组。
由于UI分组的例子比较长不在此列出,请参阅源码中的examples/group.rb文件
UI与逻辑代码分离
由于GtkSimpleLayout潜在地迫使使用者分离界面代码和逻辑处理(或事件响应)代码,使得整个程序的层次结构更加清晰。对于界面元件比较多的程序,可以很方便的分区进行layout,因为layout的结果还是容器,这个容器又可以放入其他容器组合成更复杂的界面。
由于GtkSimpleLayout并不改变RubyGnome2的程序结构,你可以选择在你的程序中部分或全部使用GtkSimpleLayout。虽然本文所提供的例子都是静态布局,但由于GtkSimpleLayout是存代码构建UI,因此你完全可以在布局的时候传入变量,进行动态布局和动态生成UI,而仍然保持UI代码的“可视化”。
有兴趣者可以看看GtkSimpleLayout实现的代码,不过300行而已,这就是Ruby的魅力。
最后,贴上一个计算器的界面部分的代码例子,你能从代码中看出UI布局么?
require 'gtk2' require 'simple_layout' class MyWin < Gtk::Window include SimpleLayout::Base def initialize super add my_layout signal_connect('destroy') do Gtk.main_quit end end def my_layout vbox do with_attr :border_width => 3 do hbox do entry :id => :ent_input, :layout => [true, true, 5] end hbox do frame do label 'M', :set_size_request => [20, 20] end hbutton_box do button 'Backspace' button 'CE' button 'C' end end hbox do vbutton_box do button 'MC' button 'MR' button 'MS' button 'M+' end with_attr :layout => [true, true] do number_and_operators_layout end end end end end def number_and_operators_layout vbox do [ ['7', '8', '9', '/', 'sqt'], ['4', '5', '6', '*', '%'], ['1', '2', '3', '-', '1/x'], ['0', '+/=', '.', '+', '=']].each do |cols| hbox :layout => [true, true] do cols.each do |txt| button txt, :set_size_request => [20, 20], :layout => [true, true] end end end end end end MyWin.new.show_all Gtk.main
Enjoy it :-)
评论
<div class="quote_div">
<div class="quote_title">night_stalker 写道</div>
<div class="quote_div">
<div class="quote_title">wosmvp 写道</div>
<div class="quote_div">可惜现在不能播放音频文件。。。</div>
<br>理论上是可以的 …… </div>
<br><br>不过实际上不可以……<img src="/images/smiles/icon_redface.gif" alt="">
</div>
<p><br><br>你咋知道不可以?说的很真的似的!播放音频这么一个简单的需求随便找个GUI库也能搞定啊,说话前稍微调查一下会死吗?<br><br><a href="http://ruby-gnome2.sourceforge.jp/hiki.cgi?Simple+Audio+Player">http://ruby-gnome2.sourceforge.jp/hiki.cgi?Simple+Audio+Player</a></p>
<p> </p>
要用文本编辑器写HTML,是niubility,还是zhuangbility,还是shability?
我觉得是程序员懒的研究和使用dreamweaver这么优秀工具,可悲的是这股歪风影响到了美工界,曾经看到美工在那边手敲代码,Ctrl+c,Ctrl+v的,输入错误,标签不关门是经常事儿,结果页面乱了也找不着北,让我去帮忙,我使dreamweaver,她还很讶异:“不是技术牛的都记事本吗?”,结果我被鄙视了。
另外你这两点好处基本上不成立,或者说现在的开发工具已经完全实现了,你装个VS20008就知道了。
不要拿把自己的看法就当成了了真理,手写代码就是歪风?你举的例子只能说你们的美工能力不够,而我所见到的美工有很大部分时间都是在Dreamweaver里手写的。工具是为最终目的服务的,怎么好用怎么用,不存在完全的非此即彼。你用Dreamweaver顺手,那就继续,我用vim照样很容易找到没有配对的标签,也许写HTML比你拖拖拉拉更快,但是我不可能说你用Dreamweaver就是zhuangbility,反之亦然。这种带有攻击性的语言说出来没任何意义。
1. 动态界面,例如你可以从数据库中生成界面,根据不同数据类型提供不同的界面等。
2. 用普通的代码版本管理工具就可以跟踪变化记录,并且具有良好的可读性。
另外,和HTML类似,为什么要用文本编辑器写HTML?(可视化工具多了是...)
lz都说了,1、是根据代码动态生成界面。很多客户定制化很高的项目,经常是自己实现一个UI编辑工具,可没见过让用户安装VS2008的。2、代码具有良好的可读性,这是目前大多数工具做不到的,始终会有一些无用的代码。VS2008+XAML能做到,不代表其他语言或者工具就能做到。你一再的强调这个,有偷换概念的嫌疑,最后我们的话题就变成了XAML是否强大,以及VS2008生成XAML是否强大,这就无解了。
PS:je论坛里搞MS那套的确实太少了,其实MS很多东西还是很强大的,只是不喜欢它那套哲学,sl2刚出来的时候,根本找不到怎么用命令行编译的文档,一来就是VS200X,我都疯了,写个hello world用牛刀……
转变中....
觉得swing用的就够舒服的了。
而 shoes 的确是写起来比拖放的快。
佩服 ls 的,这么难用的东西还能用出自豪感。
给推荐一个好用的啊。除了netbeans。
另外ruby能拖的gui工具有哪些?
shoes调试不好调,我感觉。
作GUI怎能不知道glade和qt designer?
而 shoes 的确是写起来比拖放的快。
佩服 ls 的,这么难用的东西还能用出自豪感。
给推荐一个好用的啊。除了netbeans。
另外ruby能拖的gui工具有哪些?
shoes调试不好调,我感觉。
shoes<tab>
再按 F5,5 秒不到(包含了编辑器启动时间、编译运行时间)
图形设计师应该和产品设计师进行沟通,让程序员浪费时间找出应该把按钮放在什么位置是愚蠢的。
这个所谓稍微“重型”界面。。。。是VS在15秒钟帮助生成的,楼主愿意用shoes敲敲看。
而 shoes 的确是写起来比拖放的快。
佩服 ls 的,这么难用的东西还能用出自豪感。
能拖的工具生成的代码,我们看不惯而已。
若做的很好,代码很好。(代码不一定是代码,有可能是配置+代码)
我相信,还是拖的生产率高。
好比用windowbuilder和netbeans 做java 界面,我不喜欢用netbeans,因为生成的代码太难看了。
而windowbuilder还是非常快捷。效率高,代码也好。
ruby,缺一个。哪怕有人搞个eclipse 插件。类似windowbuilder的。
目前做小型软件我会用java,不用ruby,这也是原因。
估计说这话的这位是没怎么写过好看的界面.
复杂的界面几乎每个控件都需要定制甚至是直接开发,包括按钮什么的都不可能直接用操作系统或者框架自己提供的控件,这意味着代码是王道。
如果要说顶级的可视化开发框架,XCode毫无疑问是绝尘而去,Delphi/VS没办法比的。(我Delphi用了10年多,VS用了3年多)。
WPF我们现在在用,由于和视频相关,性能非常之糟糕,定制异常困难。还不如Delphi多多。
图形设计师应该和产品设计师进行沟通,让程序员浪费时间找出应该把按钮放在什么位置是愚蠢的。
好吧,除去开发工具和办公软件,列出10个你最常用的桌面软件,看看都有哪些程序是“重型界面”,哪些程序的UI是需要“大型团队”的。
menu_bar do menu 'File', :item => ['Open', 'Close', '_', 'Quit'] menu 'View', :item => ['Copy', 'Edit'] menu :item => ['About'], :layout => :last end
这样的菜单是简单又简单的,一个真正意义上的菜单,有快捷键,有图片,有子菜单,有enable/disable的属性,你在代码里敲敲看吧,看不出有什么必要开历史的倒车。
“快捷键,有图片,有子菜单,有enable/disable的属性”一样可以,而且可以不麻烦。
通过XML生成.NET form的界面,早在XAML之前,就有人发明了,首先这种生成需求到底有多少,其次扯上生成界面和DSL完全没必要,这主要原因是ruby是动态语言而已,.NET如果真要生成,也可以通过CodeDOM一行行, 也可以通过一个Form的模板生成后编译,甚至可以采用别人的经验,从XML把整个过程自动化。
不知所云。
发表评论
-
vi tips
2010-07-20 11:37 0These tips are just memo for my ... -
Setup PPTP VPN on ubuntu 9.10
2009-12-20 19:27 1867Something should be done to set ... -
交叉编译完全解决方案
2009-09-18 09:55 3693[注:本文仅适用于嵌 ... -
OpenCV+Ruby构建图像处理研究平台
2009-09-12 15:31 3045OpenCV OpenCV是一个很流行 ... -
Maemo下跑RubyGnome2
2009-09-09 20:07 2290稍微捣鼓了一下,RubyGnome2顺利在Maemo模拟器上运 ... -
GtkSimpleLayout Inspector
2009-09-06 20:01 1654Inspector介绍 Inspector是GtkSimple ... -
FAT over NAND Flash
2009-04-27 21:03 10704引子 最近有一个项目需要在NAND FLASH裸片上建立文件 ... -
UFFS嵌入式NAND FLASH文件系统 FAQ(1)
2009-04-15 19:03 0自从UFFS项目放到SF上, 陆陆续续收到不少邮件询问有关的问 ... -
Tips: 为源代码树打一个干净的包
2009-04-02 13:19 1918为源代码树打一个干净的包 ------------- ... -
Linux tips: allow more than 4 serial ports
2009-02-12 12:58 3824搞嵌入式的经常要和串口通讯打交道,在开发的时候有可能同时使用十 ... -
交叉编译Ruby傻瓜指南
2009-02-05 11:35 2792最近看到有人在交叉编译ruby的时候似乎碰到了许多问题(htt ... -
优化Debian/Ubuntu下的ruby
2008-12-30 19:27 2095我们都知道Debian/Ubuntu通过apt-get安装的r ... -
Debian/Ubuntu Tips: find the right package
2008-12-12 17:35 1110Debian/ubuntu下经常碰到需要安装某个程序,却一时想 ... -
Ruby/GTK应用笔记(3):垃圾回收
2008-09-14 08:39 2612虽然垃圾回收应该属于RubyVM自动处理的事,但是一旦涉及到C ... -
Ruby/GTK应用笔记(2): Gdk::Pixbuf
2008-09-01 17:08 3747Gdk::Pixbuf是GTK库极为重 ... -
Ruby/GTK应用笔记(1): Gtk::Toolbar
2008-08-21 13:04 1974由于Gtk的Toolbar内部接口发生了一些变化,在使用Gtk ... -
Ruby/Rails: 不一样的'Web'应用(续)
2008-07-28 21:23 1312上一篇文章(http://www.itey ... -
Ruby/Rails: 不一样的'Web'应用
2008-07-26 15:45 1468我不是Web程序员,也从 ... -
一个有趣的问题: 如何获取引用名?
2008-07-24 17:26 1364我们知道, 对于 a = 100 这样的一条语句, a是一 ... -
Ruby'陷阱'之: '||=' 的真正展开式
2008-06-27 20:14 8995前一段时间,我在这里htt ...
相关推荐
【标题】"win32 sdk版 贪吃蛇 300行代码"是一个基于Windows API(Win32 SDK)开发的经典游戏“贪吃蛇”的小型实现,它使用了不到300行的源代码。这样的项目通常用于教学目的,帮助初学者理解如何在Windows环境下使用...
本文将通过分析标题"用300行代码手写Spring V1.0版本"和描述,探讨Spring的基本设计理念和实现机制。 首先,Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。在300行代码的简化版本中,我们将看到如何...
PyBlockchainCLI:300 行 Python 代码实现的区块链命令行工具
标题 "300行代码实现的智能五子棋人机对战" 提示我们这是一个关于编程的项目,其中开发者用相对较短的代码量创建了一个功能完整的五子棋游戏,允许玩家与计算机进行对战。这样的项目通常涉及到算法设计、游戏逻辑...
【标题】:“java 版连连看(300行代码)”是基于Java编程语言实现的一款经典游戏连连看的简化版本。这款程序展示了如何利用Java来设计一个简单的游戏逻辑,特别适合初学者学习和理解面向对象编程思想。 【描述】:在...
在这个压缩包中,你将找到300个不同的Java代码实例,每个实例都针对特定的编程问题或技术。 首先,我们来探讨一些基本的Java编程概念。Java是一种面向对象的编程语言,它的核心概念包括类、对象、封装、继承和多态...
特斯拉AI总监Andrej Karpathy用300行PyTorch代码实现的小型GPT语言模型库,适用于自然语言生成和文本分类任务。
纯oc的小游戏,代码限制在300行内,纯属个人坑爹。 无图片,无音效,仅实现主要功能。 ----------------------------------------- 推箱子: 支持自定义地图大小,自定义关卡数等
【标题】"java贪食蛇源代码(300多行)"揭示了这是一个基于Java编程语言实现的贪食蛇游戏项目。贪食蛇游戏是一种经典的像素级游戏,玩家通过控制一条不断移动的蛇来捕食食物,每吃掉一个食物,蛇的身体就会增长一段,...
"python大作业-300行代码函数.zip" 提供的资源显然是一份包含300行代码的Python函数集合,可能是为了帮助学习者深入理解函数的编写、模块化编程以及问题解决策略。这个压缩包"ljg_resource"可能包含了相关的代码文件...
《300个C语言程序范例》是一个包含丰富C语言编程实践的资源集合,它不仅提供了基础的语法示例,还涵盖了网络通信系统、学生信息管理系统和小游戏等多个实际应用场景的程序设计。这个压缩包旨在帮助学习者深入理解和...
python贪吃蛇游戏,仅不到300行代码
标题 "300行人脸识别代码运行" 暗示我们正在处理一个涉及人脸识别的项目,其中可能包含针对大量行人(300个)的识别算法。描述中的内容简洁,但我们可以推测这是一个关于如何运行该代码的教程或者实现。标签 "python...
在本资源中,"C语言期末大作业参考代码"提供了两个关键的学习材料,分别是17届抽学号和18届抽学号的C语言源程序。这些代码旨在帮助学生理解如何利用C语言来实现类似的功能,同时也为他们的期末大作业提供了一些灵感...
但是想到旋转,停靠,消除等操作,感觉好像很难啊,等真正写完了发现,一共也就 300 行代码,并没有什么难的。 先来看一个游戏截图,有点丑,好吧,我没啥美术细胞,但是主体功能都实现了,可以玩起来。 现在来看...
在实际应用中,代码行数统计工具通常会区分空行、注释行和实际包含逻辑的代码行。例如,SourceCounter这个工具可能具备以下功能: 1. **多语言支持**:SourceCounter可能支持多种编程语言,如C、C++、Java、Python...
本文将深入探讨使用Turboc编译器实现的不到300行的俄罗斯方块源码,通过对代码的详细解读,揭示其中蕴含的编程技巧和知识。 Turboc是Borland公司推出的C编译器,以其小巧高效的特点在早期Windows环境下广受欢迎。在...
此外,300行代码可能还会涉及列表、字典、元组等复合数据结构,异常处理(try-except),文件操作,面向对象编程(类和对象)等进阶主题。通过实际运行和理解这段代码,初学者可以更好地理解Python的运作机制,并...
300行代码包括详细的注释。促甲状腺激素一个基于C语言开发的极其简易的shell命令行程序的实现。300行代码包括详细的注释。参照Stephen Brennan大佬的博客,本人按照自己的理解添加了较为详尽的注释博客链接...