Ltk:メニューから他ウィンドウを表示する - lisp-cookbook-ja/common-lisp GitHub Wiki
- メニューからほかウィンドウの表示
以下、3本のコードをファイル化し、REPLでkpr-main.lispをloadしてください。
> (load "kpr-main.lisp")
kpr-main.lisp
;;; LTKのメニューから別のウィンドウを起動する
(ql:quickload :ltk)
;; 他画面ロード
(load "calc.lisp")
(load "rgb.lisp")
;; パッケージの作成
(defpackage :kpr-main
(:use :common-lisp
:ltk
:kpr-calc
:kpr-rgb)
(:export :main))
(in-package :kpr-main)
(defun main ()
(with-ltk ()
(wm-title *tk* "メニュー")
(minsize *tk* 200 100)
(let* (
;; メニューバー作成
(mb (make-menubar))
;;メニュー"種類"
(mshurui (make-menu mb "アプリ" ))
(mf-command (make-menubutton mshurui "電卓"
(lambda () ;(error "asdf")
(format t "電卓メニュー pressed~&")
(calc-main) ; 電卓アプリを開く
(finish-output))
:underline 1))
(sep2 (add-separator mshurui))
(mf-export (make-menu mshurui "選択メニュー"))
(mfe-jpg (make-menubutton mf-export "電卓" (lambda ()
(format t "電卓 pressed~&")
(calc-main) ; 電卓アプリを開く
(finish-output))))
(mfe-gif (make-menubutton mf-export "RGBテスト" (lambda ()
(format t "RGBテスト pressed~&")
(rgb-main) ; RGBテストアプリを開く
(finish-output))))
(sep3 (add-separator mshurui))
(mf-close (make-menubutton mshurui "終了"
(lambda () ;(error "asdf")
(format t "終了 pressed~&")
(setf *exit-mainloop* t)
(finish-output))
:underline 1))
(msg (make-instance 'message
:text "メニューから別画面を開くアプリです。"
:width 1000
:background "#FFFFFF"))
(b1 (make-instance
'button
:text "Close"
:command (lambda ()
(format t "終了")
(setf *exit-mainloop* t)))))
(pack msg
:side :top
:fill :x) ; fillを指定すると、Wiindowのハシをドラッグして伸ばしてもボタンが大きくなる。
(pack b1
:side :bottom
:fill :x) ; fillを指定すると、Wiindowのハシをドラッグして伸ばしてもボタンが大きくなる。
;; (configure msg
;; :anchor :w
;; )
)))
(main)
calc.lisp
;;; LTKでボタンを表示する
(ql:quickload :ltk)
;; パッケージの作成
(defpackage :kpr-calc
(:use :common-lisp
:ltk)
(:export :calc-main))
(in-package :kpr-calc)
(defun calc-main ()
(with-ltk ()
(wm-title *tk* "電卓アプリ")
(let* (
;; ベース用フレーム1(演算用ボタン配置用 √、÷、×、−)
(f-base1 (make-instance
'frame))
;; ベース用フレーム2(数字ボタン用配置用 0〜9、ドット、プラスマイナス、+、=)
(f-base2 (make-instance
'frame))
;; 電卓数字部用フレーム
(f-first1 (make-instance
'frame
:master f-base2))
;; 電卓+ボタンと=ボタン用フレーム
(f-first2 (make-instance
'frame
:master f-base2))
;; 電卓「0」「.」「±」用フレーム
(f-second1 (make-instance
'frame
:master f-first1))
;; 電卓「1」「2」「3」用フレーム
(f-second2 (make-instance
'frame
:master f-first1))
;; 電卓「4」「5」「6」用フレーム
(f-second3 (make-instance
'frame
:master f-first1))
;; 電卓「7」「8」「9」用フレーム
(f-second4 (make-instance
'frame
:master f-first1))
(b51 (make-instance
'button
:master f-base1
:text "√"
:command (lambda ()
(format t "ボタン√を押しました~%"))))
(b52 (make-instance
'button
:master f-base1
:text "÷"
:command (lambda ()
(format t "ボタン÷を押しました~%"))))
(b53 (make-instance
'button
:master f-base1
:text "×"
:command (lambda ()
(format t "ボタン×を押しました~%"))))
(b54 (make-instance
'button
:master f-base1
:text "ー"
:command (lambda ()
(format t "ボタンーを押しました~%"))))
(b11 (make-instance
'button
:master f-second1
:text "0"
:command (lambda ()
(format t "ボタン0を押しました~%"))))
(b12 (make-instance
'button
:master f-second1
:text "."
:command (lambda ()
(format t "ボタン.を押しました~%"))))
(b13 (make-instance
'button
:master f-second1
:text "+/-"
:command (lambda ()
(format t "ボタン+/-を押しました~%"))))
(b21 (make-instance
'button
:master f-second2
:text "1"
:command (lambda ()
(format t "ボタン1を押しました~%"))))
(b22 (make-instance
'button
:master f-second2
:text "2"
:command (lambda ()
(format t "ボタン2を押しました~%"))))
(b23 (make-instance
'button
:master f-second2
:text "3"
:command (lambda ()
(format t "ボタン3を押しました~%"))))
(b31 (make-instance
'button
:master f-second3
:text "4"
:command (lambda ()
(format t "ボタン4を押しました~%"))))
(b32 (make-instance
'button
:master f-second3
:text "5"
:command (lambda ()
(format t "ボタン5を押しました~%"))))
(b33 (make-instance
'button
:master f-second3
:text "6"
:command (lambda ()
(format t "ボタン6を押しました~%"))))
(b41 (make-instance
'button
:master f-second4
:text "7"
:command (lambda ()
(format t "ボタン7を押しました~%"))))
(b42 (make-instance
'button
:master f-second4
:text "8"
:command (lambda ()
(format t "ボタン8を押しました~%"))))
(b43 (make-instance
'button
:master f-second4
:text "9"
:command (lambda ()
(format t "ボタン9を押しました~%"))))
(b44 (make-instance
'button
:master f-first2
:text "+"
:command (lambda ()
(format t "ボタン+を押しました~%"))))
(b24 (make-instance
'button
:master f-first2
:text "="
:command (lambda ()
(format t "ボタン=を押しました~%"))))
(b3 (make-instance
'button
:text "終了"
:command (lambda ()
(format t "終了")
(setf *exit-mainloop* t))))
)
;(pack (list b1 b2 b3) :side :top) ; 通常の並び、順番に並ぶ。これがデフォルト
;(pack (list b1 b2 b3) :side :left) ; 指定されたオブジェクトを左から順番に並べる
;(pack (list b1 b2 b3) :side :right) ; 指定されたオブジェクトを右から順番に並べる
;(pack (list b1 b2 b3) :side :bottom) ; 指定されたオブジェクトを下から順番に並べる
;(pack (list b1 b2 b3) :side :top :fill :x) ; fillを指定すると、Wiindowのハシをドラッグして伸ばしてもボタンが大きくなる。
;; フレームの配置
(pack (list f-base1 f-base2) :side :top :fill :both :expand :yes)
(pack (list f-first1 f-first2) :side :left :fill :both :expand :yes)
(pack (list f-second1 f-second2 f-second3 f-second4) :side :bottom :fill :both :expand :yes)
;; 計算機能ボタン配置(√、÷、×、ー)
(pack (list b51 b52 b53 b54) :side :left :fill :both :expand :yes)
;; 数字ボタン配置
(pack (list b11 b12 b13) :side :left :fill :both :expand :yes)
(pack (list b21 b22 b23) :side :left :fill :both :expand :yes)
(pack (list b31 b32 b33) :side :left :fill :both :expand :yes)
(pack (list b41 b42 b43) :side :left :fill :both :expand :yes)
;; 計算機能ボタン配置(+、=)
(pack (list b44 b24) :side :top :fill :both :expand :yes)
(pack b3 :side :top :fill :both :expand :yes) ; fill,both,expand,yesを指定すると、Wiindowのハシをドラッグして伸ばしても、ボタンが上下左右に大きくなる。
)))
;(main)
rgb.lisp
;;; pack後のオブジェクトに対するパラメータ設定(configure)
(ql:quickload :ltk)
;; パッケージの作成
(defpackage :kpr-rgb
(:use :common-lisp
:ltk)
(:export :rgb-main))
(in-package :kpr-rgb)
(defun rgb-main ()
(with-ltk ()
(wm-title *tk* "ConfigureによるRGB設定テスト")
(let* (
;; ベース用フレーム(赤色)
(f-red (make-instance
'frame))
;; ベース用フレーム(青色)
(f-blue (make-instance
'frame))
;; ベース用フレーム(緑色)
(f-green (make-instance
'frame))
;; ベース用フレーム(ボタン)
(f-btn (make-instance
'frame))
;; RGB値目視用ラベル
(lbl-rgb (make-instance
'label
:master f-btn
:text "RGB Color"))
;; 赤色ラベル
(lbl-red (make-instance
'label
:text " RED:"
:master f-red))
;; 青色ラベル
(lbl-blue (make-instance
'label
:text " BLUE:"
:master f-blue))
;; 緑色ラベル
(lbl-green (make-instance
'label
:text "GREEN:"
:master f-green))
;; 赤色スケール値
(lbl-scale-red (make-instance 'label
:master f-red
:foreground :red
:text "00"))
;; 青色スケール値
(lbl-scale-blue (make-instance 'label
:master f-blue
:foreground :blue
:text "00"))
;; 緑色スケール値
(lbl-scale-green (make-instance 'label
:master f-green
:foreground :green
:text "00"))
;; 赤色スケール
(sc-red (make-instance 'scale
:master f-red
:from 0
:to 255
:length 300
:command (lambda (value)
(setf (text lbl-scale-red) (format nil "~2,'0x" (floor value))) ;16進数でラベルに表示(必ず2桁表示)
(configure lbl-rgb :background (concatenate 'string "#" (text lbl-scale-red) (text lbl-scale-green) (text lbl-scale-blue)))
)))
;; 青色スケール
(sc-blue (make-instance 'scale
:master f-blue
:from 0
:to 255
:length 300
:command (lambda (value)
(setf (text lbl-scale-blue) (format nil "~2,'0x" (floor value))) ;16進数でラベルに表示(必ず2桁表示)
(configure lbl-rgb :background (concatenate 'string "#" (text lbl-scale-red) (text lbl-scale-green) (text lbl-scale-blue)))
)))
;; 緑色スケール
(sc-green (make-instance 'scale
:master f-green
:from 0
:to 255
:length 300
:command (lambda (value)
(setf (text lbl-scale-green) (format nil "~2,'0x" (floor value))) ;16進数でラベルに表示(必ず2桁表示)
(configure lbl-rgb :background (concatenate 'string "#" (text lbl-scale-red) (text lbl-scale-green) (text lbl-scale-blue)))
)))
;; RGB値取得
(btn-get-scale (make-instance
'button
:master f-btn
:text "Get RGB!!"
:command (lambda ()
(format t "ボタンを押しました~%"))))
;; 終了
(btn-close (make-instance
'button
:text "終了"
:command (lambda ()
(format t "終了")
(setf *exit-mainloop* t))))
)
;; ベースフレームの配置
(pack (list f-red f-blue f-green f-btn) :side :top :fill :both :expand :yes)
;; 赤色設定フレーム内の配置
(pack lbl-red :side :left :fill :both :expand :yes)
(pack (list lbl-scale-red sc-red) :side :top :fill :both :expand :yes)
;; 青色設定フレーム内の配置
(pack lbl-blue :side :left :fill :both :expand :yes)
(pack (list lbl-scale-blue sc-blue) :side :top :fill :both :expand :yes)
;; 緑色設定フレーム内の配置
(pack lbl-green :side :left :fill :both :expand :yes)
(pack (list lbl-scale-green sc-green) :side :top :fill :both :expand :yes)
;; ボタンフレーム内の配置
(pack (list lbl-rgb btn-get-scale btn-close) :side :top :fill :both :expand :yes)
;; ボタンクリックでボタンの前景色を変更する
(configure lbl-red :background :red)
(configure lbl-blue :background :blue)
(configure lbl-green :background :green)
; (configure lbl-rgb :background "#FF00FF")
(configure lbl-rgb :background (concatenate 'string "#" (text lbl-scale-red) (text lbl-scale-blue) (text lbl-scale-green)))
)))
;;(main)