> 1 <

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

misha

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.

misha

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 часа(ов)

misha

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"))

misha

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"))

misha

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 часа(ов)

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2626   2010-07-04 22:07 GMT+3 часа(ов)      
Может кому-то интересно как создавать GUI используя только либы GTK2?

XVilka

Members


Статус

10 сообщений
http://www.droid-developers.org
Где: Russia Moscow
Род занятий:
Возраст: 32

#4472   2011-06-21 09:49 GMT+3 часа(ов)      
Цитата
Может кому-то интересно как создавать GUI используя только либы GTK2?

misha, мне очень интересно. Как раз ищу подобную информацию, для работы над интерпретатором.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4474   2011-06-21 20:59 GMT+3 часа(ов)      
А каким боком это относится к интерпретатору?

XVilka

Members


Статус

10 сообщений
http://www.droid-developers.org
Где: Russia Moscow
Род занятий:
Возраст: 32

#4475   2011-06-22 03:53 GMT+3 часа(ов)      
Мне интересен принцип, для написания FFI, на самой схеме, без привлечения сторонних библиотек

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4476   2011-06-23 22:38 GMT+3 часа(ов)      
Читали "FFI: Racket Foreign Interface"? Можете описать ваш интерпретатор?

XVilka

Members


Статус

10 сообщений
http://www.droid-developers.org
Где: Russia Moscow
Род занятий:
Возраст: 32

#4479   2011-06-27 14:09 GMT+3 часа(ов)      
Да, прочитал. И в принципе понял что надо делать. А интерпертатор прост - я дорабатываю до ума (для использования во встраиваемых системах) вот это http://www.stripedgazelle.org/joey/dream.html

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4480   2011-06-27 23:28 GMT+3 часа(ов)      
Так это игрушка, поэтому ваша "доработка до ума" закончится полным переписыванием исходного кода. Лучше попробуйте Gambit Scheme.
> 1 <


Онлайн :

0 пользователь(ей), 32 гость(ей) :




Реклама на сайте: