清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'observer' require 'thread' require 'tk' =begin ruby/tk简单的时钟 =end class Clock #观察者模式 include Observable def getPointAngle(time) #获取以y轴为线顺时针的角度,例如:3点钟则时针的角度为90度 sec_angle = time.sec / 60.0 * 360 min_angle = time.min / 60.0 * 360 + sec_angle / 360 / 60 hour_angle = time.hour.divmod(12)[1] / 12.0 * 360 + min_angle / 360 * 30 #转换成以xy轴的角度,例如3点钟,则时针的角度为0度,12点时针的角度为180度 return [hour_angle, min_angle, sec_angle].collect do |x| x <= 90 ? 90 -x : 450 - x end end def run() #一秒种刷新一次界面 loop do angles = self.getPointAngle(Time.now) changed() notify_observers(angles) sleep 1 end end end class ClockView LENGTH_ARRAY = [40, 50, 70] def initialize(root) @cur_sec_line = nil @cur_hour_line = nil @cur_min_line = nil @canvas = TkCanvas.new(root) timg = TkPhotoImage.new('file' => 'w.gif') t = TkcImage.new(@canvas,100, 100, 'image' => timg) @canvas.pack('side' => 'left', 'fill' => 'both') end def update(angles) coords = Array.new #将角度转换成在界面上的坐标 angles.to_a().each_with_index do |mangle, index| cy = Math.sin(mangle / 180 * Math::PI) * LENGTH_ARRAY[index] cx = Math.cos(mangle / 180 * Math::PI) * LENGTH_ARRAY[index] cx = cx + 100 cy = 100 - cy coords[index] = [cx, cy] end @cur_sec_line != nil and @cur_sec_line.delete() @cur_min_line != nil and @cur_min_line.delete() @cur_hour_line != nil and @cur_hour_line.delete() hline = TkcLine.new(@canvas, 100, 100, coords[0][0], coords[0][1], "width" => "3") mline = TkcLine.new(@canvas, 100, 100, coords[1][0], coords[1][1], "width" => "2") sline = TkcLine.new(@canvas, 100, 100, coords[2][0], coords[2][1], "width" => "1") [hline, mline, sline].map { |aline| aline.fill 'yellow' } @cur_sec_line = sline @cur_hour_line = hline @cur_min_line = mline end end root = TkRoot.new do title '怀旧时钟' geometry "200x200+1000+80" end clock = Clock.new() clock_view = ClockView.new(root) clock.add_observer(clock_view) Thread.new { clock.run } Tk.mainloop