From: Morton Goldberg Date: 2006-09-27T20:53:19+09:00 Subject: Re: Feedback messages to user using Tk... On Sep 27, 2006, at 4:26 AM, Cameron, Gemma (UK) wrote: > > Hi all! > > If anyone is very familiar with Tk I would be very grateful for a > few pointers. > > Basically I'm looking to feedback my program's output to the user > in a GUI (Tk Label) rather than printing to the console (which it > currently does). This information would simply be a string to let > the user know what's going on and maybe even what percentage of the > work has been done. I don't want a command/bound event to drive > this - I simply want to send a message to a method which will > update the Tk Label dynamically. > > I envision the calling the class like this: > > @output = GraphicalOutput.new > @output.message("Now moving files....") > > to replace the current: > p "Now moving files..." > > Is this possible with Tk? I've been looking for days now and > haven't found much. I know how to use the TkLabel.configure > ('text'=>..) etc. to update the text, however just calling this > when the mainloop is running does not seem to dynamically update > the label. I've even got the stopwatch example going from the > O'Reilly cookbook. > > Am I using the wrong approach and/or mentality for this problem?! Ruby/Tk makes it easy to do what you want. You don't need to bother with low-level methods like 'configure' -- Ruby/Tk provides more runbyish ways -- in this case access methods for a label's text. I hope the following small example will help you. #! /usr/bin/ruby -w require 'tk' DEBUG = [] MESSAGES = [ "This is the first message", "This is another message", "This is the third message", "Are you getting bored?" ] class TestWindow # Each time the button is clicked on, the label shows a new message. def btn_action @indx = (@indx + 1) % MESSAGES.length @lbl.text = MESSAGES[@indx] end def initialize begin @indx = 0 # Set up the widgets. root = TkRoot.new { title 'Ruby Tk' } @lbl = TkLabel.new { text MESSAGES.first } @btn = TkButton.new { text "Next Message" } @btn.command = lambda { btn_action } @lbl.pack(:pady => 20) @btn.pack(:pady => 20) # Set initial window geometry; i.e., size and placement. win_w, win_h = 300, 135 # root.minsize(win_w, win_h) win_x = (root.winfo_screenwidth - win_w) / 2 root.geometry("#{win_w}x#{win_h}+#{win_x}+50") # Set resize permissions. root.resizable(false, false) # Make Cmnd+Q work as expected (running on OS X). root.bind('Command-q') {Tk.root.destroy} Tk.mainloop ensure puts DEBUG unless DEBUG.empty? end end end TestWindow.new Regards, Morton