SOF: Tcl/Tk

2002-12-26 Пенетрантность Denis Dzyubenko
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Приветствую,

Сегодня написал свою первую программу на tcl и Tk, и появилось куча
вопросов, а где их можно задавать я не знаю.
Можно я тут поспрашиваю ? спасибо ;)

Как идеологически правильнее обращаться в widget'ам - в каждой процедуре
обращаться к виджету по его имени, или объявить глобальную переменную в
которую поместить название виджета и обращаться к глобальной переменно,
или в качестве параметра процедуре передавать путь к виждету ?

Как обработать закрытие окна - т.е. я нажимаю на кнопку закрытия окна (в
titlebar'е) и хочу чтобы появилось окно Save?Ok:Cancel

Как писать портируемые программы - в Linux'е я в качестве начального
пути к файлам использую $env(HOME), но в windows нет такой переменной
окружения?

Хочу изменить шрифт у одного Text виджета, и чтобы этот шрифт хранился 
в каком-нибудь конфигурационном файле - можно использовать 
option readfile, но в windows нет такого понятия как XRDB. Откуда
брать нужные мне настройки?

Как изменить класс моего окна? Обычно класс = имя приложения, но можно
ли сделать по другому? 
toplevel -class ClassName создает новое окно с указанным класом. А как
изменить класс у главного (т.е. самого первого) окна приложения?

Для чего существует команда option get и как ее использовать?

- -- 
Denis
Windows 98 испугалась и наложила в своп.
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE+CvlW+zH7vYeuVKsRApE9AKC8PF0ix12aDkBFwqt2mCoQAJVsYgCgsKmc
VPts5MthdJfkyR1ObMU9zoI=
=d5fD
-END PGP SIGNATURE-



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Victor Wagner
On 2002.12.26 at 15:43:03 +0300, Denis Dzyubenko wrote:

 -BEGIN PGP SIGNED MESSAGE-
 Hash: SHA1
 
 Приветствую,
 
 Сегодня написал свою первую программу на tcl и Tk, и появилось куча
 вопросов, а где их можно задавать я не знаю.

mailto:[EMAIL PROTECTED]


 Можно я тут поспрашиваю ? спасибо ;)



 Как идеологически правильнее обращаться в widget'ам - в каждой процедуре
 обращаться к виджету по его имени, или объявить глобальную переменную в
 которую поместить название виджета и обращаться к глобальной переменно,
 или в качестве параметра процедуре передавать путь к виждету ?

Идеологически правильнее последний вариант. Глобальных переменных
следует избегать. А хард-кодед имена неудобны тем, что когда тебе
потребуется обвесить теми же процедурами другой виджет, их придется
переписывать.

 Как обработать закрытие окна - т.е. я нажимаю на кнопку закрытия окна (в
 titlebar'е) и хочу чтобы появилось окно Save?Ok:Cancel

wm protocol . WM_DELETE_WINDOW обработчик

 Как писать портируемые программы - в Linux'е я в качестве начального
 пути к файлам использую $env(HOME), но в windows нет такой переменной
 окружения?

if {$tcl_platform(platform) == unix } {
  set initial_path $env(HOME)
} elseif {$tcl_platform(platform) == windows } {
  set initial_path $env(USERPROFILE)
} else {
  tk_messageBox -type ok -title error -message Don't know where to\
  search for files on your platform $tcl_platform(platform)
  exit
}


 Хочу изменить шрифт у одного Text виджета, и чтобы этот шрифт хранился 
 в каком-нибудь конфигурационном файле - можно использовать 
 option readfile, но в windows нет такого понятия как XRDB. Откуда
 брать нужные мне настройки?

По-моему option все равно есть и работает. Эмулируя XRDB там, где ее
нету.

Но вообще-то никто не мешает задать шрифт при создании виджета явно,
или даже позже сказать
$widget configure -font что-надо


 Как изменить класс моего окна? Обычно класс = имя приложения, но можно
 ли сделать по другому? 
 toplevel -class ClassName создает новое окно с указанным класом. А как
 изменить класс у главного (т.е. самого первого) окна приложения?

Хорошего способа не знаю. В принципе wish -class дает требуемый
результат, но мне не удавалось засунуть это в строчку с #!

 Для чего существует команда option get и как ее использовать?

Для того, чтобы получить значение опции из option database. Там
можно хранить не только те опции виджетов, которые виджеты подбирают
автоматически, но и любые другие конфигурационные данные.

Например, если ты пользуешься тэгами в текстовом виджете, то цвета 
шрифта помеченного тэгом автоматически из optiondb не подберутся.
А с помощью $widget tag configure -fg [option get $widget mytagfont TagFont]
ты ее оттуда добудешь.
-- 
Victor Wagner   [EMAIL PROTECTED]
Chief Technical Officer Office:7-(095)-748-53-88
Communiware.Net Home: 7-(095)-135-46-61
http://www.communiware.net  http://www.ice.ru/~vitus



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Denis Dzyubenko
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On Thu Dec 26, 2002 at 16:12:44 +0300, Victor Wagner wrote:
 Сегодня написал свою первую программу на tcl и Tk, и появилось куча
 вопросов, а где их можно задавать я не знаю.
VW mailto:[EMAIL PROTECTED]
спасибо

VW Идеологически правильнее последний вариант. Глобальных переменных
VW следует избегать. А хард-кодед имена неудобны тем, что когда тебе
VW потребуется обвесить теми же процедурами другой виджет, их придется
VW переписывать.
понятно

 Как обработать закрытие окна - т.е. я нажимаю на кнопку закрытия окна (в
 titlebar'е) и хочу чтобы появилось окно Save?Ok:Cancel
VW wm protocol . WM_DELETE_WINDOW обработчик
понятно. Поиск destroy в хэлпе я делал а поискать слово delete не
догадался :(

 Как писать портируемые программы - в Linux'е я в качестве начального
 пути к файлам использую $env(HOME), но в windows нет такой переменной
 окружения?
VW 
VW if {$tcl_platform(platform) == unix } {
VW   set initial_path $env(HOME)
VW } elseif {$tcl_platform(platform) == windows } {
VW   set initial_path $env(USERPROFILE)
насколько я понимаю это только для NT? в 98 вроде не определен 
USERPROFILE

 Как изменить класс моего окна? Обычно класс = имя приложения, но можно
 ли сделать по другому? 
 toplevel -class ClassName создает новое окно с указанным класом. А как
 изменить класс у главного (т.е. самого первого) окна приложения?
VW 
VW Хорошего способа не знаю. В принципе wish -class дает требуемый
VW результат, но мне не удавалось засунуть это в строчку с #!
О, точно! вот так работает:
=+==
#!/bin/sh 
# the next line restarts using wish \
exec wish $0 -class wndclass $@
=+==
Это из хэлпа, хотя я не понимаю почему такая конструкция работает.

 Для чего существует команда option get и как ее использовать?
VW 
VW Для того, чтобы получить значение опции из option database. Там
VW можно хранить не только те опции виджетов, которые виджеты подбирают
VW автоматически, но и любые другие конфигурационные данные.
т.е. option db != xrdb ?  даже optiondb  xrdb ?

VW Например, если ты пользуешься тэгами в текстовом виджете, то цвета 
VW шрифта помеченного тэгом автоматически из optiondb не подберутся.
VW А с помощью $widget tag configure -fg [option get $widget mytagfont TagFont]
VW ты ее оттуда добудешь.
вот так не работает
option readfile ~/.Xdefaults
puts [option get . myfont font]

В ~/.Xdefaults
*myfont*font: sdssd

- -- 
Denis
Пришел на работу, включил компьютер, к интернету подключиться не смог...
пришлось работать
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE+CyQb+zH7vYeuVKsRAsTAAJ9qSDaQW4+SsbldNlINcsupYlF4CACcDsM9
ZNG/Rs+s6lMoiJSmtq599LQ=
=06o3
-END PGP SIGNATURE-



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Victor Wagner
On 2002.12.26 at 18:45:32 +0300, Denis Dzyubenko wrote:

  Как писать портируемые программы - в Linux'е я в качестве начального
  пути к файлам использую $env(HOME), но в windows нет такой переменной
  окружения?
 VW 
 VW if {$tcl_platform(platform) == unix } {
 VW   set initial_path $env(HOME)
 VW } elseif {$tcl_platform(platform) == windows } {
 VW   set initial_path $env(USERPROFILE)
 насколько я понимаю это только для NT? в 98 вроде не определен 
 USERPROFILE

Ну, дальнейшее разбирательство с tcl_platform или просто фаллбэк
поможет. Фаллбэк может быть такой

if { [info exists env(USERPROFILE)]} {
   set intitial_path $env(USERPROFILE) 
} else {
   set initial_path {c:\\WINDOWS\Мои документы}
   # Лучше конечно воспользоваться какой-то переменной. Но кто ж их
   # знает, какие они в DOS-based виндах бывают.
}

  Как изменить класс моего окна? Обычно класс = имя приложения, но можно
  ли сделать по другому? 
  toplevel -class ClassName создает новое окно с указанным класом. А как
  изменить класс у главного (т.е. самого первого) окна приложения?
 VW 
 VW Хорошего способа не знаю. В принципе wish -class дает требуемый
 VW результат, но мне не удавалось засунуть это в строчку с #!
 О, точно! вот так работает:
 =+==
 #!/bin/sh 
 # the next line restarts using wish \
 exec wish $0 -class wndclass $@
 =+==

 Это из хэлпа, хотя я не понимаю почему такая конструкция работает.

Конструкцмя работает потому что

1. Сначала эту штуку интерпретирует shell. Для него \ в конце строки
комментария не является признаком продолжения комментария на следующую
строку. Поэтому он выполняет команду exec wish

2. Команда exec приводит к тому, что выполнение shell-а прекращается,
поэтому все что дальше в этом файле написано на tcl он за синтаксические
ошибки не считает.

3. wish начинает интерпретировать файл и видит в нем комментарий,
который продолжается на следующую строчку. Он этот комментарий
пропускает, и exec wish  пропускается как его часть.


  Для чего существует команда option get и как ее использовать?
 VW 
 VW Для того, чтобы получить значение опции из option database. Там
 VW можно хранить не только те опции виджетов, которые виджеты подбирают
 VW автоматически, но и любые другие конфигурационные данные.
 т.е. option db != xrdb ?  даже optiondb  xrdb ?
 
 VW Например, если ты пользуешься тэгами в текстовом виджете, то цвета 
 VW шрифта помеченного тэгом автоматически из optiondb не подберутся.
 VW А с помощью $widget tag configure -fg [option get $widget mytagfont 
 TagFont]
 VW ты ее оттуда добудешь.
 вот так не работает
 option readfile ~/.Xdefaults
 puts [option get . myfont font]

Видимо, потому что название класса обязано начинаться с большой буквы.

 В ~/.Xdefaults
 *myfont*font: sdssd

Эта команда get
ищет либо
myapp.myfont
Myapp.myfont
*myfont

Еще искала бы 
myapp.Font
Myapp.Font
и *Font, 

если бы класс был прописан с большой буквы.




-- 
Victor Wagner   [EMAIL PROTECTED]
Chief Technical Officer Office:7-(095)-748-53-88
Communiware.Net Home: 7-(095)-135-46-61
http://www.communiware.net  http://www.ice.ru/~vitus



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Anton Kovalenko
 Denis Dzyubenko writes:

VW if {$tcl_platform(platform) == unix } {
VW set initial_path $env(HOME)
VW } elseif {$tcl_platform(platform) == windows } {
VW set initial_path $env(USERPROFILE)
 насколько я понимаю это только для NT? в 98 вроде не определен 
 USERPROFILE

Проверяйте  платформу, а  затем, если  это windows  -- бегом  в реестр
(package require registry), и оттуда берём всё нужное.

Если вы пишете кросс-платформенное приложение, то для windows советую
хранить настройки в реестре, а не в каком-нибудь $env(USERPROFILE)/.mydotfile.
Ну не принято это в виндах. Не положено.

VW Хорошего способа не знаю. В принципе wish -class дает требуемый
VW результат, но мне не удавалось засунуть это в строчку с #!
 О, точно! вот так работает:
 =+==
 #!/bin/sh 
 # the next line restarts using wish \
 exec wish $0 -class wndclass $@
 =+==
 Это из хэлпа, хотя я не понимаю почему такая конструкция работает.

С точки  зрения /bin/sh, здесь  закомментированы две первые  строки, а
третью нужно  выполнить. С  точки зрения tclsh  и wish,  третья строка
является продолжением второй, то есть частью комментария.

VW Для того,  чтобы получить  значение опции из  option database.
VW Там можно хранить не только те опции виджетов, которые виджеты
VW подбирают  автоматически, но  и любые  другие конфигурационные
VW данные.

 т.е. option db != xrdb ?  даже optiondb  xrdb ?

Ну, в xrdb частенько кладут не только свойства виджетов, но и настройки
самого приложения. Для такого случая xrdb и пригождается.

Кроме того, частенько пишутся мегавиджеты на основе чистого Tcl и Tk.
Прочитать из option db умолчания для мегавиджета тоже бывает нужно.

VW Например, если ты пользуешься тэгами в текстовом виджете, то цвета 
VW шрифта помеченного тэгом автоматически из optiondb не подберутся.
VW А с помощью $widget tag configure -fg [option get $widget mytagfont 
TagFont]
VW ты ее оттуда добудешь.

 вот так не работает
 option readfile ~/.Xdefaults
 puts [option get . myfont font]

Во-первых, синтаксис  option get  window _name_ _class_  означает не
то, что вы  подумали. В данном случае window  должно быть сопоставлено
шаблону *myfont. А name и class -- это имя опции и класс опции.

Сиречь
   option readfile .Xdefaults
   frame .myfont 
   puts [option get .myfont font Font]
будет работать на вашем примере.

 В ~/.Xdefaults
 *myfont*font: sdssd

Во-вторых, читать файл .Xdefaults  -- странное занятие для приложения.
Вам  следует   либо  довольствоваться  ресурсами   xrdb,  которые  уже
определены для данного дисплея (в debian они читаются из ~/.Xresources
при   запуске   X-сервера);   либо   написать   корректную   обработку
XENVIRONMENT  и XFILESEARCHPATH  (см.  man X),  чтобы  вести себя  как
классическое иксовое приложение. Либо, на худой конец, подчитывать
какой-нибудь ~/.myapprc и /etc/myapp.conf, но _не_ .Xdefaults или .Xresources.

-- 
With Best Wishes, Anton Kovalenko /* http://kovalenko.webzone.ru */
#!/usr/bin/wish - best wish I have for you!



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Denis Dzyubenko
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On Thu Dec 26, 2002 at 19:28:11 +0300, Anton Kovalenko wrote:
AK Кроме того, частенько пишутся мегавиджеты на основе чистого Tcl и Tk.
AK Прочитать из option db умолчания для мегавиджета тоже бывает нужно.
что такое 'мегавиджет'?

- -- 
Denis
Unix is user friendly. It's just selective about who it's friends are.
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE+C1gn+zH7vYeuVKsRAhnGAKCnlkRCYw5ywK6yZFJHztLLxReekACdG0H2
X7KcDFDM0rOugGnPx6K+7co=
=Sz+9
-END PGP SIGNATURE-



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Denis Dzyubenko
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On Thu Dec 26, 2002 at 19:26:26 +0300, Victor Wagner wrote:
 Это из хэлпа, хотя я не понимаю почему такая конструкция работает.
VW Конструкцмя работает потому что
[ skipped ]

понятно, спасибо!


- -- 
Denis
Press Ctrl-Alt-Del for more fun!
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE+C1Vd+zH7vYeuVKsRAtZuAKCZzXyieH7GJblN82LyAqZNfDl2RwCgnHja
tHzkak8nDqI1l+gwBhIatRI=
=2//m
-END PGP SIGNATURE-



Re: SOF: Tcl/Tk

2002-12-26 Пенетрантность Anton Kovalenko
 Denis Dzyubenko writes:

AK Кроме того, частенько пишутся мегавиджеты на основе чистого Tcl и Tk.
AK Прочитать из option db умолчания для мегавиджета тоже бывает нужно.
 что такое 'мегавиджет'?

Мегавиджет   --это   виджет   (widget,элемент   управления),
сконструированный  из  нескольких   других  виджетов;  тем  не  менее,
программист может работать с ним как с единым целым.

Примеры реализации мегавиджетов для Tcl/Tk см. в библиотеке tix (на Си + Tcl),
библиотеках bwidget, two, ctext и мн. др. (на чистом tcl)

-- 
With Best Wishes, Anton Kovalenko /* http://kovalenko.webzone.ru */
#!/usr/bin/wish - best wish I have for you!