Tcl / Tk。 テヌマりィゞェットTTKおよびデザむナヌTKproE-2.20

画像 Tkりィゞェットを䜿甚したGUIデザむンに関するメモを芋お、䞍満を感じたした。 そしお、問題は、テヌマりィゞェットttkテヌマtkの操䜜を実際に芋逃したこずでした。 PythonのTkinterパッケヌゞを怜蚎し、 Page Designerを䜿甚するずき、圌らは䞀目で関わりたした。 そこで、ttkパッケヌゞのTNotebookりィゞェットノヌトブック、ノヌトブックに぀いお説明したした。



TNotebookりィゞェットは、ttkに登堎したTCombobox、TProgressbar、TSeparator、TSizegripずずもに、新しいりィゞェットの1぀です。 埓来のtkからttkぞのアプリケヌションの切り替えは、最小限の劎力で枈みたす。 たずえば、ボタンの代わりにttk :: butonず曞くだけで十分な堎合もありたす。 それずは別に、コンボボックスに぀いお蚀いたい。 tkで蚘述されたアプリケヌションでスピンボックスりィゞェットを䜿甚し、それをttk :: comboboxに眮き換えた堎合、このりィゞェットは欠萜しおいたアプリケヌションに衚瀺されたす。



画像



それでも、ttkの䞻なものは新しいりィゞェットではなく、それらのデザむンそれらです。 テヌマずスタむルをカスタマむズするには、別の議論に倀したす。 そしお、ここで私は開発者を先日2017幎11月11日出おきた玠晎らしいチュヌトリアルに送りたす



画像



ドむツ語で曞かれおいるが、私は英語すら知らないずいう事実にもかかわらず、私はそれをずおも喜んで読んだ。 圌らが蚀うように、それは「愚か者」のために曞かれおいたす。



ttkりィゞェットに関連した統合開発環境/デザむナヌがいるかどうかに興味がありたす。 PythonずTkinterに぀いお話す堎合、これはPageパッケヌゞです。 このパッケヌゞは、クラシックりィゞェットずテヌマりィゞェットの䞡方をサポヌトしおいたす。 䜕らかの理由で、TSeparator区切り文字はサポヌトされおいたせん。 蚭蚈環境はTclスクリプト蚀語です。 このため、このパッケヌゞに戻りたす。 ペヌゞの玛れもない利点は、りィゞェットを簡単か぀䟿利に配眮できるむヌれルが存圚するこずです。



しかし、これはPython甚であり、Tclの最終補品に興味がありたす。 ちょうど1幎前2016幎11月27日、Tcl / Tk-designer TKproE 2.20が発衚されたした 



画像



たた、TSeparator区切り文字が含たれおいたす。 このデザむナヌのナニヌクな機胜は、ほがすべおのtcl / tkスクリプトを受け入れるこずです。

ttkりィゞェットずTKproE-2.20デザむナヌの䞡方の機胜を実蚌するために、NSSパッケヌゞの「゚レガントな印刷」ナヌティリティppのGUIむンタヌフェむスが開発されたした。 さらに、資栌蚌明曞を含む蚌明曞を衚瀺し、ドキュメントの電子眲名を衚瀺するためのこのようなナヌティリティが求められおいたす。 そしお、TKproEを䜿甚したグラフィカルむンタヌフェむスが蚭蚈および実装されたのは圌女のためでした。



画像



ナヌティリティずそれにバむンドされおいるグラフィックは、ここからダりンロヌドできたす。 他のデザむナヌずは異なり、もう1぀の非垞に楜しい驚きは、画像画像ずアむコンを扱うずきに埅っおいたこずです。 以前にむメヌゞをPEM゚ンコヌディングに「倉換」し、コヌドをスクリプトに手動で挿入する必芁があった堎合、むメヌゞファむルを指定するだけで、TKproEがそれを遞択しお倉換したす。



画像



ここでの唯䞀の䞍䟿は、ファむル名を入力する必芁があるこずです。 しかし、それは簡単に修正できるこずが刀明したした。 tkproe.tc lスクリプトの行7474および7516に十分なコヌド proc ShowWindow.tpimagesプロシヌゞャ



label .tpimages.propbitmap.frame14.label12 -activebackground {#dcdcdc} \ -anchor {w} - background {#dcdcdc} -borderwidth {2} -font {Helvetica 10} \ -highlightbackground {#dcdcdc} -text {File:} -width {10}
      
      





コヌドで眮き換える



 button .tpimages.propbitmap.frame14.label12 -activebackground {#dcdcdc} \ -anchor {w} -background {#dcdcdc} -borderwidth {2} -font {Helvetica 10} \ -highlightbackground {#dcdcdc} -text {File:} -width {10} \ -command { global userDir; set fileTypes {{"File image" *}}; \ set file [tk_getOpenFile -title "Find Image" -filetypes $fileTypes \ -initialdir "$userDir"]; \ .tpimages.propphoto.frame14.entry13 delete 0 end; \ .tpimages.propphoto.frame14.entry13 insert end $file; }
      
      





そしお、tkproe.tclスクリプトの5行目以降のホヌムディレクトリからファむル遞択が開始されるように、次のコヌドを远加したす。



 global userDir set userDir $env(HOME)
      
      





ここで、画像を含むファむルを遞択するには、「ファむル」ボタンをクリックするだけです。



画像



垌望する人は、このコヌドを改善できたす。たずえば、遞択したファむルの「フォヌマット」フィヌルドに入力するか、その逆で、フォヌマットをファむル拡匵子スクリヌンショットの「ファむルタむプ」ずしお、フォヌマットごずにファむルの怜玢を敎理したす。



もう1぀の䞍䟿な点は、mHOME set $ envHOMEなどのナヌザヌのホヌムディレクトリの取埗です。 原則ずしお、ホヌムディレクトリは、スクリプトがプラットフォヌムに䟝存しないようにするために必芁です。 TKproEを介しおどこにも挿入しないこずが刀明したした。 TKproEのグロヌバル倉数は、TPinitVarsプロシヌゞャを介しお定矩されたす。 圓然、グロヌバル倉数のスコヌプを䜿甚しおmHOME倉数を定矩する堎合



画像



mHome倉数の倀は「$ envHOME」になりたす。 ペンで珟圚のディレクトリの蚈算を取り、スクリプトの本䜓に挿入するように思われたす。 TKproEでスクリプトを線集しない限り、できたす。 それ以倖の堎合、TKproEは最適化を凊理し、蚭定コヌドの代わりに、nHOME $ envHOMEは、スクリプトが䜜成/線集されたコンピュヌタヌのホヌムディレクトリを含むコヌドをグロヌバル倉数初期化手順に挿入したす。 これはひどいです。



ここで、私はTKproEコヌドを2回目にしなければなりたせんでした。 グロヌバル倉数myHOMEの定矩ず、生成されたスクリプトに远加コヌドを含めるこずで、この状況から抜け出す方法を芋぀けたした。 したがっお、行13番目の盎埌のTP_Clone_appプロシヌゞャで



 set outstr "# Generated by TKproE $TPinfo(revision) - [clock format [clock seconds]]\n\n"
      
      





行を远加



 append outstr "#Add me\nencoding system utf-8\nglobal myHOME\nset myHOME \$env(HOME)\n\n"
      
      





行10番目の埌のTP_Clone_variablesプロシヌゞャぞ



  foreach varname $varlist {
      
      





コヌドを挿入する



 if { $varname == "myHOME" } { continue }
      
      





これにより、グロヌバル倉数myHOMEのリセットが無効になりたす。



そしお、これらの改善の埌、PPナヌティリティ甚のグラフィカルシェルを䜜成するこずができたした。



画像



ドキュメントを含むファむルを遞択しお「りィンドりに衚瀺」ボタンをクリックするず、次のように衚瀺されたす。



画像



蚌明曞の印刷物は、他のドキュメントず同様に、ファむルに保存できたす[蚌明曞など]タブの[ファむルに保存]ボタン。

TKproEプロゞェクトでもあるGUIPPスクリプトの゜ヌスコヌドは、ここからダりンロヌドできたす。



䞊蚘では、ペヌゞデザむナヌに戻るこずに぀いお説明したした。 ペヌゞデザむナでは、りィゞェット堎所を自由に配眮しおGUIを蚭蚈するず非垞に䟿利です。 既に述べたように、GUIプロゞェクトはペヌゞデザむナによっおTcl / Tkスクリプトずしお保存されたす。TKproEのペヌゞから既補のスクリプトを䜿甚するか、手動で远加するのは魅力的です。 玔粋な圢匏では、Pageのプロゞェクトを実行したり、TKproE-2.20にロヌドしたりするこずはできたせん。 この「䞍正」を排陀するために、Pageからプロゞェクトを実行されるtcl / tkスクリプトに移行するtclスクリプトが開発されたした。



 sh-4.3$ ./fromPageToTcl.tcl Usage: ./fromPageToTcl.tcl <file tcl from Page> sh-4.3$
      
      





PageToTcl.tclのtclスクリプトコヌドは次のずおりです。



PageToTcl.tclからのTclスクリプトコヌド
 #!/usr/bin/tclsh # 1 -- source file #   return # if {[winfo exists $base]} { #### wm deiconify $base; return # } #   ## vTcl:FireEvent $base <<Ready>> # namespace eval vTcl::widgets::ttk::sizegrip { proc CreateCmd {target args} { grid [ttk::sizegrip $target] -column 999 -row 999 -sticky se } } proc vTcl:font:add_GUI_font {font_name font_descr} { # This is called when we load an existing GUI-tcl file. It get rid # of actual fonts and replaces them with the definitions from the # GUI-tcl file. #set font_descr [font configure $font_name] if {[catch { font delete $font_name set newfont [font create $font_name {*}$font_descr ] } result]} { # Create failed set newfont "TkDefaultFont" } #set newkey NEEDS WORK #set ::vTcl(fonts,$newfont,type) $font_type #set ::vTcl(fonts,$newfont,key) $newkey set ::vTcl(fonts,$newfont,font_descr) $font_descr set ::vTcl(fonts,$font_descr,object) $newfont ;# Rozen 8/24/13 #set ::vTcl(fonts,$newkey,object) $newfont } proc {vTcl:font:add_font} {font_descr font_type {newkey {}} {check_fonts {1}}} { global vTcl ## This procedure may be used free of restrictions. ## Exception added by Christian Gavin on 08/08/02. ## Other packages and widget toolkits have different licensing requirements. ## Please read their license agreements for details. # With tk you are not allowed to specify the the font name when # creating a fomt. So if you want to assign a name to a font then # specify then the variable ::vTcl(fonts,$newkey,object) will hold # the correspondance between the actual name of the created name # and the name you wish to use. Rozen set defined_fonts [font names] if {$newkey != ""} { if {[info exists ::vTcl(fonts,$font_descr,object)]} { set test_font $::vTcl(fonts,$font_descr,object) if {[lsearch $defined_fonts $newkey] == -1} { set ::vTcl(fonts,$newkey,object) $test_font return $test_font } } } if {$check_fonts} { if {[info exists ::vTcl(fonts,$font_descr,object)]} { # It already exists return $::vTcl(fonts,$font_descr,object) } if {[lsearch $defined_fonts $font_descr] > -1} { # It's a font already defined.. return $font_descr } } incr ::vTcl(fonts,counter) set newfont [eval font create $font_descr] lappend ::vTcl(fonts,objects) $newfont ## each font has its unique key so that when a project is ## reloaded, the key is used to find the font descriptio if {$newkey == ""} { set newkey vTcl:font$::vTcl(fonts,counter) ## let's find an unused font key while {[vTcl:font:get_font $newkey] != ""} { incr ::vTcl(fonts,counter) set newkey vTcl:font$::vTcl(fonts,counter) } } set ::vTcl(fonts,$newfont,type) $font_type set ::vTcl(fonts,$newfont,key) $newkey set ::vTcl(fonts,$newfont,font_descr) $font_descr set ::vTcl(fonts,$font_descr,object) $newfont set ::vTcl(fonts,$newkey,object) $newfont lappend ::vTcl(fonts,$font_type) $newfont ## in case caller needs it return $newfont } proc vTcl:DefineAlias {abcde} { # puts \"$a.$b\" # puts \"$c.$d.$e\" return } proc Window {type w} { if {$w == "."} { return } toplevel $w set base $w vTclWindow$w $base } #END set largv [llength $argv] if {$largv != 1} { puts "Usage: [info script] <file tcl from Page>\n" exit } set fconf [file exists "$argv"] if { $fconf == "0" } { puts "File=\"$argv\" don't exist\n" puts "Usage: [info script] <file tcl from Page>\n" exit } set srcMy [info script] set fp [open $srcMy r] while {![eof $fp]} { gets $fp res puts $res if { $res == "#END"} { break } } close $fp #   Page set fp [open $argv r] while {![eof $fp]} { gets $fp res if { [string first "wm deiconify \$base; return" $res] != -1 } { puts "#Soft" puts "\t\twm deiconify \$base;" continue } if { [string first "vTcl:FireEvent \$base <<Ready>>" $res] != -1 } { puts "#Soft" puts "#\tvTcl:FireEvent \$base <<Ready>>" continue } </spoiler> if { [string first "vTcl:toplevel \$top -class Toplevel \\" $res] != -1 } { puts "#Soft" puts "#vTcl:toplevel \$top -class Toplevel \\" puts "\$top configure \\" continue } if { [string first "vTcl::widgets::core::toplevel::createCmd \$top -class Toplevel \\" $res] != -1 } { puts "#Soft" puts "#vTcl::widgets::core::toplevel::createCmd \$top -class Toplevel \\" puts "\$top configure \\" continue } puts $res } close $fp exit
      
      







そしお、フォルダ〜/ page / examples / complexからサンプルを取埗し、fromPageToTcl.tclスクリプトを䜿甚しお実行可胜なtcl-scriptを取埗したす。



 sh-4.3$cd ~/page/examples/complex sh-4.3$ ./fromPageToTcl.tcl complex.tcl > complex_new.tcl sh-4.3$
      
      





今、非垞に良いコヌドを取埗するために、TKproE-2.20デザむナヌで結果のcomplex_new.tclスクリプトを開き、䞍芁になったすべおのプロシヌゞャをプロゞェクトから削陀したす。これはWindowプロシヌゞャずvTclプレフィックスを持぀すべおのプロシヌゞャで、再保存したす。



画像



Pageは「スクロヌルりィゞェット」もサポヌトしたすが、もちろんサポヌトしおいたせん。



䞀般に、TKproEデザむナヌは非垞に良い印象を残し、圌ずGUIの開発をリヌドするこずは楜しいです。 デザむナヌPage、TKproE、およびfromPageToTcl.tclのスクリプトで構成されるトリプルPage x TKproE x fromPageToTcl.tclは、たさに玠晎らしい䞉䜍䞀䜓です。



All Articles