From: jfn@... (Jeremy Nelson) Date: 2001-01-27T08:10:04+09:00 Subject: [ruby-talk:9963] Ruby/Tk -- Creating a class with Labels and Buttons that talk to each other [what I've done so far to try to solve the problem] I am a beginner to Ruby, and I am a beginner to Tk. I own the Ruby book and I own perl/tk. I have read each post available as of now in comp.lang.ruby that refers to graphical programming. I have read the Tk chapter in the Ruby book and the chapters on labels and buttons in the perl/tk book. [introduction] With that being said, I have a problem that I am absolutely stumped about. I am attempting to create a dialog that contains two "button-boxes", side by side, and a third button which will "select" the values in the button boxes. A "button box" is composed of a TkLabel on bottom, and 25 buttons, arranged in a 5x5 pattern above it. Each button's face has a number on it, from 1 to 25, with the button in position (0, 0) having number 1, and with the button in position (4, 4) having number 25. The text in the TkLabel should be the string on the face of the last button that was pressed. For example, if the user presses the "5" button then the TkLabel will display the value "5". The purpose of this is to permit the end user to quickly input two numeric values, with the TkLabel being feedback to show the user what button they last pushed. When the user pushes that third button, the value of each of the two button boxes will be queried and something will be done with them. [summary] Thus what I am looking for is a graphical widget that contains 25 buttons, a text field, the entirity of which is intended to pass a single, integer value onto the application. The value of this widget changes each time the user presses one of the 25 buttons. Although my specific need is for 25 buttons, I'd love to create a general purpose class that will work on any number of rows and columns. [problem] I tried to create a "button box" class and instantiate two seperate objects of this class. However, I need some way to have the buttons talk to the label, so that the label will be updated when one of the buttons is pushed. The only way I have been able to get the buttons to talk to the labels is to use global variables, and that won't do because I need to be able to create more than one of these grids. I have tried to create a TkVariable inside the "initialize" function, but I can't get it to be visible inside the "command proc" for the TkButton. [current implementation] $globalvar = TkVariable.new class Buttonbox def initialize (parent, rows, columns) @frame = TkFrame.new(parent).pack @label = TkLabel.new(parent) { textvariable $globalvar } rows.times { |i| columns.times { |j| currval = (i * rows + j).to_s TkButton.new(@frame) { command proc {$globalvar.value = self.text} text currval grid ( 'row' => i, 'column' => j) } } } @label.pack end end mw = TkRoot.new Buttonbox.new(mw, 5, 5) Buttonbox.new(mw, 6, 6) Tk.mainloop [end] Can someone tell me if what I want to do is even possible? Conceptually what I'm trying to do seems straightforward, but I'm at a total loss to figure out how I'm supposed to do this without global variables, which entirely defeats the benefits of making this an object. Thanks so much! Jeremy