2016-06-03 13 views
0

Ich entwickle derzeit GUI in tcl tk. In der GUI versuche ich, Datei fortlaufend zu lesen wie (Tail-f). Ich möchte Daten in Textfeld eingeben. Ich habe einen Thread erstellt, um diese Aufgaben zu trennen und gui lebendig zu halten. Aber es erlaubt mir nicht, den Namen des Text-Widgets innerhalb des Threads zu verwenden.Einfügen von Text in Textfeld in tcl tk durch Thread

So bin ich mit der Frage, wie Text Widget Name an den Thread übergeben werden.

ttk::notebook .note -width 1000 -height 450 
ttk::frame .note.tabOne; 
ttk::frame .note.tabTwo; 

.note add .note.tabOne -text "Test Configuration" 
.note add .note.tabTwo -text "Results" 

set .note.tabTwo.results [ScrolledWindow .note.tabTwo.results ] 
pack .note.tabTwo.results -fill both -expand true 

set resulttxt [text .note.tabTwo.results.resulttxt -wrap none -width 63 -height 10] 
.note.tabTwo.results setwidget $resulttxt 
pack .note 

proc displayText {$file} { 
    global file 
    global resulttxt 
    set data "hithi fio ui" 
    $resulttxt insert end $data 
    exec fio $file --status-interval=1 > test1.txt 2>&1 & 

    set t [thread::create] 
    thread::send -async $t [list set yourxs $resulttxt] 

    thread::send $t { 
    global resulttxt 
    puts $yourxs 
    # Load the Tcllib fileutil package to use its 
    # findByPattern procedure. 
    #package require fileutil 
    #set files [fileutil::findByPattern [pwd] *.tcl] 
    set log [open /media/sf_Tcl/bin/project/fio_ui-1.0/test1.txt r] 

    for { } { true } { after 1000 } { 
     #after [expr { int(500*rand()) }] 
     $yourxs insert end $data1 

    } 

    close $log 
    } 
} 
+0

Ist dies ein Duplikat von http://stackoverflow.com/questions/4436048/how-can-one-tcl-thread-cause-an-event-in-an-other? – Jackson

Antwort

0

In Tcl, alle Befehlsnamen (einschließlich aller Widget Namen) sind lokal für eine bestimmte Instanz Interpreter und Instanzen werden an einen Thread gebunden wird. Der Nicht-GUI-Thread muss Code an den GUI-Thread senden, um die Einfügung durchzuführen. Der einfachste Weg, dies zu umgehen, besteht darin, dass der GUI-Thread einen Befehl im Nicht-GUI-Thread erstellt, um die Einfügung durchzuführen.

thread::send $t [list proc appendToTextWidget string \ 
     "thread::send [thread::id] .note.tabTwo.results.resulttxt end \$string"] 

Die erforderliche Zitiert ist ein wenig schwierig, da man nicht nur list die Arbeit erledigen können alle, aber es ist ziemlich einfach, da thread::id garantiert eine metacharacter freies Wort zurückzukehren.

Sobald Sie das getan haben, kann der Nicht-GUI-Thread gerade tun:

appendToTextWidget "here's a message\n" 

und das wird den Text am Ende hinzufügen, verbergen alle Einzelheiten, wie das geschieht aus dem Verarbeitungscode.