Názory k článku Programovací jazyk TCL (10)

  • Článek je starý, nové názory již nelze přidávat.
  • 20. 9. 2005 16:35

    Dr.Tič (neregistrovaný)
    By me docela zajimalo, jestli ty priklady jsou provozovany ve Widlich nebo jestli je jenom nastavena takto dekorace v manazerovi.
    Ale jinak serial i clanek dobry. Dost dobry!
  • 21. 9. 2005 7:59

    Pavel Tišnovský
    Zlatý podporovatel
    Tyto screenshoty jsou konkretne porizeny na Windows XP, ktere provozuji na pracovnim notebooku (nainstalovat Linux tam nemuzu a pri spusteni nejake live distribuce nefunguje APM, takze pro notebook je to nepouzitelny). Osobne pracuji na ctyrech pocitacich s ruznymi systemy a vsechnu svoji praci mam na USB disku, takze si to postupne prenasim a s Windows tim padem nejsou problemy (vsude mam nainstalovany Vim :-)
  • 20. 9. 2005 22:40

    jirka b. (neregistrovaný)
    Dekuji za MOC pekny serial. Rozhodne mi pomohl - uz jsem si vyrobil dve GUI hracky (ale pro me dost uzitecne) pomoci Tcl/Tk a v serialu bylo uz dost veci, ktere mi usetrily myslim docela hodne hledani a zkouseni.

    Jen bych se zeptal - cituji: "(během stisknutého tlačítka myši není vykreslovaný objekt vidět, i když i tuto funkcionalitu je možné zařídit)".

    Slo by tedy jeste ukazat nejaky uplne maly priklad, jak tu funkcionalitu co nejjednoduseji zaridit?

    Dekuji.
  • 21. 9. 2005 8:02

    Pavel Tišnovský
    Zlatý podporovatel
    Potesilo me, ze nekomu ten serial pomaha.

    Ted k tomu problemu s grafickym editorem: jde o to, ze se zachytava i pohyb mysi a v procedure, ktera tento pohyb zachytava se zmeni souradnice druheho vrcholu usecky. Tim padem si musite taky zapamatovat identifikator usecky, abyste se na nej mohl odkazovat. Zkusim ten programek napsat a poslat sem do fora.
  • 21. 9. 2005 11:44

    Pavel Tišnovský
    Zlatý podporovatel

    Tak jsem si konečně našel čas pro vypracování toho příkladu. Může to vypadat například následovně (pro jednoduchost to kreslí jenom úsečky, ale rozšíření na další typy je přímočaré). Ještě pro vysvětlení: v případě, že se stlačí tlačítko myši, zapamatuje se pozice kurzoru a nastaví se globální proměnná button (protože motion reaguje i na pohyb bez tlačítka). Potom už stačí na pohyb reagovat tak, že se pracovní úsečka smaže a vytvoří se nová. Identifikátor úsečky si pamatuji v proměnné usecka. Šlo by to řešit i tak, že se překonfigurují parametry stávající úsečky (aby se nemusela mazat a vytvářet), ale toto je přehlednější. Pracovní úsečka se vykresluje červeně, to zajistí parametr -fill red.

    
    #!/usr/bin/wish
    
    # Jednoduchý grafický editor založený na widgetu canvas
    # přidána "gumová" úsečka
    
    # globální proměnné
    set x1 0
    set y1 0
    set usecka 0
    set button 0
    
    # kontejner pro vkládání dalších widgetů
    frame .editor
    
    # plátno, na které se bude kreslit
    canvas .editor.platno -width 512 -height 384
    
    # vložení všech widgetů do okna aplikace
    pack .editor
    pack .editor.platno
    
    # navázání událostí od myši
    bind .editor.platno <buttonpress-1>   { start %x %y }
    bind .editor.platno <buttonrelease-1> { stop %x %y }
    bind .editor.platno <motion>          { motion %x %y }
    
    # procedura, která je zavolána v případě,
    # že uživatel stlačí levé tlačítko myši
    proc start { x y } {
        # zapamatování polohy kurzoru myši
        global x1
        global y1
        global button
        global usecka
        set x1 $x
        set y1 $y
        set button 1
    #    set usecka [.editor.platno create line $x $y $x $y -fill red]
    }
    
    # procedura, která je zavolána v případě,
    # že uživatel pustí levé tlačítko myši
    proc stop { x y } {
        global x1
        global y1
        global button
        set button 0
    
        .editor.platno create line $x1 $y1 $x $y
    }
    
    # procedura, která je zavolána v případě,
    # že uživatel pohybuje korzorem myši
    proc motion { x y } {
        global x1
        global y1
        global button
        global usecka
        if ($button) {
            .editor.platno delete $usecka
            set usecka [.editor.platno create line $x1 $y1 $x $y -fill red]
        }
    }
    
    
  • 21. 9. 2005 13:21

    jirka b. (neregistrovaný)
    Děkuji moc za příklad - to vypadá ještě o dost jednodušeji, než jsem si myslel (pořád si nějak nemůžu zvyknout, že canvas v Tk umí mnohem víc věcí než bývá obvyklé jinde). Ale funguje to pěkně.

    Předpokládám, že ButtonPress atd. psaný jen malými písmeny je vylepšení nějaké novější verze? Verze 8.4.4 proti tvaru "buttonpress" trochu protestovala ;-)
  • 21. 9. 2005 13:39

    Pavel Tišnovský
    Zlatý podporovatel
    No, pokud by canvas fungoval jako obvbvykle, tj. jako nějaká pixmapa, tak by to bylo o hodně složitější. Asi to znáte, xorování pixelů se starou úsečkou, vykreslení úsečky nové, možná i double buffering atd. Ještě efektivnější je například editor spline křivek či polygonů.

    Já jsem ten program testoval ve verzi 8.4.10.1, to je docela nová věc... Pravdu máte v tom, že i v manuálu se stále píše ButtonPress, ButtonRelease a Motion, takže by bylo korektnější to psát takto smíšeně.
  • 22. 8. 2006 15:03

    majoo (neregistrovaný)
    V prvom rade diky za serial. Ucim sa podla neho Tcl/Tk.
    A toto su moje prve riadky v nom:

    #!/usr/bin/wish

    # Jednoduchý grafický editor založený na widgetu canvas
    # výsledná verze editoru

    # globální promìnné
    set rezim usecka
    set x1 0
    set y1 0
    set act_obj 0

    # seznam tlaèítek, kterými se editor bude ovládat
    set tlacitka {usecka kruznice elipsa ctverec obdelnik vymazat konec}
    array set fncs {
    usecka line
    kruznice oval
    elipsa oval
    ctverec rect
    obdelnik rect
    }
    set nazvy {Úseèka Kružnice Elipsa Ètverec Obdélník "Vymazat entitu" Konec}

    # kontejner pro vkládání dalších widgetù
    frame .editor
    frame .editor.tlacitka

    # plátno, na které se bude kreslit
    canvas .editor.platno -width 512 -height 384

    # vytvoøení tlaèítek, kterými se mìní režim editoru
    foreach entita $tlacitka nazev $nazvy {
    button .editor.tlacitka.$entita -text $nazev -command " nastavRezim $entita "
    }

    # vložení všech widgetù do okna aplikace
    pack .editor
    pack .editor.platno
    pack .editor.tlacitka -side top -fill both -expand true

    # vložení všech tlaèítek na kontejner
    foreach entita $tlacitka {
    pack .editor.tlacitka.$entita -side left -fill both -expand true
    }

    # navázání událostí od myši
    bind .editor.platno <ButtonPress-1> { start %x %y }
    bind .editor.platno <ButtonRelease-1> { stop %x %y }
    bind .editor.platno <Motion> { move %x %y }

    # procedura pro nastavení režimu editoru
    proc nastavRezim {rez} {
    global rezim
    set rezim $rez
    if { [string compare $rezim konec] == 0 } {
    exit
    }
    }

    # procedura, která je zavolána v pøípadì,
    # že uživatel stiskne levé tlaèítko myši
    proc start { x y } {
    # zapamatování polohy kurzoru myši
    global x1 y1 rezim fncs act_obj
    set x1 $x
    set y1 $y
    # v režimu mazání se vymaže nejbližší entita
    # ke kurzoru myši
    if { [string compare $rezim vymazat] == 0 } {
    .editor.platno delete [.editor.platno find closest $x $y]
    }
    if {[info exists fncs($rezim)]} {set act_obj [.editor.platno create $fncs($rezim) $x1 $y1 $x $y]}
    }

    # procedura, která je zavolána v pøípadì,
    # že uživatelpohne myší
    proc move { x y } {
    global x1 y1 rezim fncs act_obj

    # rozdíly mezi starou a novou polohou
    # kurzoru myši
    if {[string compare $rezim kruznice] == 0 || [string compare $rezim ctverec] == 0} {
    set dx [expr abs($x1-$x)]
    set dy [expr abs($y1-$y)]
    if { $dx>$dy } {set dy $dx}
    set x [expr $x1+$dy]
    set y [expr $y1+$dy]
    }

    # vykreslení jednotlivých entit
    if {[info exists fncs($rezim)]} {if {$act_obj != 0} {.editor.platno coords $act_obj $x1 $y1 $x $y} }
    }
    # procedura, která je zavolána v pøípadì,
    # že uživatel pustí levé tlaèítko myši
    proc stop { x y } {
    global act_obj
    set act_obj 0
    }
  • 21. 9. 2005 13:26

    jirka b. (neregistrovaný)
    Ještě mě napadlo - sice je to trochu off-topic, ale málokdy se zmiňuje, že třeba i takový velký a složitý program jako je ANSYS (http://www.ansys.com) má GUI napsané pomocí Tcl/Tk.
  • 21. 9. 2005 17:41

    marian (neregistrovaný)
    Dalsim "velkym" systemom pouzivajucim Tcl/Tk je GIS GRASS, aj ked v tomto pripade sa je mozne zaobist bez neho -- vystaci si aj s cisto textovym vstupom pomocou terminalu a ovladanie pomocou GUI je volitelne -- vid. http://grass.itc.it/grass61/manuals/html61_user/grass6.html