Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > проблемы с графич. библиотекой TK


Автор: kpp2 20.12.2007, 04:17
Как сделать так, чтобы отображение при нажатии на кнопку button происходило сразу, а не по окончании всех вычислений.
Как можно видеть из кода при нажатии на кнопку происходит следующее:
начинается цикл из 5 итераций, в каждой итерации задержка на 1 секунду. В теле цикла так же имеется строка label2.text("#{var.value().to_i-i}")  но её отображение не происходит каждую секунду, оно происходит тольок по-окончании последней итерации цикла. Знает ли кто-нибудь в чём прикол ТК? Что это за урезанность в функциональности... 

Код



require 'tk'
#Signal.trap("EXIT"){ print "\a\a\a aaa" }

def shutdown()
    #system("shutdown -s -t 30")
end    


root = TkRoot.new('background' => 'green') {
    title "limiter 2007" 
    cursor 'X_cursor'
    resizable(0, 0)
    #"Destroy",proc {shutdown()}
}
root.geometry '200x110'
menuline1 = TkFrame.new(root, 'relief'=>'raised', 'borderwidth'=>1).pack('side'=>'top', 'fill'=>'x')
menuline2 = TkFrame.new(root, 'relief'=>'raised', 'borderwidth'=>0,'background' => 'black').pack( 'side'=>'left','fill'=>'y')

##events
#root.bind("Destroy"){shutdown()}
#root.bind("Destroy",proc {shutdown()})



#label 1
label1 = TkLabel.new(menuline1) { 
    text "L  I  M  I  T  E  R"  
    padx 1 ; pady 0;
}.pack("side"=>"top")
label1.font(TkFont.new(:size => 15)) 

#enter
entry = TkEntry.new(menuline2){
    width 6
}.pack()
var = TkVariable.new("0")
entry.textvariable(var)
entry.font(TkFont.new(:size => 15)) 
entry.focus

#label 2
label2 = TkLabel.new(root,'background' => 'green') { text "0" }
label2.font(TkFont.new(:size => 40)) 

#button
button = TkButton.new(menuline2) {
  text "start"
  width 5
  height 1
  command proc {
   label2.text "#{var.value()}" 
   for i in 0..5
    sleep 1
    label2.text("#{var.value().to_i-i}")
    $stdout.flush
    label2.pack()
   end
  }
}.pack("side"=>"right")
button.font(TkFont.new(:size => 15)) 


label2.pack()



Tk.mainloop()
=begin
limit = 75 

    while limit > 0
    print "\r Time: #{limit} minute"
    $stdout.flush
    sleep 60
    limit-=1
    end
    print "\a\a\a\a\a"
    shutdown()
=end

Автор: allexdav 1.1.2008, 19:10
все нормально, работает как должно.
обновление графики в Тк происходит, когда закончен обработчик команды. Чтобы принудительно вызвать обновление - есть команда update ( в классической связке Tcl/Tk )
соответсвенно тебе нужно позвать ее после пака.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)