Как сделать scrolledtext онлайн?

#user-interface #tcl #tk #incr-tcl

#пользовательский интерфейс #tcl #tk #incr-tcl

Вопрос:

Вот демонстрационный пример кода TCL для iwidgets::scrolledtext .

 package require Iwidgets
iwidgets::scrolledtext .st 
        -labeltext "Scrolledtext Example" 
        -visibleitems 70x20 
        -textfont {Courier 10} 
        -textbackground black 
        -vscrollmode dynamic 
        -hscrollmode dynamic 
        -wrap none
pack .st -fill both -expand true
.st component text configure -foreground green
.st import /path/to/some/file
 

Мне нужны следующие дополнительные параметры.

  1. Чтобы сделать iwidgets::scrolledtext онлайн, то есть когда iwidgets::scrolledtext открывается и когда я добавляю несколько строк в file at /path/to/some/file , я хочу iwidgets::scrolledtext , чтобы он обновлялся автоматически.
  2. Сделать текст iwidgets::scrolledtext статичным, то есть запретить редактирование текста.

Ответ №1:

Попробуйте этот небольшой подкласс класса scrolledtext:

 itcl::class TailScrolled {
    inherit iwidgets::Scrolledtext
    destructor {}
    public method import {filename}
    private variable fd
    private variable cb
    private method ReadAppend {}
}

itcl::body TailScrolled::destructor {} {
    if {[info exist fd]} {
        close $fd
        after cancel $cb
    }
}
itcl::body TailScrolled::import {filename} {
    if {[info exist fd]} {
        close $fd
        after cancel $cb
    }
    set fd [open $filename r]
    ReadAppend
}
itcl::body TailScrolled::ReadAppend {} {
    set cb [after 500 [::itcl::code ReadAppend]]
    insert end [read $fd]
}
 

(Предупреждение: я на самом деле не пробовал, поэтому, возможно, я точно знал, как выполнить наследование от виджета iWidgets. Это принцип того, как это сделать.)

Ответ №2:

Другими словами, вам нужна какая-то функциональность, подобная команде unix ‘tail’.

Не совсем для iwidgets, но код должен быть легко адаптирован, так что взгляните на tailing widget на Tcl ‘ers wiki. http://wiki.tcl.tk/1158