2016-06-01 11 views
0

In einem ListBox möchte ich die Namen der vom Benutzer ausgewählten Elemente überprüfen. ListBox ermöglicht mehrere Auswahlmöglichkeiten. Ich habe versucht, einen Code zum Verfolgen der Cursorauswahl zu schreiben, aber ich habe folgende Probleme.TCL: So legen Sie mehrere eindeutige Listbox-Auswahl in einer Datei ab

  1. nur das letzte Element in einer Datei gedruckt wird, und
  2. Jede neue Auswahl die vorherige Auswahl kann nicht gedruckt werden, wenn die puts Anweisung abfragen.

Hier ist mein Code

 package require Tk 
     proc selectionMade {w} { 
     ##  --- loop through each selected element 
       foreach index [$w curselection] { 
         # puts "Index --> $index" 
           set filename selected_list.list 
           set fileId [open $filename "w"] 
           puts "[$w get $index]" 
           puts $fileId "[$w get $index]" 
           close $fileId 
            } 
            } 

      catch {console show} 
      listbox .lb -selectmode multiple 
      bind .lb <<ListboxSelect>> {selectionMade %W} 

      pack .lb -fill both 
      set filename fsp.txt 
      set fp [open $filename "r"] 
      set stuff [read $fp] 
      foreach item $stuff { 
      .lb insert end $item 
     } 

close $fp 

Angenommen, meine Eingabedatei fsp.txt folgende Elemente hat:

  • Amerika
  • Britannien
  • Neuseeland
  • Australien
  • Indien
  • ...

Vielen Dank für Ihre Eingabe.

Antwort

1

Das Problem besteht darin, dass Sie die Datei mit der Berechtigung "w" öffnen, wodurch alle vorherigen Inhalte überschrieben werden.

Es gibt ein paar Lösungen. Zuerst könnten Sie mit "a" (append) Modus öffnen. Oder Sie können es vor der Schleife öffnen und innerhalb der Schleife darauf schreiben, oder Sie könnten eine Zeichenfolge in der Schleife erstellen und sie dann einmal schreiben, wenn die Schleife beendet ist.

Zum Beispiel:

proc selectionMade {w} { 
    set filename selected_list.list 
    set fileId [open $filename "w"] 

    foreach index [$w curselection] { 
     puts $fileId "[$w get $index]\n" 
    } 

    close $fileId 
}