Автор |
Сообщение |
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#2427
2010-06-17 12:14 GMT+3 часа(ов)
|
Выбор GTK-server обусловлен тем, что это самый простой и наглядный способ прикрутить GUI к Вашим скриптам.
Существуют различные библиотеки, которые, как считают их авторы, облегчают создание GUI. Я не стану их использовать, хотя Вам стоит на них взглянуть. Возможно, это Ваш путь.
Для выполнения приведенных мной примеров Вам необходимо обзавестись Bigloo Scheme, а также, для пользователей windows еще и gtk2-runtime + gtk-server.
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#2428
2010-06-17 12:36 GMT+3 часа(ов)
|
Создание простого диалогового окна.
Строки начиная с (gtk "gtk_init NULL NULL") следует вставлять по одиночке. Вам следует обратить внимание на то, что возвращает каждая функция, т.к. это самая первая стадия отладки любого Вашего нового GUI. Не беспокойтесь, ошибки будут)
(define gtk-server (run-process "gtk-server" "stdin"
input: pipe: output: pipe:))
(define >>gtk-server-port (process-input-port gtk-server))
(define <<gtk-server-port (process-output-port gtk-server))
(define (gtk . str)
(with-input-from-port
<<gtk-server-port
(lambda ()
(with-output-to-port
>>gtk-server-port
(lambda ()
(display (apply string-append str))
(flush-output-port (current-output-port))
(read-line))))))
; Подготовим gtk к работе. Обязательно!
(gtk "gtk_init NULL NULL")
; Создадим модальный диалог
(define dialog (gtk "gtk_message_dialog_new "
"NULL GTK_DIALOG_MODAL GTK_MESSAGE_INFO "
"GTK_BUTTONS_OK \"Hello!\""))
; Представим диалог пользователю
(gtk "gtk_dialog_run " dialog)
; Уничтожим диалог
(gtk "gtk_widget_destroy " dialog)
; Завершение работы сервера. Обязательно!
(gtk "gtk_server_exit") Принцип работы достаточно прост. Вы производите запрос в виде строки и получаете ответ в виде указателя на текстовую строку, либо указатель на данные.
Формат запроса: имя-функции данные
Справочник по функциям GTK+ Reference Manual.
отредактировал(а) misha: 2010-06-17 13:19 GMT+3 часа(ов)
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#2429
2010-06-17 13:40 GMT+3 часа(ов)
|
Когда GUI Вас удовлетворяет, можно создать файл, например, gtk-server-toolkit.scm, и поместить в него следующий макрос: (define-syntax with-gtk-server
(syntax-rules (gtk)
((_ expr ...)
(let* ([gtk-server (run-process "gtk-server" "stdin"
input: pipe: output: pipe:)]
[>>gtk-server-port (process-input-port gtk-server)]
[<<gtk-server-port (process-output-port gtk-server)]
[gtk (lambda message
(with-input-from-port
<<gtk-server-port
(lambda ()
(with-output-to-port
>>gtk-server-port
(lambda ()
(display (apply string-append message))
(flush-output-port (current-output-port))
(read-line))))))])
expr ...)))) Теперь предыдущий пример можно переписать: (load "gtk-server-toolkit.scm")
(with-gtk-server
(gtk "gtk_init NULL NULL")
(define dialog (gtk "gtk_message_dialog_new "
"NULL GTK_DIALOG_MODAL GTK_MESSAGE_INFO "
"GTK_BUTTONS_OK \"Hello!\""))
(gtk "gtk_dialog_run " dialog)
(gtk "gtk_widget_destroy " dialog)
(gtk "gtk_server_exit"))
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#2432
2010-06-17 17:51 GMT+3 часа(ов)
|
Создание главного окна.
(load "gtk-server-toolkit.scm")
(with-gtk-server
(gtk "gtk_init NULL NULL")
; Создадим главное окно
(define main-window (gtk "gtk_window_new GTK_WINDOW_TOPLEVEL"))
; Подпишем гл. окно
(gtk "gtk_window_set_title " main-window " \"(My Window)\"")
; Гл. окно будет располагаться в центре экрана
(gtk "gtk_window_set_position " main-window " GTK_WIN_POS_CENTER")
; Отобразим гл. окно
(gtk "gtk_widget_show_all " main-window)
; Обработка событий
(let loop ([event (gtk "gtk_server_callback WAIT")])
(cond
((equal? event main-window)
(let ([dialog (gtk "gtk_message_dialog_new " main-window
" GTK_DIALOG_MODAL GTK_MESSAGE_INFO"
" GTK_BUTTONS_OK \"WinId: %d\nGood Bye!\" "
event)])
(gtk "gtk_dialog_run " dialog)
(gtk "gtk_widget_destroy " dialog)))
(else
(loop (gtk "gtk_server_callback WAIT")))))
(gtk "gtk_server_exit"))
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#2433
2010-06-17 18:00 GMT+3 часа(ов)
|
Лисп калькулятор.
(module calc
(include "gtk-server-toolkit.scm")
(main main))
(define (main args)
(gui))
(define (gui)
(with-gtk-server
(gtk "gtk_init NULL NULL")
(let* ([main-window (gtk "gtk_window_new GTK_WINDOW_TOPLEVEL")]
[edit (gtk "gtk_entry_new")]
[btn-eval (gtk "gtk_button_new_with_label \"Eval\"")]
[table (gtk "gtk_table_new 1 4 1")])
(gtk "gtk_window_set_title " main-window " \"(LispCalc)\"")
(gtk "gtk_window_set_position " main-window " GTK_WIN_POS_CENTER")
(gtk "gtk_table_attach_defaults " table " " edit " 0 3 0 1")
(gtk "gtk_table_attach_defaults " table " " btn-eval " 3 4 0 1")
(gtk "gtk_container_add " main-window " " table)
(gtk "gtk_widget_show_all " main-window)
(let ([btn-eval-clicked?
(begin
(gtk "gtk_server_connect " btn-eval
" \"clicked\" \"btn-eval-clicked\"")
(lambda (e) (string=? e "btn-eval-clicked")))]
[edit-activate?
(begin
(gtk "gtk_server_connect " edit
" \"activate\" \"edit-activate\"")
(lambda (e) (string=? e "edit-activate")))])
; Обработка событий
(let loop ([event (gtk "gtk_server_callback WAIT")])
(cond
((equal? event main-window)
(let ([dialog (gtk "gtk_message_dialog_new " main-window
" GTK_DIALOG_MODAL GTK_MESSAGE_INFO"
" GTK_BUTTONS_OK"
" \"Good Bye!\"")])
(gtk "gtk_window_set_title " dialog " \"(Exit)\"")
(gtk "gtk_dialog_run " dialog)
(gtk "gtk_widget_destroy " dialog)))
((or (edit-activate? event)
(btn-eval-clicked? event))
(let ([str (gtk "gtk_entry_get_text " edit)])
(when (> (string-length str) 0)
(gtk "gtk_entry_set_text " edit " "
(with-input-from-string
str
(lambda() (number->string (eval (read)))))))
(loop (gtk "gtk_server_callback WAIT"))))
(else
(loop (gtk "gtk_server_callback WAIT")))))))
(gtk "gtk_server_exit"))) Создайте файл calc.scm и поместите в него код. Затем откомпилируйте его.
Для пользователей windows:
Перейдите в каталог, где храниться Ваш исходник. Далее в командной строке введите:
1) bigloo --to-stdout calc.scm > calc.c
2) gcc -Ic:\bloo33a5\lib\bigloo\3.3a calc.c -o calc.exe -D_MINGW_VER -s -L. -Lc:\bloo33a5\lib\bigloo\3.3a c:\bloo33a5\lib\bigloo\3.3a/libbigloo_s-3.3a.a c:\bloo33a5\lib\bigloo\3.3a/libbigloogc-3.3a.a -Wl,--stack,8000000 -lm -lgmp -lws2_32 -mwindows
отредактировал(а) misha: 2010-06-18 19:20 GMT+3 часа(ов)
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#2626
2010-07-04 22:07 GMT+3 часа(ов)
|
Может кому-то интересно как создавать GUI используя только либы GTK2?
|
|
Members


10 сообщений
http://www.droid-developers.org
Где: Russia Moscow
Род занятий:
Возраст: 35
|
#4472
2011-06-21 09:49 GMT+3 часа(ов)
|
Цитата Может кому-то интересно как создавать GUI используя только либы GTK2?
misha, мне очень интересно. Как раз ищу подобную информацию, для работы над интерпретатором.
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#4474
2011-06-21 20:59 GMT+3 часа(ов)
|
А каким боком это относится к интерпретатору?
|
|
Members


10 сообщений
http://www.droid-developers.org
Где: Russia Moscow
Род занятий:
Возраст: 35
|
#4475
2011-06-22 03:53 GMT+3 часа(ов)
|
Мне интересен принцип, для написания FFI, на самой схеме, без привлечения сторонних библиотек
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#4476
2011-06-23 22:38 GMT+3 часа(ов)
|
|
|
Members


10 сообщений
http://www.droid-developers.org
Где: Russia Moscow
Род занятий:
Возраст: 35
|
#4479
2011-06-27 14:09 GMT+3 часа(ов)
|
|
|
Moderators


1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:
|
#4480
2011-06-27 23:28 GMT+3 часа(ов)
|
Так это игрушка  , поэтому ваша "доработка до ума" закончится полным переписыванием исходного кода. Лучше попробуйте Gambit Scheme.
|
|