Simple windowed application

From Rosetta Code
(Redirected from Simple Windowed Application)
Jump to: navigation, search
Simple windowed application
You are encouraged to solve this task according to the task description, using any language you may know.

This task asks to create a window with a label that says "There have been no clicks yet" and a button that says "click me". Upon clicking the button with the mouse, the label should change and show the number of times the button has been clicked.


[edit] Ada

Library: GTK version GtkAda
Library: GtkAda

The following solution is based on bindings to GTK+. Ada as a language does not provide standard GUI. Apart from GtkAda, there exist numerous other GUI bindings and libraries: CLAW, AdaGLUT, GWindow, JEWL, win32ada, QtAda etc.

with Gdk.Event;   use Gdk.Event;
with Gtk.Button; use Gtk.Button;
with Gtk.Label; use Gtk.Label;
with Gtk.Window; use Gtk.Window;
with Gtk.Widget; use Gtk.Widget;
with Gtk.Table; use Gtk.Table;
with Gtk.Handlers;
with Gtk.Main;
procedure Simple_Windowed_Application is
Window : Gtk_Window;
Grid  : Gtk_Table;
Button : Gtk_Button;
Label  : Gtk_Label;
Count  : Natural := 0;
package Handlers is new Gtk.Handlers.Callback (Gtk_Widget_Record);
package Return_Handlers is
new Gtk.Handlers.Return_Callback (Gtk_Widget_Record, Boolean);
function Delete_Event (Widget : access Gtk_Widget_Record'Class)
return Boolean is
return False;
end Delete_Event;
procedure Destroy (Widget : access Gtk_Widget_Record'Class) is
end Destroy;
procedure Clicked (Widget : access Gtk_Widget_Record'Class) is
Count := Count + 1;
Set_Text (Label, "The button clicks:" & Natural'Image (Count));
end Clicked;
Gtk.Window.Gtk_New (Window);
Gtk_New (Grid, 1, 2, False);
Add (Window, Grid);
Gtk_New (Label, "There have been no clicks yet");
Attach (Grid, Label, 0, 1, 0, 1);
Gtk_New (Button, "Click me");
Attach (Grid, Button, 0, 1, 1, 2);
( Window,
Return_Handlers.To_Marshaller (Delete_Event'Access)
( Window,
Handlers.To_Marshaller (Destroy'Access)
( Button,
Handlers.To_Marshaller (Clicked'Access)
Show_All (Grid);
Show (Window);
end Simple_Windowed_Application;

[edit] AutoHotkey

; Create simple windowed application
Gui, Add, Text, vTextCtl, There have been no clicks yet ; add a Text-Control
Gui, Add, Button, gButtonClick xm, click me ; add a Button-Control
Gui, Show, , Simple windowed application ; show the Window
Return ; end of the auto-execute section
ButtonClick: ; the subroutine executed each time the Button-Control is clicked
count++ ; increment the click-counting var
GuiControl, , TextCtl, %count% ; update the Text-Control with the click-counting var
Return ; end of the subroutine
GuiClose: ; the subroutine executed when the Window is closed
ExitApp ; exit this process

[edit] B4J

#Region Project Attributes
#MainFormWidth: 593
#MainFormHeight: 179
#End Region
Sub Process_Globals
Private fx As JFX
Private MainForm As Form
Private btnClickMe As Button
Private lblClickCounter As Label
Private nClicks As Int = 0
Private aPlurals() As Object = Array As Object(Array As String("has","click"),Array As String("have","clicks"))
End Sub
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Layout1") 'Load the layout file.
End Sub
Sub btnClickMe_Action
nClicks = nClicks + 1
Dim aPlural() As Object = aPlurals(IIF(nClicks=1,0,1))
lblClickCounter.Text = "There " & aPlural(0) & " been " & (nClicks) & " " & aPlural(1) & " so far."
End Sub
Sub IIF(test As Boolean, trueVal As Object, falseVal As Object) As Object
If test Then
Return trueVal
Return falseVal
End If
End Sub

Layout1.fxml (as B4J uses JavaFX's Scene Builder)

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.collections.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.web.*?>
<AnchorPane id="paneMain" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="179.0" prefWidth="593.0" xmlns="" xmlns:fx="">
<Button id="btnClickMe" layoutX="254.0" layoutY="90.0" mnemonicParsing="false" text="Click Me">
<Font size="20.0" />
<Label id="lblClickCounter" layoutX="162.0" layoutY="31.0" text="There have been no clicks as yet.">
<Font size="20.0" />

[edit] BBC BASIC

      INSTALL @lib$+"WINLIB2"
window% = FN_newdialog("Rosetta Code", 100, 100, 120, 52, 8, 1000)
PROC_static(window%, "There have been no clicks yet", 100, 10, 10, 100, 14, 0)
PROC_pushbutton(window%, "Click me", FN_setproc(PROCclick), 40, 30, 40, 16, 0)
UNTIL !window% = 0
PRIVATE clicks%
clicks% += 1
SYS "SetDlgItemText", !window%, 100, "Number of clicks = " + STR$(clicks%)

[edit] C

Library: GTK
#include <stdio.h>
#include <gtk/gtk.h>
const gchar *clickme = "Click Me";
guint counter = 0;
#define MAXLEN 64
void clickedme(GtkButton *o, gpointer d)
GtkLabel *l = GTK_LABEL(d);
char nt[MAXLEN];
snprintf(nt, MAXLEN, "You clicked me %d times", counter);
gtk_label_set_text(l, nt);
int main(int argc, char **argv)
GtkWindow *win;
GtkButton *button;
GtkLabel *label;
GtkVBox *vbox;
gtk_init(&argc, &argv);
win = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(win, clickme);
button = (GtkButton*)gtk_button_new_with_label(clickme);
label = (GtkLabel*)gtk_label_new("There have been no clicks yet");
gtk_label_set_single_line_mode(label, TRUE);
vbox = (GtkVBox*)gtk_vbox_new(TRUE, 1);
gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(label));
gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(button));
gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox));
g_signal_connect(G_OBJECT(win), "delete-event", (GCallback)gtk_main_quit, NULL);
g_signal_connect(G_OBJECT(button), "clicked", (GCallback)clickedme, label);
return 0;

[edit] C++

Library: Qt
4.4 with source files as shown , built from a Makefile generated by the Qt tool qmake

[edit] clickcounter.h

#include <QWidget>
class QLabel ;
class QPushButton ;
class QVBoxLayout ;
class Counter : public QWidget {
public :
Counter( QWidget * parent = 0 ) ;
private :
int number ;
QLabel *countLabel ;
QPushButton *clicker ;
QVBoxLayout *myLayout ;
private slots :
void countClicks( ) ;
} ;

[edit] clickcounter.cpp

#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include "clickcounter.h"
Counter::Counter( QWidget * parent ) : QWidget( parent ) {
number = 0 ;
countLabel = new QLabel( "There have been no clicks yet!" ) ;
clicker = new QPushButton( "click me" ) ;
connect ( clicker , SIGNAL( clicked( ) ) , this , SLOT( countClicks( ) ) ) ;
myLayout = new QVBoxLayout ;
myLayout->addWidget( countLabel ) ;
myLayout->addWidget( clicker ) ;
setLayout( myLayout ) ;
void Counter::countClicks( ) {
number++ ;
countLabel->setText( QString( "The button has been clicked %1 times!").arg( number ) ) ;

[edit] main.cpp

#include <QApplication>
#include "clickcounter.h"
int main( int argc , char *argv[ ] ) {
QApplication app( argc , argv ) ;
Counter counter ; ) ;
return app.exec( ) ;

[edit] C#

using System.Windows.Forms;
class RosettaForm : Form
var clickCount = 0;
var label = new Label();
label.Text = "There have been no clicks yet.";
label.Dock = DockStyle.Top;
var button = new Button();
button.Text = "Click Me";
button.Dock = DockStyle.Bottom;
button.Click += delegate
label.Text = "Number of clicks: " + clickCount + ".";
static void Main()
Application.Run(new RosettaForm());

[edit] Clojure

(ns counter-window
(:import (javax.swing JFrame JLabel JButton)))
(defmacro on-action [component event & body]
`(. ~component addActionListener
(proxy [java.awt.event.ActionListener] []
(actionPerformed [~event] ~@body))))
(defn counter-app []
(let [counter (atom 0)
label (JLabel. "There have been no clicks yet")
button (doto (JButton. "Click me!")
(on-action evnt
(.setText label
(str "Counter: " (swap! counter inc)))))
panel (doto (JPanel.)
(.setOpaque true)
(.add label)
(.add button))]
(doto (JFrame. "Counter App")
(.setContentPane panel)
(.setSize 300 100)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setVisible true))))

[edit] Common Lisp

Library: CLIM
Works with: McCLIM
(defpackage #:rcswa
(:use #:clim #:clim-lisp))
(in-package #:rcswa)

This version uses CLIM's command system:

(define-application-frame simple-windowed-application ()
((clicks :initform 0
:accessor clicks-of))
(:menu-bar t)
(make-pane 'application-pane
:width '(40 :character)
:height '(3 :character)
:display-time :command-loop
(lambda (pane stream)
(declare (ignore pane))
(format stream "~[There have been no clicks yet.~
~:;~:*There ~[have~;has~:;have~]~:* been ~R click~:P.~]"

(clicks-of *application-frame*))))))
(define-simple-windowed-application-command (com-click-me :menu t)
(incf (clicks-of *application-frame*)))

This version uses an explicit pushbutton gadget, and may be used if more direct control over the UI layout and behavior is needed:

(define-application-frame simple-windowed-application ()
((clicks :initform 0
:accessor clicks-of))
(the-label :application
:width '(40 :character)
:height '(3 :character)
:display-time t
(lambda (pane stream)
(declare (ignore pane))
(format stream "~[There have been no clicks yet.~
~:;~:*There ~[have~;has~:;have~]~:* been ~R click~:P.~]"

(clicks-of *application-frame*))))
(the-button :push-button
:label "Click Me"
(lambda (button)
(declare (ignore button))
(incf (clicks-of *application-frame*))
(redisplay-frame-pane *application-frame*
(find-pane-named *application-frame* 'the-label)
:force-p t))))
(:layouts (default
(vertically (:equalize-width nil :align-x :center)
(spacing (:thickness 10) the-button)))))

In either case, the window is opened with:

(run-frame-top-level (make-application-frame 'simple-windowed-application))

[edit] D

[edit] DFL

Works with: D version 1
Library: DFL
module winapp ;
import dfl.all ;
import std.string ;
class MainForm: Form {
Label label ;
Button button ;
this() {
width = 240 ;
with(label = new Label) {
text = "There have been no clicks yet" ;
dock = DockStyle.TOP ;
parent = this ;
with(button = new Button) {
dock = DockStyle.BOTTOM ;
text = "Click Me" ;
parent = this ;
click ~= &onClickButton ;
height = label.height + button.height + 36 ;
private void onClickButton(Object sender, EventArgs ea) {
static int count = 0 ;
label.text = "You had been clicked me " ~ std.string.toString(++count) ~ " times." ;
void main() { MainForm);

[edit] Hybrid

Works with: D version 1
Library: Hybrid

Hybrid uses config files to describe GUI layout. SimpleWindow.cfg:

import "themes/default.cfg"

new FramedTopLevelWindow main {
	frame.text = "Simple Window";

	new Label label {
		text = "There have been no clicks yet";

	new Button button {
		text = "Click me";
		size = 201 20;


module SimpleWindow;
import tango.text.convert.Integer;
import tango.core.Thread; // For Thread.yield
import xf.hybrid.Hybrid; //For widgets and general API
import xf.hybrid.backend.GL; // For OpenGL Renderer
void main() {
//load config file
scope cfg = loadHybridConfig(`./SimpleWindow.cfg`);
scope renderer = new Renderer;
auto counter = 0;
bool programRunning = true;
while (programRunning) {
// Tell Hybrid what config to use
// Exit program if user clicks the Close button
if (gui().getProperty!(bool)("main.frame.closeClicked")) {
programRunning = false;
// Update text on the label
if (counter != 0)
Label("main.label").text = toString(counter);
// Increment counter if the button has been clicked
if (Button("main.button").clicked) {
// Finalize. Prepare to render
// Render window using OpenGL Renderer

[edit] Delphi

Works with: Delphi version 5.0

Creating a "basic windowed application" in Delphi is quite simple. Start up the IDE and the default application is a single windowed app. This will have two files, the main project file "project1" and a unit file, "unit1". What I a going to do here is going to be somewhat different. I will do it all dynamically from the main "program file". Create this in any text editor and you can then either open it in the IDE to build it, or invoke the command line compiler. There is quite a bit going on behind the scenes with the VCL and the RTL.

Filename = SingleWinApp.dpr

NOTE: The project name here must match the name of the file.

-- begin file --
Program SingleWinApp ;
// This is the equivalent of the C #include
Uses Forms, Windows, Messages, Classes, Graphics, Controls, StdCtrls ;
// The only reason for this declaration is to allow the connection of the
// on click method to the forms button object. This class declaration adds
// a procedure.
TMainForm class(tform)
Procedure AddClicks(sender : tObject);
// Use these globals.
MainForm : tForm ;
aLabel : tLabel ;
aButton : tButton ;
i : integer = 0 ;
// This is the Method call that we connect to the button object
// to start counting the clicks.
Procedure tMainForm.AddClicks(sender :tObject)
aLabel.Caption := IntToStr(i) + ' Clicks since startup' ;
// Do all the behind the scenes stuff that sets up the Windows environment
Application.Initialize ;
// Create the form
// Forms can either be created with an owner, like I have done here, or with
// the owner set to Nil. In pascal (all versions of Borland) '''NIL''' is a
// reserved, (the equivalent of '''NULL''' in Ansi C) word and un-sets any pointer
// variable. Setting the owner to the application object will ensure that the form is
// freed by the application object when the application shuts down. If I had set
// the owner to NIL then i would have had to make sure I freed the form explicitly
// or it would have been orphaned, thus creating a memory leak.
// I must direct your attention to the CreateNew constructor. This is
// a non standard usage. Normally the constructor Create() will call this
// as part of the initialization routine for the form. Normally as you drop
// various components on a form in deign mode, a DFM file is created with
// all the various initial states of the controls. This bypasses the
// DFM file altogether although all components AND the form are created
// with default values. (see the Delphi help file).
MainForm := tMainForm.CreateNew(Application);
MainForm.Parent := Application ;
MainForm.Position := poScreenCenter ;
MainForm.Caption := 'Single Window Application' ;
// Create the Label, set its owner as MaiaForm
aLabel := tLabel.Create(mainForm);
aLabel.Parent := MainForm;
aLabel.Caption := IntToStr(i) + ' Clicks since startup' ;
aLabel.Left := 20 ;
aLabel.Top := MainForm.ClientRect.Bottom div 2 ;
// Create the button, set its owner to MainForm
aButton := tButton.Create(MainForm);
aButton.Parent := MainForm ;
aButton.Caption := 'Click Me!';
aButton.Left := (MainForm.ClientRect.Right div 2)-(aButton.Width div 2 );
aButton.Top := MainForm.ClientRect.Bottom - aButton.Height - 10 ;
aButton.OnClick := AddClicks ;
// Show the main form, Modaly. The ONLY reason to do this is because in this
// demonstration if you only call the SHOW method, the form will appear and
// disappear in a split second.
MainForm.ShowModal ;
Application.Run ;
end. // Program

[edit] E

Library: Swing
Works with: E-on-Java
when (currentVat.morphInto("awt")) -> {
var clicks := 0
def w := <swing:makeJFrame>("Rosetta Code 'Simple Windowed Application'")
${def l := <swing:makeJLabel>("There have been no clicks yet.")} $\
${def b := <swing:makeJButton>("Click Me")}
b.addActionListener(def _ {
to actionPerformed(_) {
clicks += 1
l.setText(`Number of clicks: $clicks`)

[edit] Elena

#import system.
#import forms.
#import extensions.
#class Window
#field form.
#field lblClicks.
#field btmClickMe.
#field clicksCount.
#constructor new
form := SDIDialog new.
lblClicks := Label new.
btmClickMe := Button new.
clicksCount := 0.
form controls append:lblClicks.
form controls append:btmClickMe.
form set &caption:"Rosseta Code".
form set &x:100 &y:100.
form set &width:160 &height:80.
lblClicks set &x:10 &y:2.
lblClicks set &width:160 &height:20.
lblClicks set &caption:"Clicks: 0".
btmClickMe set &x:7 &y:20.
btmClickMe set &width:140 &height:30.
btmClickMe set &caption:"Click me".
btmClickMe set &onClick:args
[ $self $onButtonClick. ].
#method $onButtonClick
clicksCount := clicksCount + 1.
lblClicks set &caption:("Clicks: " + clicksCount literal).
#method => form.

[edit] Euphoria

[edit] EuWinGUI

Library: EuWinGUI
include EuWinGUI.ew
Window("EuWinGUI - Simple windowed application",100,100,360,100)
constant Button1 = Control(Button,"Click me",250,20,80,25)
constant Label1 = Control(Label,"There have been no clicks yet",10,25,200,18)
integer clicks
clicks = 0
-- Event loop
while 1 do
if EventOwner = Button1 and Event = Click then
clicks += 1
SetText(Label1,sprintf("You clicked me %d times",clicks))
end if
end while

[edit] F#

Translation of: C#
open System.Windows.Forms
let mutable clickCount = 0
let form = new Form()
let label = new Label(Text = "There have been no clicks yet.", Dock = DockStyle.Top)
let button = new Button(Text = "Click me", Dock = DockStyle.Bottom)
button.Click.Add(fun _ ->
clickCount <- clickCount+1
label.Text <- sprintf "Number of clicks: %i." clickCount)

[edit] Fantom

using fwt
using gfx
class SimpleApplication
public static Void main ()
title = "Simple Window Application"
size = Size(350, 50)
clicked := 0
label := Label
text = "There have been no clicks yet"
text = "Click me"
onAction.add |Event e|
clicked += 1
label.text = "There have been $clicked clicks"

[edit] Forth

Works with: bigFORTH
Library: MINOS
also minos
text-label ptr click-label
Variable click# click# off
: click-win ( -- ) screen self window new window with
X" There have been no clicks yet" text-label new
dup F bind click-label
^ S[ 1 click# +!
click# @ 0 <# #S s" Number of clicks: " holds #>
click-label assign ]S X" Click me" button new
&2 vabox new panel s" Clicks" assign show endwith ;

[edit] The same with Theseus

Library: Theseus
#! xbigforth
\ automatic generated code
\ do not edit
also editor also minos also forth
component class ccount
early widget
early open
early dialog
early open-app
text-label ptr click#
( [varstart] ) cell var clicks ( [varend] )
 : open new DF[ 0 ]DF s" Click counter" open-component ;
 : dialog new DF[ 0 ]DF s" Click counter" open-dialog ;
 : open-app new DF[ 0 ]DF s" Click counter" open-application ;
ccount implements
( [methodstart] ) ( [methodend] )
 : widget ( [dumpstart] )
X" There have been no clicks yet" text-label new ^^bind click#
^^ S[ 1 clicks +!
clicks @ 0 <# #S s" Number of clicks: " holds #> click# assign ]S ( MINOS ) X" Click me" button new
&2 vabox new panel
( [dumpend] ) ;
 : init ^>^^ assign widget 1 :: init ;
: main
ccount open-app
$1 0 ?DO stop LOOP bye ;
script? [IF] main [THEN]
previous previous previous

[edit] Go

Library: go-gtk
package main
import (
func main() {
window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL)
window.SetTitle("Click me")
label := gtk.Label("There have been no clicks yet")
var clicks int
button := gtk.ButtonWithLabel("click me")
button.Clicked(func() {
if clicks == 1 {
label.SetLabel("Button clicked 1 time")
} else {
label.SetLabel(fmt.Sprintf("Button clicked %d times",
vbox := gtk.VBox(false, 1)
window.Connect("destroy", func() {

[edit] Groovy

import groovy.swing.SwingBuilder
count = 0
new SwingBuilder().edt {
frame(title:'Click frame', pack: true, show: true) {
vbox {
countLabel = label("There have been no clicks yet.")
button('Click Me', actionPerformed: {count++; countLabel.text = "Clicked ${count} time(s)."})

with binding:

import groovy.swing.SwingBuilder
import groovy.beans.Bindable
@Bindable class Model {
Integer count = 0
model = new Model()
new SwingBuilder().edt {
frame(title:'Click frame', pack: true, show: true) {
vbox {
label(text: bind(source: model, sourceProperty: 'count',
converter: { v -> !v ? "There have been no clicks yet." : "Clicked ${v} time(s)."}))
button('Click Me', actionPerformed: {model.count++})

[edit] Haskell

Library: Gtk
from HackageDB
import Graphics.UI.Gtk
import Data.IORef
main :: IO ()
main = do
window <- windowNew
window `onDestroy` mainQuit
windowSetTitle window "Simple Windowed App"
set window [ containerBorderWidth := 10 ]
hbox <- hBoxNew True 5
set window [ containerChild := hbox ]
lab <- labelNew (Just "There have been no clicks yet")
button <- buttonNewWithLabel "Click me"
set hbox [ containerChild := lab ]
set hbox [ containerChild := button ]
m <- newIORef 0
onClicked button $ do
v <- readIORef m
writeIORef m (v+1)
set lab [ labelText := "There have been " ++ show (v+1) ++ " clicks" ]
widgetShowAll window

[edit] HicEst

 CHARACTER label="There have been no clicks yet"
DO count = 1, 1E100 ! "forever"
DLG(Button="Click me", Width=3, TItle=label) ! Width=3 to display full length label
label = "Clicked " // count // "time(s)"

[edit] Icon and Unicon

This version is Unicon-specific:

import gui
$include "guih.icn"
procedure main()
class SimpleWindow : Dialog(label, button, count)
method component_setup()
label := Label()
label.set_pos("24", "24")
label.set_label("There have been no clicks yet.")
button := TextButton()
button.set_pos(24, 53)
button.set_label("click me")
button.connect(self, "incr", ACTION_EVENT)
method incr()
/count := 0
label.set_label("There have been "||(count+:=1)||" clicks.")

[edit] IDL

pro counter, ev
widget_control,, get_uvalue=tst
tst[1] = tst[1]+1
widget_control, tst[0], set_value="Number of clicks: "+string(tst[1],format='(i0)')
widget_control,, set_uvalue=tst
id = widget_base(title = 'Window Title',column=1)
ld = widget_label(id, value = 'There have been no clicks yet.')
widget_control, /realize, id, set_uvalue=[ld,0]
dummy = widget_button(id,value=' Click Me ',event_pro='counter')
xmanager, "Simple", Id

[edit] J

J 8.x

SIMPLEAPP=: noun define
pc simpleApp;
cc inc button;cn "Click me";
cc shownText static;cn "There have been no clicks yet.";
simpleApp_run=: verb define
simpleApp_accum=: 0 NB. initialize accumulator
wd 'pshow;'
simpleApp_inc_button=: verb define
wd 'set shownText text ','Button-use count: ',": simpleApp_accum=: >: simpleApp_accum
simpleApp_close=: wd bind 'pclose'
simpleApp_cancel=: simpleApp_close

J 6.x

SIMPLEAPP=: noun define
pc simpleApp;
xywh 131 11 44 12;cc inc button;cn "Click me";
xywh 7 10 115 11;cc shownText static;cn "There have been no clicks yet.";
pas 6 6;pcenter;
rem form end;
simpleApp_run=: verb define
simpleApp_accum=: 0 NB. initialize accumulator
wd 'pshow;'
simpleApp_inc_button=: verb define
wd 'set shownText *','Button-use count: ',": simpleApp_accum=: >: simpleApp_accum
simpleApp_close=: wd bind 'pclose'
simpleApp_cancel=: simpleApp_close

[edit] Java

Library: AWT
Library: Swing
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Clicks extends JFrame implements ActionListener{
private long clicks = 0;
private JLabel label;
private JButton clicker;
private String text;
public Clicks(){
text = "There have been no clicks yet";
label = new JLabel(text);
clicker = new JButton("click me");
clicker.addActionListener(this);//listen to the button
setLayout(new BorderLayout());//handles placement of components
add(label,BorderLayout.CENTER);//add the label to the biggest section
add(clicker,BorderLayout.SOUTH);//put the button underneath it
setSize(300,200);//stretch out the window
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//stop the program on "X"
setVisible(true);//show it
public static void main(String[] args){
new Clicks();//call the constructor where all the magic happens
public void actionPerformed(ActionEvent arg0) {
if(arg0.getSource() == clicker){//if they clicked the button
text = "There have been " + (++clicks) + " clicks";
label.setText(text);//change the text

[edit] JavaFX Script

Library: JavaFX 1.2
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
Stage {
scene: Scene {
width: 300 height: 200
content: VBox {
var clicks: Integer;
spacing: 10
content: [
Label {
def varText = bind if (clicks == 0) then "no clicks yet" else "{clicks} clicks"
text : bind "There have been {varText}"
Button {
text: "click me"
onMouseClicked: function(e) { clicks++; }

[edit] Liberty BASIC

button #demo.btn, "Click Me", [btnClick], UL, 20, 50
statictext #demo.num, "There have been no clicks yet.", 20, 100, 240, 30
open "Rosetta Task: Simple windowed application" for window as #demo
#demo "trapclose [quit]"
nClicks = 0
close #demo
nClicks = nClicks + 1
#demo.num "The button has been clicked ";nClicks;" times."


Works with: MSWlogo
to clickwindow
windowCreate "root "clickWin [Click that button!!!] 0 0 100 100 []
Make "i 0
staticCreate "clickWin "clickSt [There have been no clicks yet] 0 0 100 20
buttonCreate "clickWin "clickBtn [click me] 10 20 80 20 ~
[Make "i :i+1 ~
ifelse :i=1 [staticUpdate "clickSt (list "clicked :i "time)] ~
[staticUpdate "clickSt (list "clicked :i "times)]]

The window is opened with:


[edit] Lua

l = iup.label{title="There have been no clicks yet."}
b = iup.button{title="Click me!"}
clicks = 0
function b:button_cb()
clicks = clicks + 1
l.title = "There have been " .. clicks/2 .. " clicks so far." --yes, this is correct.
dlg = iup.dialog{iup.vbox{l, b}, title="Simple Windowed Application"}
if (not iup.MainLoopLevel or iup.MainLoopLevel()==0) then

[edit] Mathematica

DynamicModule[{n = 0}, 
TextCell@If[n == 0, "There have been no clicks yet", n],
Button["click me", n++]}]]

[edit] MAXScript

rollout buttonClick "Button Click"
label l "There have been no clicks yet"
button clickMe "Click me"
local clickCount = 0
on clickMe pressed do
clickCount += 1
l.text = ("Number of clicks: " + clickCount as string)
createDialog buttonClick

[edit] Modula-3

Library: Trestle

This code uses Trestle, a windowing toolkit developed for Modula-3.

IMPORT Fmt, TextVBT, ButtonVBT, VBT, Axis, HVSplit, TrestleComm, Trestle;
VAR label := TextVBT.New("There have been no clicks yet.");
button := ButtonVBT.New(TextVBT.New("Click me!"), Clicked);
main := HVSplit.Cons(Axis.T.Ver, label, button, adjustable := FALSE);
count := 0;
PROCEDURE Clicked(<*UNUSED*>button: ButtonVBT.T; <*UNUSED*>READONLY cd: VBT.MouseRec) =
TextVBT.Put(label, "Button pressed: " & Fmt.Int(count));
END Clicked;
<*FATAL TrestleComm.Failure*>
END Click.

To compile the above code, you need to create a file called m3makefile which contains:


[edit] Nim

import gtk2
win = windowNew WINDOW_TOPLEVEL
button = buttonNew "Click me"
label = labelNew "There have been no clicks yet"
vbox = vboxNew(true, 1)
counter = 0
proc clickedMe(o: var PButton, l: PLabel) =
inc counter
l.setText "You clicked me " & $counter & " times"
win.setTitle "Click me"
vbox.add label
vbox.add button
win.add vbox
discard win.signal_connect("delete-event", SignalFunc mainQuit, nil)
discard button.signal_connect("clicked", SignalFunc clickedMe, label)

[edit] Objective-C

Works with: GNUstep
#include <Foundation/Foundation.h>
#include <AppKit/AppKit.h>
@interface ClickMe : NSWindow
NSButton *_button;
NSTextField *_text;
int _counter;
- (void)applicationDidFinishLaunching: (NSNotification *)notification;
- (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSNotification *)notification;
- (void)advanceCounter: (id)sender;
@implementation ClickMe : NSWindow
-(instancetype) init
NSButton *button = [[NSButton alloc] init];
[button setButtonType: NSToggleButton];
[button setTitle: @"Click Me"];
[button sizeToFit];
[button setTarget: self];
[button setAction: @selector(advanceCounter:)];
NSRect buttonRect = [button frame];
NSTextField *text = [[NSTextField alloc]
initWithFrame: NSMakeRect(buttonRect.origin.x, buttonRect.size.height,
buttonRect.size.width, buttonRect.size.height)];
[text setAlignment: NSCenterTextAlignment];
[text setEditable: NO];
[text setStringValue: @"There have been no clicks yet"];
[text sizeToFit];
// reset size of button according to size of (larger...?) text
setFrameSize: NSMakeSize( [text frame].size.width, buttonRect.size.height ) ];
int totalWindowHeight = buttonRect.size.height + [text frame].size.height;
if ((self = [super initWithContentRect: NSMakeRect(100, 100,
[text frame].size.width, totalWindowHeight)
styleMask: (NSTitledWindowMask | NSClosableWindowMask)
backing: NSBackingStoreBuffered
defer: NO])) {
_counter = 0;
_button = button;
_text = text;
[[self contentView] addSubview: _text];
[[self contentView] addSubview: _button];
[self setTitle: @"Click Me!"];
[self center];
return self;
- (void)applicationDidFinishLaunching: (NSNotification *)notification
[self orderFront: self];
- (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSNotification *)notification
return YES;
- (void)advanceCounter: (id)sender
[_text setStringValue: [NSString stringWithFormat: @"Clicked %d times", ++_counter]];
int main()
@autoreleasepool {
NSApplication *app = [NSApplication sharedApplication];
ClickMe *clickme = [[ClickMe alloc] init];
[app setDelegate: clickme];
[app run];
return 0;

[edit] OCaml

  • with Labltk, the Tk OCaml binding:
#directory "+labltk"
#load "labltk.cma"
let () =
let top = Tk.openTk() in
Wm.title_set top "Tk-OCaml Example";
let label = Label.create ~text:"There have been no clicks yet" top in
let b =
~text:"click me"
~command:(fun () -> Tk.closeTk (); exit 0)
Tk.pack [Tk.coe label; Tk.coe b];
Tk.mainLoop ();
  • with LablGTK2, the GTK2 OCaml binding:
open GMain
let window = GWindow.window ~border_width:2 ()
let vbox = GPack.vbox ~packing:window#add ()
let label = GMisc.label ~text:"There have been no clicks yet" ~packing:vbox#pack ()
let button = GButton.button ~label:"click me" ~packing:vbox#pack ()
let () =
window#event#connect#delete ~callback:(fun _ -> true);
window#connect#destroy ~callback:Main.quit;
button#connect#clicked ~callback:window#destroy;
window#show ();
Main.main ()

[edit] ooRexx

/* REXX ***************************************************************************************
* 18.06.2014 Walter Pachl shortened from Rony Flatscher's bsf4oorexx (see sourceforge) samples
* Look there for ShowCount.rxj
* bsf4oorexx lets the ooRexx program use Java classes
**********************************************************************************************/ -- a directory which will be passed to Rexx with the event
-- create a framed Java window, set a title text
win=.bsf~new("java.awt.Frame", "Show Count")
-- Create a Java RexxProxy for controlling the closing of the application
rexxCloseEH =.RexxCloseAppEventHandler~new -- Rexx event handler
-- Create Java RexxProxy for the Rexx event handler
rpCloseEH=BsfCreateRexxProxy(rexxCloseEH,,"java.awt.event.WindowListener" )
win~addWindowListener(rpCloseEH) -- add RexxProxy event handler
-- create a Java push button
but=.bsf~new("java.awt.Button","Press me!")
-- Create a RexxProxy for the button Rexx event handler
but~addActionListener(rp) -- add RexxProxy event handler
lab=.bsf~new("java.awt.Label") -- create a Java label,set it to show the text centered
userData~label=lab -- save label object for later use in event handler
lab~setAlignment(lab~center) -- set alignment to center
lab~setText("Button was not yet pressed") -- assign initial text to the label
win ~~add("Center",lab) ~~add("South",but) -- add the label and the button to the frame
win ~~pack -- now calculate all widget dimensions
call enlargeWidth win,but,120 -- enlarge the width of the frame and the button
win ~~setVisible(.true) ~~toFront -- make frame visible and move it to the front
userData~i=0 -- set counter to 0
rexxCloseEH~waitForExit -- wait until we are allowed to end the program
-- if Java was loaded by Rexx,then terminate Java's RexxEngine to inhibit callbacks from Java
call BSF.terminateRexxEngine
::requires BSF.CLS -- get Java support
/* enlarge the width of the frame and of the button without using a layout manager */
::routine enlargeWidth
use arg win,but,addToWidth
winDim=win~getSize -- get frame's dimension
winDim~width+=addToWidth -- increase width
win~setSize(winDim) -- set frame's dimension
/* ------------------------------------------------------------------------ */
/* Rexx event handler to set "close app" indicator */
::class RexxCloseAppEventHandler
::method init -- constructor
expose closeApp
closeApp = .false -- if set to .true, then it is safe to close the app
::attribute closeApp -- indicates whether app should be closed
::method unknown -- intercept unhandled events,do nothing
::method windowClosing -- event method (from WindowListener)
expose closeApp
closeApp=.true -- indicate that the app should close
::method waitForExit -- method blocks until attribute is set to .true
expose closeApp
guard on when closeApp=.true
/* ------------------------------------------------------------------------ */
/* Rexx event handler to process tab changes */
::class RexxShowCountEventHandler
::method actionPerformed
use arg eventObject,slotDir
call showCount slotDir~userData
/* ------------------------------------------------------------------------ */
::routine ShowCount -- increment counter and show text
use arg userData
userData~i+=1 -- increment counter in directory object
Select -- construct text part
When userData~i=1 Then how_often='once'
When userData~i=2 Then how_often='twice'
When userData~i=3 Then how_often='three times'
Otherwise how_often=userData~i 'times'
userData~label~setText("Button was pressed" how_often) -- display text

[edit] Oz

QTk at 'x-oz://system/wp/QTk.ozf'
Count = {NewCell 0}
GUI = td(action:proc {$} {Application.exit 0} end %% exit on close
label(text:"There have been no clicks yet." handle:Label)
button(text:"Click Me"
action:proc {$}
Count := @Count + 1
{Label set(text:"Number of clicks: "#@Count#".")}
Window = { GUI}
{Window show}

[edit] Pascal

Works with: Free_Pascal
Library: SysUtils
Library: glib2
Library: Gtk2

Ported from the C example.

Program SimpleWindowApplication;
clickme = 'Click Me';
MAXLEN = 64;
counter: integer = 0;
procedure clickedme(o: PGtkButton; d: pointer); cdecl;
nt: Pchar;
l: PGtkLabel;
l := Gtk_LABEL(d);
nt := Pchar('You clicked me ' + inttostr(counter) + ' times');
Gtk_label_set_text(l, nt);
win: PGtkWindow;
button: PGtkButton;
Mylabel: PGtkLabel;
vbox: PGtkVBox;
Gtk_init(@argc, @argv);
win := PGtkWindow(Gtk_window_new(Gtk_WINDOW_TOPLEVEL));
Gtk_window_set_title(win, clickme);
button := PGtkButton(Gtk_button_new_with_label(clickme));
Mylabel := PGtkLabel(Gtk_label_new('There have been no clicks yet'));
Gtk_label_set_single_line_mode(Mylabel, TRUE);
vbox := PGtkVBox(Gtk_vbox_new(TRUE, 1));
Gtk_container_add(Gtk_CONTAINER(vbox), Gtk_WIDGET(Mylabel));
Gtk_container_add(Gtk_CONTAINER(vbox), Gtk_WIDGET(button));
Gtk_container_add(Gtk_CONTAINER(win), Gtk_WIDGET(vbox));
g_signal_connect(G_OBJECT(win), 'delete-event', TGCallBack(@Gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(button), 'clicked', TGCallBack(@clickedme), Mylabel);

[edit] Perl

Library: Perl/Tk

use Tk;
$main = MainWindow->new;
$l = $main->Label('-text' => 'There have been no clicks yet.')->pack;
$count = 0;
-text => ' Click Me ',
-command => sub { $l->configure(-text => 'Number of clicks: '.(++$count).'.'); },

Library: Perl/Gtk

use Gtk '-init';
# Window.
$window = Gtk::Window->new;
$window->signal_connect('destroy' => sub { Gtk->main_quit; });
# VBox.
$vbox = Gtk::VBox->new(0, 0);
# Label.
$label = Gtk::Label->new('There have been no clicks yet.');
# Button.
$count = 0;
$button = Gtk::Button->new(' Click Me ');
$button->signal_connect('clicked', sub {
# Show.
# Main loop.

Library: XUL::GuiGui

use XUL::Gui;
TextBox( id=>'txt', value=>'there have been no clicks yet' ),
Button( label=>'click me', oncommand=>sub{
$ID{txt}->value = ++$clicks

[edit] Perl 6

Library: GTK
use GTK::Simple;
my GTK::Simple::App $app .= new(title => 'Simple Windowed Application');
$app.size_request(350, 100);
my $label = text => 'There have been no clicks yet'),
my $button = => 'click me'),
$app.border_width = 40;
$button.clicked.tap: {
state $clicks += 1;
$label.text = "There has been $clicks click{ 's' if $clicks != 1 }";

[edit] Phix

include arwen.ew 
constant main = create(Window,"myApp",0,0,100,100,300,200, 0)
constant label = create(Label, "There have been no clicks yet",0,main,10,10,250,30,0)
constant btn = create(Button,"Click me",0,main,100,50,100,30,0)
integer count = 0
function mainHandler(integer id, integer msg, atom wParam, object lParam)
without warning
if id=btn and msg=WM_COMMAND then
count += 1
setText(label,sprintf("clicked %d times",count))
end if
return 0
end function

The without warning just stops messages about wParam and lParam not being used. The included demo\edita contains a window painter that lets you reposition/resize the above controls very easily.

[edit] PicoLisp

The standard PicoLisp GUI is HTTP based. Connect your browser to http://localhost:8080 after starting the following script.

#!/usr/bin/picolisp /usr/lib/picolisp/lib.l
(load "@ext.l" "@lib/http.l" "@lib/xhtml.l" "@lib/form.l")
(zero *Count)
(de start ()
(html 0 "Clicks" NIL NIL
(form NIL
(gui '(+Init +TextField) "There have been no clicks yet")
(gui '(+JS +Button) "click me"
'(set> (field -1)
(pack "Clicked " (inc '*Count) " times") ) ) ) ) ) )
(server 8080 "!start")

[edit] Pike

Library: Gtk2
GTK2.Widget mainwindow,clickcnt,clicker;
int clicks;
void click()
clickcnt->set_text("Clicks: "+(++clicks));
int main()
mainwindow->set_title("Click counter");
->add(clickcnt=GTK2.Label("There have been no clicks yet"))
->add(clicker=GTK2.Button("Click me"))
mainwindow->signal_connect("delete_event",lambda() {exit(0);});
return -1;

[edit] PowerShell

Library: WPK
$count = 0
New-Window {
New-StackPanel {
New-TextBlock "There have been no clicks yet" `
-On_Loaded {
Set-Variable tb $this
New-Button "Click me" `
-On_Click {
$tb.Text = $count
} -SizeToContent WidthAndHeight -Show


rexx ShowCount.rxj:
This Rexx program was invoked by Rexx, JVM loaded by Rexx!
win_size (standard): java.awt.Dimension[width=180,height=91]
but_size (standard): java.awt.Dimension[width=162,height=23]
win_size (enlarged): java.awt.Dimension[width=270,height=91]
but_size (enlarged): java.awt.Dimension[width=252,height=23]

[edit] Prolog

Works with SWI-Prolog and XPCE.

:- dynamic click/1.
dialog('Simple windowed application',
[ object :=
parts :=
[ Simple_windowed_application :=
dialog('Simple windowed application'),
Name :=
label(name, 'There have been no clicks yet'),
BtnClick :=
modifications :=
[ BtnClick := [ label := 'Click me !'
layout :=
[ area(Name,
area(40, 20, 200, 18)),
area(90, 60, 80, 24))
behaviour :=
BtnClick := [message := message(@prolog, btnclick, Name)]
btnclick(Label) :-
V1 is V+1,
sformat(A, '~w click(s)', [V1]),
send(Label, selection, A).
simple_windowed :-
make_dialog(D, 'Simple windowed application'),
send(D, open).

[edit] PureBasic

Global Window_0
Global Window_0_Text_0
Global Window_0_Button_1
Global Clicks, txt$
Procedure OpenWindow_Window_0()
Protected flags=#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar|#PB_Window_WindowCentered
Window_0 = OpenWindow(#PB_Any, 408, 104, 280, 45, "Simple windowed application", flags)
If Window_0
SmartWindowRefresh(Window_0, #True)
Window_0_Text_0 = TextGadget(#PB_Any, 5, 5, 165, 20, "There have been no clicks yet")
Window_0_Button_1 = ButtonGadget(#PB_Any, 190, 10, 85, 30, "Click me")
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case Window_0_Text_0
Case Window_0_Button_1
txt$="You Clicked "+Str(Clicks)+" time"
If Clicks>1: txt$+"s": EndIf
Case #PB_Event_CloseWindow

[edit] Python

Library: Tkinter

from Tkinter import Tk, Label, Button
def update_label():
global n
n += 1
l["text"] = "Number of clicks: %d" % n
w = Tk()
n = 0
l = Label(w, text="There have been no clicks yet")
Button(w, text="click me", command=update_label).pack()

[edit] The same in OO manner

#!/usr/bin/env python
from Tkinter import Button, Frame, Label, Pack
class ClickCounter(Frame):
def click(self):
self.count += 1
self.label['text'] = 'Number of clicks: %d' % self.count
def createWidgets(self):
self.label = Label(self, text='here have been no clicks yet')
self.button = Button(self, text='click me',
def __init__(self, master=None):
Frame.__init__(self, master)
self.count = 0
if __name__=="__main__":
Library: PyQt
import sys
from qt import *
def update_label():
global i
i += 1
lbl.setText("Number of clicks: %i" % i)
i = 0
app = QApplication(sys.argv)
win = QWidget()
win.resize(200, 100)
lbl = QLabel("There have been no clicks yet", win)
lbl.setGeometry(0, 15, 200, 25)
btn = QPushButton("click me", win)
btn.setGeometry(50, 50, 100, 25)
btn.connect(btn, SIGNAL("clicked()"), update_label)
app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))

Library: wxPython

import wx
class MyApp(wx.App):
def click(self, event):
self.count += 1
self.label.SetLabel("Count: %d" % self.count)
def OnInit(self):
frame = wx.Frame(None, wx.ID_ANY, "Hello from wxPython")
self.count = 0
self.button = wx.Button(frame, wx.ID_ANY, "Click me!")
self.label = wx.StaticText(frame, wx.ID_ANY, "Count: 0")
self.Bind(wx.EVT_BUTTON,, self.button)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.button, True, wx.EXPAND)
self.sizer.Add(self.label, True, wx.EXPAND)
return True
app = MyApp(0)

[edit] R

Library: gWidgets
Library: gWidgetstcltk

gWidgetsRGtk2 or gWidgetsrJava can be used as an alternative to gWidgetstcltk.

win <- gwindow()
lab <- glabel("There have been no clicks yet", container=win)
btn <- gbutton("click me", container=win, handle=function(h, ...)
val <- as.numeric(svalue(lab))
svalue(lab) <- ifelse( ,"1", as.character(val + 1))

[edit] Racket

#lang racket/gui
(define frame (new frame% [label "There have been no clicks yet"]))
(define num-clicks 0)
(define (cb obj me)
(set! num-clicks (add1 num-clicks))
(send frame set-label (format "~a" num-clicks)))
(new button% [parent frame] [label "Click me"] [callback cb])
(send frame show #t)

[edit] RapidQ

RapidQ has form designer that produces RapidQ Basic source code. You can get the same result by writing the code yourself with a text editor. Then compile it either from within IDE or by using the command line compiler.

DECLARE SUB buttonClick
CREATE form AS QForm
Height = 120
Width = 300
CREATE text AS QLabel
Caption = "There have been no clicks yet."
Left = 30: Top = 20
CREATE button1 AS QButton
Caption = "Click me"
Left = 100: Top = 50: Height = 25: Width = 100
OnClick = buttonClick
SUB buttonClick
STATIC count AS Integer
count = count+1
text.Caption = "Clicked " + STR$(count) + " times."

[edit] REBOL

rebol [
Title: "Simple Windowed Application"
Author: oofoe
Date: 2009-12-07

clicks: 0
; Simple GUI's in REBOL can be defined with 'layout', a
; special-purpose language (dialect, in REBOL-speak) for specifying
; interfaces. In the example below, I describe a gradient background
; with a text label and a button. The block in the button section
; details what should happen when it's clicked on -- increment the
; number of clicks and update the label text.
; The 'view' function paints the layout on the screen and listens for
; events.
view layout [
backdrop effect [gradient 0x1 black coal]
label: vtext "There have been no clicks yet."
button maroon "click me" [
clicks: clicks + 1
set-face label reform ["clicks:" clicks]

[edit] Ruby

Library: Ruby/Tk
require 'tk'
str ="no clicks yet")
count = 0
root =, "textvariable" => str).pack do
text "click me"
command {str.value = count += 1}
Library: Shoes do
stack do
@count = 0
@label = para "no clicks yet"
button "click me" do
@count += 1
@label.text = "click: #@count"

[edit] Run BASIC

msg$ = "There have been no clicks yet"
[loop] cls ' clear screen
print msg$
button #c, "Click Me", [clickMe] 'create a button with handle and goto [tag]
clicks = clicks + 1
msg$ = "Button has been clicked ";clicks;" times"
goto [loop]

[edit] Scala

Library: Scala
import scala.swing.{ BorderPanel, Button, Label, MainFrame, SimpleSwingApplication }
import scala.swing.event.ButtonClicked
object SimpleApp extends SimpleSwingApplication {
def top = new MainFrame {
contents = new BorderPanel {
var nClicks = 0
val (button, label) = (new Button { text = "click me" },
new Label { text = "There have been no clicks yet" })
layout(button) = BorderPanel.Position.South
layout(label) = BorderPanel.Position.Center
reactions += {
case ButtonClicked(_) =>
nClicks += 1
label.text = s"There have been ${nClicks} clicks"

[edit] Sidef

require('Gtk2') -> init;
# Window.
var window = %s'Gtk2::Window'.new;
window.signal_connect('destroy' => { %s'Gtk2'.main_quit });
# VBox.
var vbox = %s'Gtk2::VBox'.new(0, 0);
# Label.
var label = %s'Gtk2::Label'.new('There have been no clicks yet.');
# Button.
var count = 0;
var button = %s'Gtk2::Button'.new(' Click Me ');
button.signal_connect('clicked' => {
# Show.
# Main loop.

[edit] Smalltalk

Works with: Smalltalk/X
|top clickCount lh button|
clickCount := 0.
lh := ValueHolder with:'There have been no clicks yet'.
top := StandardSystemView label:'Rosetta Simple Window'.
top extent:300@100.
top add:((Label new labelChannel:lh) origin: 0 @ 10 corner: 1.0 @ 40).
top add:((button := Button label:'Eat Me') origin: 10 @ 50 corner: 100 @ 80).
button action:[
clickCount := clickCount + 1.
lh value: ('number of clicks: %1' bindWith:clickCount)
top open

[edit] Tcl

Library: Tk
package require Tk
pack [label .l -text "There have been no clicks yet"]
set count 0
pack [button .b -text "click me" -command upd]
proc upd {} {
.l configure -text "Number of clicks: [incr ::count]"

[edit] TI-89 BASIC

The Ti-89 does not have general onscreen buttons; this program uses the OK/Cancel choice of a dialog box to implement the UI.

Local clicks
0 → clicks
1 → ok © System variable also set by Dialog statement
While ok = 1
Title "Rosetta Code"
Text "There have been " & string(clicks) & " OKs"
clicks + 1 → clicks

[edit] Unicon

import gui
$include "guih.icn"
class SimpleApp : Dialog (label)
# -- automatically called when the dialog is created
method component_setup()
# create and add the label
label := Label("label=There have been no clicks yet","pos=50%,33%", "align=c,c")
add (label)
# create and add the button
button := TextButton("label=Click me", "pos=50%,66%", "align=c,c")
button.connect(self, "clicked", ACTION_EVENT)
add (button)
# some cosmetic settings for the window
attrib("size=180,70", "bg=light gray")
method clicked ()
static count := 0
count +:= 1
label.set_label ("Clicked " || count || " times")
procedure main()
local d := SimpleApp ()

[edit] Vedit macro language

Reg_Set(10, "There have been no clicks yet")
#1 = 0
repeat (ALL) {
#2 = Dialog_Input_1(3, "`Simple Windowed Application`,
`[&Click me]`,`[&Exit]`"
if (#2 != 1) { break } // ESC or Exit
Num_Str(#1, 10)
Reg_Set(10, "Clicked", INSERT)
Reg_Set(10, " times", APPEND)

[edit] Visual Basic

In VB, windows are usually created in the IDE. The generated code is hidden from the user unless viewed outside of VB. For the sake of this task, I have included that code, but normally it is hidden from the programmer.

Begin VB.Form Form2
Caption = "There have been no clicks yet"
ClientHeight = 2940
ClientLeft = 60
ClientTop = 600
ClientWidth = 8340
LinkTopic = "Form1"
ScaleHeight = 2940
ScaleWidth = 8340
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton Command1
Caption = "Click me!"
Height = 495
Left = 3600
TabIndex = 0
Top = 1200
Width = 1215
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'-----user-written code begins here; everything above this line is hidden in the GUI-----
Private clicked As Long
Private Sub Command1_Click()
clicked = clicked + 1
Me.Caption = clicked & " clicks."
End Sub

[edit] Web 68

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public Licence as published by
the Free Software Foundation, either version 3 of the Licence, or
(at your option) any later version.
Copyright (c) 2012 Sian Mountbatten.
@m cvs simpleapp = "$Id: $"
@<Included declarations@>
@<Plain values in the outer reach@>
@<Names in the outer reach@>
@<Procedures in the outer reach@>
@<Logic in the outer reach@>
@ The local compiler requires a special prelude.@^system dependencies@>
USE @<Library preludes@>
@ And a special postlude.@^system dependencies@>
@ The program requires the predefined forms and the standard prelude.
simpleapp fd,standard
@ This Web 68 file provides the Xforms prelude.
The initial processing consists of initialising the Xforms library.
open(argf,"",arg channel);
fl initialize(argc,argv,"simpleapp",NIL,0);
@ Declare the !REF FILE!.
FILE @!argf;
@1Main processing.
The form is created in !simpleapp fd! the source code of which is 108 lines long.
Firstly, define the callback for the button.
button cb:=(REF FLOBJECT obj,INT data)VOID:
clicks +:= 1;
fl set object label(text box OF click form,whole(clicks,0)+" click"+
(clicks=1|""|"s")+" on the button")
@ Declare !clicks!.
INT clicks:=0;
@ Create the form, show it and hand control to the Xforms library.
click form:=create form click;
fl show form(click OF click form,fl place center,fl full border,"SimpleApp");
fl do forms
@ Declare the form.
REF FDCLICK click form;
@1Macro declarations.
All the macros used in the program are declared here.
macro fl do forms;
macro fl initialize;
macro fl set object label;
macro fl show form;
@ To compile the program, use this command:
ca -l mod -l forms simpleapp.w68
The predefined form will have been compiled with this command:
ca -m mod simpleappfd.w68
The predefined form was created by the <b>fdesign</b> program for the Xforms library,
and the resulting form definition file was converted to Web 68 by the program

[edit] XPL0

include c:\cxpl\stdlib;         \standard library provides mouse routines, etc.
def Ww=40, Wh=12, Wx=(80-Ww)/2, Wy=(25-Wh)/2; \window width, etc.
def Bw=11, Bh=4, Bx=Wx+(Ww-Bw)/2, By=Wy+3*(Wh-Bh)/4; \button size & position
int Clicks, Mx, My; \number of clicks and mouse coordinates
[ShowCursor(false); \turn off flashing cursor
Attrib($1F); \bright white characters on blue
SetWind(Wx, Wy, Wx+Ww, Wy+Wh, 2, true); \blue window with no scroll
DrawBox(Wx, Wy, Wx+Ww, Wy+Wh, 3); \draw borders
Cursor(Wx+5, Wy+3); Text(6, "There have been no clicks yet.");
DrawBox(Bx, By, Bx+Bw, By+Bh, 0); \draw button
Cursor(Bx+2, By+2); Text(6, "Click me");
Clicks:= 0;
repeat if GetMouseButton(0) then \left button down
[while GetMouseButton(0) do []; \wait for release
Mx:= GetMousePosition(0) / 8; \character coordinates
My:= GetMousePosition(1) / 8;
if Mx>=Bx & Mx<=Bx+Bw & My>=By & My<=By+Bh then
[Clicks:= Clicks+1; \mouse pointer is on the button
Cursor(Wx+4, Wy+3);
Text(6, "Times button has been clicked: ");
IntOut(6, Clicks);
until ChkKey; \keystroke terminates program
SetVid(3); \turn off mouse and turn on flashing cursor

[edit] Yorick

Yorick does not include a GUI toolkit. However, it does provide a plotting system that can emulate some basic GUI features, such as buttons and labels. The above sample uses a built-in library "button.i", which is itself written in Yorick.

#include "button.i"
window, 0;
btn_click = Button(text="click me", x=.395, y=.65, dx=0.04368, dy=0.0091);
btn_quit = Button(text="quit", x=.395, y=.6, dx=0.02184, dy=0.0091);
count = 0;
msg = "There have been no clicks yet";
finished = 0;
do {
plt, msg, .395, .7, justify="CH";
button_plot, btn_click;
button_plot, btn_quit;
xy = mouse(0, 0, "");
if(button_test(btn_click, xy(1), xy(2))) {
msg = swrite(format="Number of clicks: %d", count);
} else if(button_test(btn_quit, xy(1), xy(2))) {
finished = 1;
winkill, 0;
} while(!finished);
Personal tools