tOM: Tcl/Tk: dateentry will nicht...

Hi!

Ein Kollege hat ziemlich Streß und so hat er mich gebeten ihn ein bisschen auszuhelfen in Tcl/Tk. Und kaum will ich was machen taucht schon gleich ein Problem auf, wie solls auch anders sein.

Er weiß auch nicht worans liegt.

Ich möchte ein dateentry, wie das beispiel in Widgets zeigt, einbinden:

package require Iwidgets 3.0

Demo script for dateentry class

proc returnCmd {} {
  puts [.de get]
}

iwidgets::dateentry .de -labeltext "Date:" -command returnCmd
pack .de -fill x -expand yes -padx 10 -pady 10

In der Shell geht das auch, aber wenn ich das in das Programm einbinde kommt folgender Fehler, dieser aber auch erst, wenn ich den Kalender anklicke:

Error: class "iwidgets::Dateentry" already exists.

und bei Stack Trace folgende Fehlerausgabe:

class "iwidgets::Dateentry" already exists
    while executing
"class iwidgets::Dateentry {
    inherit iwidgets::Datefield

constructor {args} {}

itk_option define -grab grab Grab "global"
    itk_opt..."
    (file "C:/Programs/TclPro1.4/lib/iwidgets3.0.1/scripts/dateentry.itk" line 49)
    invoked from within
"source C:/Programs/TclPro1.4/lib/iwidgets3.0.1/scripts/dateentry.itk"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 $auto_index($name)"
    (procedure "::auto_load" line 13)
    invoked from within
"grab -global $itk_component(popup)"
    (object "::.box.middle.end.up.date" method "::iwidgets::Dateentry::_popup" body line 80)
    invoked from within
"::.box.middle.end.up.date _popup"
    (in namespace inscope "::iwidgets::Dateentry" script line 1)
    invoked from within
"namespace inscope ::iwidgets::Dateentry "
    (command bound to event)

Mhh.. ich hoffe das hier im Forum auch ein Tcl/Tk - Profi sitzt ;)

tOM

  1. hallo tOM,

    Ein Kollege hat ziemlich Streß und so hat er mich gebeten ihn ein bisschen auszuhelfen in Tcl/Tk. Und kaum will ich was machen taucht schon gleich ein Problem auf, wie solls auch anders sein.

    dein Fehler liegt hier, gleich in der ersten Zeile:

    du hast nix andres gemacht, als die "Demo" abzuschreiben, was durchaus zulässig ist. Aber du hast das Script aus dem Verzeichnis "C:/Programs/TclPro1.4/lib/iwidgets3.0.1/demos" genommen, das dort mit dem Namen "dateentry" liegt. Wenn du dieses Script ganz einfach mit der Endung TCL versiehst, funktioniert es problemlos.
    Deine Fehlermeldungen:

    class "iwidgets::Dateentry" already exists
        while executing
    "class iwidgets::Dateentry {
        inherit iwidgets::Datefield

    werden wahrscheinlich dadurch hervorgerufen, daß du ein anderes Script, nämlich

    "C:/Programs/TclPro1.4/lib/iwidgets3.0.1/scripts/dateentry.itk"

    per Doppelklick aufzurufen versucht hast. Bei mir kommen diese Fehlermeldungen nämlich nur dann.

    Ich kann dir sonst nicht viel dazu sagen, weil ich TCLPro nicht installiert habe, sondern ActiveTCL 8.4 beta4, und da kann es winzige Unterschiede geben  -  bei mir muß zum Beispiel die Versionsnummer für iwidgets anders geschrieben werden. Aber wenn ich dein Script, so wie es im Posting steht, als "dateentry.tcl" an einem beliebigen Ort abspeichere, läuft es völlig problemlos und lasäßt sich auch in jedes beliebige andere TCL-Script einbinden (wie gesagt, bei mir lediglich mit anderer Versionsnummer)

    Grüße aus Berlin

    Christoph S.

    1. Hi

      Das lustige ist ja: Bei mir auch.

      Aber wie gesagt ich bearbeite ein schon existierendes, größeres Programm. Und da hab ich einfach den Code eingefügt und dann kommt der Fehler. Muss ich noch irgendwas beachten oder so??

      thx tOM

      1. hi tOM,

        Das lustige ist ja: Bei mir auch.

        ups, versteh ich jetzt nicht ... da hättest du den Teil meines Postings, auf den du dich beziehst, vielleicht zitieren sollen :-(

        Aber wie gesagt ich bearbeite ein schon existierendes, größeres Programm.

        Naja, sowas gibts es ja. Bloß sehe ich an deiner Fehlermeldung, daß bei dir (oder eben deinem Freund *g*) TCLPro 1.4 installiert ist, und das ist bereits fast zwei Jahre alt und basiert auf TCL/Tk 8.3.2  -  aktuell ist aber TCL/Tk 8.4.1beta4. Da gibt es, da wir von einer Windows-Installation ausgehen, einige Veränderungen

        Und da hab ich einfach den Code eingefügt und dann kommt der Fehler. Muss ich noch irgendwas beachten oder so??

        "Irgendwas" mußt du mit SAicherheit noch beachten bzw. korrigieren. Ich sagte allerdings bereits, daß ich TCLPro nicht installiert habe. Die Version, die ich (unter WINDOWS) zur Zeit benutze, ist die jüngste beta, also TCL/Tk 8.4.0.1.beta4  -  übrigens hab ich die auch unter FreeBSD.

        TCLPro ist nur dann interessant, wenn man seine TCL-Scripts in EXE-Dateien umwandeln möchte, was zuweilen selbst bei einfachsten Scripts zu monströsen Riesendateien führt. Ich würde von der Benutzung von TCLPro grundsätzlich abraten, wenn man mit TCL/Tk noch nicht sehr vertraut ist. Für eine Windows-Installation (egal, welche  -  bei mir läufts auch unter Win95) ist das von ActiveState bereitgestellte jeweils aktuelle Paket (ActiveTcl8.4.0.1b4-win32-ix86.exe) mehr als ausreichend. Aber ACHTUNG! Leider gibt es bei TCL/Tk keine uneingeschränkte "Abwärtskompatibilität", das heißt, wenn du Packages einbindest, muß zumindest die Versionsnummer im Script angepaßt werden, meistens auch noch etwas mehr.

        Das Script, das du "abgetippt" hast, hat bei mir folgendes Aussehen:

        ----------------------------------------------------------------------

        #  DEMO: dateentry in [incr Widgets]

        ----------------------------------------------------------------------

        package require Iwidgets 4.0

        proc returnCmd {} {
          puts [.de get]
        }

        iwidgets::dateentry .de -labeltext "Date:" -command returnCmd
        pack .de -fill x -expand yes -padx 10 -pady 10

        Wenn ich das unter dem Namen "dateentry.tcl" an beliebigem Ort auf meinem Rechner ablege, kann ich es problemlos aufrufen und erhalte keinerlei Fehlermeldungen. Der Pfad dazu sieht bei mir so aus:
        D:\TCL\lib\iwidgets4.0.1\demos\dateentry
        Dieser Pfad kann bei dir natürlich anders aussehen, weil du ein Verzeichnis C:\Programme benutzt (das ich absolut nicht haben will). Wenn ich aber die Datei "D:\TCL\lib\iwidgets4.0.1\scripts\dateentry.itk" aufrufe und mit wish84.exe zu öffnen versuche (Doppelklick), bekomme ich vergleichbare (in Details andere) Fehlermeldungen, wie du sie gepostet hattest.

        Ich kann aber eine Datei "dateentry.tcl" aus jedem beliebigen anderen TCL-Script heraus aufrufen, wenn ich sie beispielsweise mit "require" eingebunden habe. Insofern kann ich dein Problem einfach nicht ganz richtig nachvollziehen, ich kann dir lediglich sagen, was auf meinem WinXP-Rechner passiert, wenn ich dieses TCL-Script ausführen lasse.

        Vielleicht würde es dir vorerst tatsächlich weiterhelfen, wenn du auf TCLPro verzicht4en und stattdessen die jüngste bei ActiveState angebotene EXE installieren würdest.

        Grüße aus Berlin

        Christoph S.

        thx tOM

        1. Hi

          zur Erklärung. Auf TCLPro kann ich nicht verzichten. Das ganze spielt sich bei Siemens Power Generation ab und ich hab grad mit den Webgeschichten nicht so viel zu tun, da hat mich mein Kollege gebeten ihm bei TCL auszuhelfen. Also kann ich net auf .exe-Files verzichten, da das Programme für unsere Kunden werden.

          Leider funtzt das ganze wohl net... ich muss wohl auf dateentry verzichten, dann wirds halt ein datefield *g

          tOM