ruby tk秒表的应用

ruby这种语言,看起来好像挺简单的,但实际上掌握起来难度应该要比JAVA这种语言更大的,主要是因为它非常灵活,涉及的内容也非常的多,当然本人也没专职干过这个,只是偶尔有空陆续写点东西。

最近在看《松本行弘的编程世界》时,发现这本书确实写得很好,既有高度也有深度,而且还很有广度。里面的代码也比较有参考价值,比如书中举了一个秒表的例子:

require 'observer'
require 'tk' 

class WatchModel
	include Observable
	def initialize
		@running = false
		@time = 0
		@last = 0.0
		Thread.start  do
			loop do
				sleep 0.01
				if @running
					now = Time.now.to_f
					@time += now-@last
					@last = now
					changed
					notify_observers(@time)
				end
			end
		end
	end
	def start_stop
		@last = Time.now.to_f
		@running = !@running
	end
end

class WatchWindow
	def initialize
		model = WatchModel.new
		model.add_observer(self)

		@label = TkLabel.new do
			pack('fill'=>'x')
		end

		self.update(0)
		TkButton.new do
			text 'start/stop'
			background '#ccc'
			command{model.start_stop}
			pack('fill'=>'x')
		end
		TkButton.new do
			text 'quit'
			command{exit}
			pack('fill'=>'x')
		end
		Tk.mainloop
	end

	def update(time)
		@label.text format("%02d:%02d",time.to_i,(time-time.to_i)*100)
	end
end

WatchWindow.new

实际的效果图大概如下:

 

这代码采用MVC的模式开发,使用了Tk这个图形工具包,利用了ruby内部支持的oberver模式实现通信。还需要说一点的是,时间不断变化这个功能是通过loop循环实现的,这个是一个死循环,如果不放在Thread里面,那么以后的代码就不会被执行,所以要单独开启一个线程去完成。

另外,ruby tk这个东西学起来相当不容易,资料太少, 有个网站:

www.tutorialspoint.com/ruby/ruby_tk_guide.htm

这个网站有些初步的介绍,不过举的例子都非常简单,只适合入门级。

还一本书,叫《Mastering Perl Tk》,这本书虽然采用的是perl语法,但是却讲得比较详细,而目前市面上还没有关于ruby tk的书,所以学习ruby tk基本上都是以这本书为主。比如,我要设置主窗口的位置,即设置TkRoot的位置,该怎么做?

关于这个问题,我翻遍了网上所有的资料,甚至还看了下tk的部分源代码(里面代码很少有注释,所以也不太清楚方法与参数的意思是什么),最后都没找到解决办法,最后只能再看看这本书面有答案没得,很庆幸,找到了!

用法大体如下:

TkRoot.new do
    title '秒表'
    minsize(200,200)
    geometry('200x200+400+200')
end

关键点就是那个geometry方法,200x200代表宽和高,中间用‘x'隔开,而后面的400、200代表主窗口的x、y初始坐标,用的是“+”号,这种用法虽然有点怪异,但也算简洁明了。

你可能感兴趣的:(ruby tk秒表的应用)