Você está na página 1de 49

As trs Fates

Steven Ferg (steve@ferg.org)

Traduzido e adaptado por J. Labaki labaki@feis.unesp.br Grupo Python Departamento de Engenharia Mecnica UNE P ! "#ha o#teira

PENSANDO EM TKINTER

STEVEN FERG

ndice

Sobre Pensando em Tkinter Os programas TT000 Introduo $% &uatro &ue%t'e% b(%ica% da programa)*o de GU"% $#gun% ,arg'e% da programa)*o de GU"% obre o E-ent Loop TT010 O programa em Tkinter mais simples poss el! tr"s lin#as$ TT0&0 'riando um ob(eto )*I e +a,endo pack- containeres ersus .idgets$ /rame% %*o e#(%tico% TT030 'riando um 0idget e colocando1o no +rame$ TT033 *sando a estrutura de classes no programa$ Por &ue e%truturar %ua ap#ica)*o como uma c#a%%e1 3uando introduzir a e%trutura de c#a%%e% TT040 4lgumas +ormas di+erentes de de+inir um .idget$ TT030 5mpacotando$ Por&ue o% bot'e% apareceram -ertica#mente no 5#timo programa $#gun% termo% t6cnico% ! 7rienta)*o TT0%0 6a,endo 7inding$ TT0/0 8e9endo com +oco e ligando e entos de teclado a .idgets$ TT0/4 'ommand 7inding$ TT0/3 *sando e ent binding e command binding (untos$ Para &uai% e-ento% %er-e command binding1 U%ando e-ent binding e command binding ,unto% TT0/% 'ompartil#ando in+orma:es entre alimentadores de e entos$ 8omparti#hando in9orma)'e% entre 9un)'e% a#imentadora% de e-ento% Primeira %o#u)*o ! u%ar -ari(-ei% g#obai% egunda %o#u)*o ! u%ar -ari(-ei% in%tanciada% TT0// Transmitindo argumentos para alimentadores de e entos I! O problema$ 8aracter<%tica% mai% a-an)ada% de command binding TT0/; Transmitindo argumentos para alimentadores de e entos II! *sando <ambda$ TT0/2 Transmitindo argumentos para alimentadores de e entos III! *sando 'urr=ing$ obre 8urry 8urry ! como u%(>#o Lambda -er%u% 8urry ? e-ent@#ambdaA &ua# de-o u%ar1 TT0;0 Op:es de .idget e con+igura:es de pack TrC% t6cnica% de contro#ar o #ayout de uma GU" TT020 >osicionando +rames TT023 8?todos gerenciadores de (anelas @ controlando o taman#o de (anelas com a opo geometry$ TT100 Op:es de pack! sideA e9pandA +ill e anc#or$ Um ,eito pr(tico de encontrar erro%

3 3 4 + + . % / 0 2 11 22 24 13 14 2+ 2. 1% 12 && &4 4+ 4. &% 4: 4; 4; &2 40 31 33 =. =: =B 40 +D 43 4% 42 .D

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

Sobre Pensando em Tkinter Tenho tentado aprender %ozinho Tkinter por -(rio% #i-ro%E e tenho encontrado mai% di9icu#dade do &ue poderia pen%ar. 7 prob#ema 6 &ue o% autore% de%%e% #i-ro% ,( come)am dizendo tudo %obre o% widgets di%pon<-ei% em TkinterE ma% nunca d*o uma parada para eFp#icar o% conceito% b(%ico%. E#e% n*o eFp#icam como Gpen%ar em TkinterH. Ent*o achei &ue de-eria tentar e%cre-er um #i-ro do tipo &ue eu me%mo e%tou procurando. 7u ao meno% ra%cunhar e%%e tipo de #i-ro. Pensando em Tkinter con%i%te de pe&ueno% programa% &ue come)am a eFp#icar como pen%ar em Tkinter. Ne%te%E n*o me preocupo em cata#ogar todo% o% tipo% de Iidget%E atributo% e m6todo% di%pon<-ei% em TkinterE %omente em dar um empurr*ozinho na dire)*o do% conceito% b(%ico% do a%%unto. E%te% programa% n*o tCm inten)*o de introduzir todo% o% a%pecto% da programa)*o de Tkinter. Para e%te 9imE %ugiro &ue #eia GAn Introduction to TkinterHE de /rederik Lundh e GTkinter, GUI Programming wit P!t onHE da NeI M6Fico Tech 8omputer 8enter. $cima de tudoE &uero en9atizar &ue GPractical Programming in Tcl and TkH de Jrend Ke#ch 6 ab%o#utamente e%%encia# para traba#har com Tk e Tkinter. $rran,e e%%e #i-roL Note &ue -ocC n*o de-e rodar e%te% programar u%ando o "DLE. 7 "DLE 6 por %i %M uma ap#ica)*o de TkinterN po%%ui %eu prMprio Gmain#oopH &ue entrar( em con9#ito com o main#oop inc#u<do ne%te% programa%. e -ocC in%i%te em -er e rodar e%te% programa% u%ando "DLEE ent*o ! para cada programa ! de-er( apagar a #inha corre%pondente ao main#oop ante% de rod(>#o. E%te materia# tem %ido %ub%tancia#mente me#horado pe#o 9eedback do% entu%ia%ta% e comunidade pythoniana. Meu grande G7brigadoLH a $#an 8o#burnE Je99 Ep#erE Greg EIingE Tom GoodE te-e Oo#denE Jo%eph PnapkaE Gerrit MQ##erE Ru%%e# 7IenE e 8had Netzer. 7brigado a Terry 8arro## por reco#her e organizar e%%e materia#. /ina#menteE %e -ocC 6 no-o na programa)*o orientada a e-ento% S&ue Tkinter re&uerTE de-e dar uma o#hada ne%te a%%unto ante%. Os >rogramas UocC de-e baiFar o ar&ui-o zip &ue cont6m todo% o% programa%. Pode %er atra-6% do %eguinte endere)oA
http://geocities.yahoo.com.br/grupopython/pensando_em_tkinter.zip

7 pacote cont6m o% programa% de GPen%ando em TkinterH. Para in%ta#ar e%te% ar&ui-o%E %imp#e%mente de%compacte o pacote de ar&ui-o% em um diretMrio de %ua e%co#ha.

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

TT000 Introduo$
Ei% a#gun% programa% &ue come)ar*o a eFp#icar como pen%ar em Tkinter. Ne#e%E como ,( di%%eE n*o atento para todo% o% tipo% de Iidget%E atributo% e m6todo% di%pon<-ei% em TkinterE tampouco tento dar uma introdu)*o deta#hada %obre TkinterE %omente tento iniciar -ocC no caminho para entender o% %eu% conceito% b(%ico%. No decorrer do programa de en%inoE a di%cu%%*o 6 dedicada eFc#u%i-amente ao gerenciador de geometria pack. N*o 9a#aremo% %obre o% gerenciadore% grid ou place. 4s Buatro Buest:es bCsicas na programao de )*Is$ 3uando -ocC de%en-o#-e uma inter9ace com o u%u(rio S"UT h( um con,unto padr*o de &ue%t'e% &ue -ocC de-e %ati%9azer. 2T UocC de-e e%peci9icar como -ocC &uer &ue a "U %e pare"a. "%to 6E -ocC preci%a e%cre-er um cMdigo &ue determina o &ue o u%u(rio -er( na te#a do computadorN 4T UocC de-e decidir o &ue &uer &ue a "U fa"a. "%to 6E -ocC de-e e%cre-er procedimento% &ue %ati%9a)am a% nece%%idade% do programaN =T UocC preci%a a%%ociar o parecer com o fa#er. "%to 6E -ocC de-e e%cre-er um cMdigo &ue a%%ocia a% coi%a% &ue o u%u(rio -C na te#a com o% procedimento% &ue -ocC e%cre-eu para de%empenhar o% pap6i% re&uerido% pe#o programaN +T /ina#menteE -ocC de-e e%cre-er um cMdigo &ue %enta e e%pera pe#a entrada do u%u(rio. 4lguns (arg:es da programao de )*Is$ $ programa)*o GU" SGraphic U%er "nter9ace ! "nter9ace Gr(9ica com o U%u(rioT tem a#gun% ,arg'e% e%peciai% a%%ociado% V% %ua% &ue%t'e% b(%ica%. 2T NM% e%peci9icamo% como &ueremo% &ue um GU" %e pare)a de%cre-endo o% GwidgetsH &ue &ueremo% eFibirE e %ua% re#a)'e% e%peciai% Spor eFemp#oE o &uanto um Iidget% e%t( abaiFo ou acimaE ou V direita ou V e%&uerda de outro% Iidget%T. $ pa#a-ra GwidgetH 6 um termo %em tradu)*o &ue de%igna Gcomponente% de inter9ace gr(9ica com o u%u(rioH de um modo gera#. $idgets inc#ui e#emento% como ,ane#a%E bot'e%E menu% e iten% de menu%E <cone%E #i%ta% ro#ante%E barra% de ro#agemE etc. 4T 7% procedimento% &ue eFecutam a% tare9a% do% GU"% %*o chamado% Ge%ent andlerH. GE-ent%H %*o 9orma% de entrada de dado% como c#i&ue% de mou%e ou digita)*o no tec#ado. E%%e% procedimento% %*o chamado% Ghand#er%H Sa#imentadore%T por&ue e#e% Ga#imentamH Si%to 6E re%pondem aT e%te% e-ento%. =T $ a%%ocia)*o de um e-ent hand#er a um Iidget 6 chamada GbindingH. De modo gera# o proce%%o de binding en-o#-e a a%%ocia)*o entre trC% coi%a% di9erente%A +

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

a. Um tipo de e-ento Spor eFemp#oE um c#i&ue no bot*o e%&uerdo do mou%eE ou pre%%ionar a tec#a ENTERTE b. Um Iidget Spor eFemp#oE um bot*oT e c. Um procedimento e-ent hand#er. Por eFemp#oE nM% preci%amo% 9azer binding SaT num c#i&ue com o bot*o e%&uerdo do mou%e no SbT bot*o G/E8O$RH na te#a para ScT eFecutar o procedimento G9echeProgramaHE &ue 9echar( a ,ane#a e de%#igar( o programa. +T 7 cMdigo &ue %enta e e%pera pe#a entrada de dado% 6 chamada de Ge-ent #oopH. Sobre o 5 ent <oop e -ocC tem -i%to 9i#me%E %abe &ue toda cidadezinha tem uma -o-M &ue perde todo %eu tempo debru)ada na ,ane#aE %M ol ando. E#a -C tudo &ue acontece na -izinhan)a. Uma parte di%%o n*o tem gra)aE 6 c#aro ! %M pe%%oa% %ubindo e de%cendo a rua. Ma% a outra 6 intere%%ante ! como uma be#a briga entre o% pombinho% rec6m>ca%ado% do outro #ado da rua. 3uando a#go intere%%ante aconteceE e%%a -o-ozinha c*o>de>guarda imediatamente corre para o te#e9one contar tudo V po#<cia da -izinhan)a. 7 &%ent 'oop 6 a#go como e%%a -o-ozinhaA ga%ta todo %eu tempo e%perando &ue e-ento% aconte)am. Muito% do% e-ento% n*o tCm importncia Scomo c#icar num ponto neutro da ,ane#aTE e &uando o% -CE n*o 9az nada. Ma% &uando -C a#guma coi%a intere%%ante ! um e-ento &ue e#e %abeE por meio de um binding de e%ent andlerE &ue 6 intere%%ante Scomo um c#i&ue num do% bot'e% da ,ane#aT ! ent*o imediatamente contata o% e-ent hand#er e 9az com &ue %aibam &ue o e-ento aconteceu. 'omportamento do >rograma E%te programa 9aci#ita a -ocC o entendimento da programa)*o de inter9ace% com o u%u(rio mo%trando como e%te% conceito% b(%ico% %*o imp#ementado% em um programa muito %imp#e%. E%te programa n*o u%a Tkinter ou &ua#&uer 9orma de programa)*o GU"E %omente co#oca um menu e um con%o#eE e recebe caractere% digitado% no tec#ado como entrada. $%%imE como -ocC pode -erE e#e %ati%9az a% &uatro &ue%t'e% b(%ica% da programa)*o de inter9ace% com o u%u(rio.
#Questo 2: Define os procedimentos de event handler def handle_ !": print #$rong% &ry again%# def handle_'!": print # bsolutely right% def handle_)!": print #$rong% &ry again%# #Questo *: Define a apar+ncia da tela print #,n#-*.. # clear the screen print # /012 )3 44056756 68099756 6 :0# print #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# &rillium is a kind of flo(er%#

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

print print print print print print print print print print

#<ress the letter of your ans(er= then the 05&01 key.# # # # # . '. ). >. nimal# /egetable# :ineral# 0?it from this program#

#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# #$hat kind of thing is @&rillium@A#

#Questo B: C Event Loop. 4oop eterno= esperando Due algo aconteEa. (hile *: # CbserFamos o prG?imo eFento ans(er ; ra(_input!".upper!" # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH # Questo I: ssociamos os eFentos de teclado Due nos interessam # com seus eFent handlers. 8ma forma simples de binding. # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH if ans(er ;; # #: handle_ !" if ans(er ;; #'#: handle_'!" if ans(er ;; #)#: handle_)!" if ans(er ;; #>#: # clear the screen and e?it the eFent loop print #,n#-*.. break #<erceba Due ignorados. DuaisDuer outros eFentos no interessam= por isso so

TT010 O programa em Tkinter mais simples poss el! tr"s lin#as$


Da% &uatro &ue%t'e% b(%ica% na programa)*o de GU"% &ue nM% -imo% no 5#timo programaE e%te programa cumpre %omente uma ! e#e roda o e-ent #oop. S2T $ primeira #inha importa o mMdu#o Tkinter e deiFa>o di%pon<-e# para u%o. Perceba &ue a 9orma de importar SGfrom &kinter import -HT %igni9ica &ue nM% n*o &ueremo% ter &ue u%ar a 9orma GTkinter.H para e%peci9icar nada &ue &ui%ermo% uti#izar. S4T $ %egunda #inha cria uma ,ane#a top#e-e# S&ue pode ou n*o %e tornar -i%<-e#T. TecnicamenteE o &ue e%ta #inha 9az 6 criar uma in%tncia da c#a%%e GTkinter.TkH. E%ta ,ane#a top#e-e# 6 o componente GU" de mai% a#to n<-e#2 de &ua#&uer ap#ica)*o de Tkinter. Por con-en)*oE e%ta ,ane#a 6 norma#mente chamada de GraizH. S=T $ terceira #inha eFecuta o m6todo mainloop Si%%o 6E o e-ent #oopT de%te ob,eto rai#. $%%im &ue rodaE o main#oop e%pera &ue e-ento% aconte)am no ob,eto raiz. e um e-ento ocorreE ent*o e#e 6 a#imentado So e-ent hand#er 6 eFecutadoT e o #oop continua rodandoE e%perando
2

Entenda por Gde a#to n<-e#H a ap#ica)*o &ue tem mai% re#a)*o com o u%u(rio &ue com o cMdigo SN do TT.

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

pe#o prMFimo e-entoE ou at6 &ue aconte)a um e-ento &ue Gde%truaH a raiz. Um e-ento de%truidor pode %er o 9echamento da ,ane#a pe#o bot*o W de 9echamento. 3uando a raiz 6 de%tru<daE a ,ane#a 6 9echada e o e-ent #oop cance#ado. 'omportamento do programa $o rodar e%te programaE -ocC -er( Sgra)a% ao TkT a ,ane#a top#e-e# automaticamente com o% Iidget% para minimizarE maFimizar e 9echar a ,ane#a. Tente u%(>#o% ! -ocC -er( &ue e#e% rea#mente 9uncionam. 8#icando no Iidget G9echarH So W em uma caiFaE do #ado direito da barra de t<tu#oT %er( gerado um e-ento de%truidor terminando o e-ent #oop principa#E &ue no ca%o de%te programa 6 mainloop. E de%de &ue n*o ha,a mai% nada depoi% da #inha Groot.mainloop!"HE como ne%te ca%oE o programa n*o 9az mai% nada e %e encerra.

from &kinter import - ###!*" root ; &k!" ###!2" root.mainloop!" ###!I"

TT0&0 'riando um ob(eto )*I e +a,endo pack- containeres ersus .idgets$


$gora daremo% uma pince#ada em outra da% &uatro &ue%t'e% b(%ica% da programa)*o GU" ! e%peci9icar como a GU" de-er( parecer. Ne%te programaE introduzimo% trC% do% maiore% conceito% da programa)*o em TkinterA

criar um ob,eto GU" e a%%oci(>#o com %eu% me%tre%N pack e container -er%u% Iidget.

De agora em dianteE di%tinguiremo% o% componente% entre containere% e um Iidget%. 8omo u%arei %empre e%te% termo%E um Iidget 6 um componente GU" &ue Sgera#menteT 6 -i%<-e# e 9az coi%a%. J( um container 6 %imp#e%mente um container ! uma ce%taE como &ueira ! dentro do &ua# di%p'em>%e o% Iidget%. Tkinter o9erece -(rio% tipo% de containere%. G8an-a%H 6 um container para ap#ica)'e% de de%enhoE e o container mai% 9re&Qentemente uti#izado 6 o G/rameH. /rame% %*o o9erecido% pe#o Tkinter como uma c#a%%e chamada G/rameH. Uma eFpre%%*o comoA
Jrame!meu:estre"

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

cria uma in%tncia da c#a%%e /rame Si%to 6E cria um 9rameTE e a%%ocia a in%tncia ao %eu me%treE meu:estre. 7utra maneira de -er i%%o 6 como uma eFpre%%*o &ue adiciona um 9rame Ge%cra-oH ao componente meu:estre. Ent*oE ne%te programa S#inha 2TE
my)ontainer* ; Jrame!my<arent"

cria um 9rame cu,o me%tre 6 my<arent Si%to 6E a raizTE e d( a e#e o nome de Gmy)ontainer*H. Re%umindoE e#e cria um container dentro do &ua# podemo% agora co#ocar Iidget%. SNM% n*o co#ocaremo% nenhum Iidget ne%te programaE %omente po%teriormenteT. Perceba &ue a re#a)*o me%treXe%cra-o a&ui 6 %omente #MgicaE n*o tem nada de -i%ua#. E%ta re#a)*o eFi%te para otimizar e-ento% do tipo de%truti-o ! i%%o por&ue &uando um componente me%tre Scomo rootT 6 de%tru<doE o me%tre %abe &uem %*o %eu% e%cra-o%E e pode de%tru<>#o% ante% de %e de%truir. S4T $ prMFima #inha de9ine o gerenciador de geometria GpackH para admini%trar my)ontainer*.
my)ontainer*.pack!"

imp#e%mente de%ignadoE GpackH 6 um m6todo &ue tran%9orma em -i%uai% a% re#a)'e% entre o% componente% GU" e %eu% me%tre%. e -ocC n*o de9inir o componente pack ou outro gerenciador de geometriaE nunca -er( a GU". Um gerenciador de geometria 6 e%%encia#mente um $P" ! um meio de dizer ao Tkinter como -ocC &uer &ue containere% e Iidget% %e apre%entem -i%ua#mente. Tkinter o9erece trC% gerenciadore% para e%ta 9ina#idadeA packE grid e p#ace. Pack e grid %*o o% mai% u%ado% por %erem mai% %imp#e%. Todo% o% eFemp#o% em GPen%ando em TkinterH u%am pack como gerenciador de geometria. 7 e%&uema padr*o b(%ico da programa)*o em TkinterE &ue -eremo% ainda di-er%a% -eze%E 9unciona mai% ou meno% a%%imA

uma in%tncia Sde um Iidget ou um containerT 6 criadaE e a%%ociada ao %eu me%treN a in%tncia 6 admini%trada por um gerenciador de geometria.

'omportamento do programa 3uando -ocC roda e%te programaE e#e %e parecer( muito com %eu antece%%orE eFceto pe#o tamanho. "%%o 6 por&ue...

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

6rames so elCsticos Um 9rame 6 ba%icamente um container. 7 interior de um container ! o Ge%pa)oH eFi%tente dentro de#e ! 6 chamado Gca-idadeHE um termo t6cnico &ue Tkinter herdou de Tk. E%%a ca-idade 6 eFten%<-e# Sou e#(%ticaT como uma borracha. $ meno% &ue -ocC e%peci9i&ue um tamanho m(Fimo ou m<nimo para o 9rameE a ca-idade %er( e%ticada ou comprimida at6 acomodar &ua#&uer coi%a &ue o 9rame conti-er. No programa anteriorE por n*o termo% co#ocado nada dentro de#aE a raiz mo%trou a %i me%ma na te#a com %eu tamanho padr*oE ma% ne%te programaE nM% preenchemo% %ua ca-idade com o my)ontainer*. $goraE a raiz %e e%tica para acomodar o tamanho de my)ontainer*E ma% como n*o co#ocamo% nenhum Iidget ne%te 9rameE nem e%peci9icamo% um tamanho m<nimo para e#eE a ca-idade da root %e enco#he at6 o #imite. Por i%%o n*o h( nada para %er -i%to abaiFo da barra de t<tu#o de%%e programa. No% prMFimo% programa%E co#ocaremo% Iidget% e outro% containere% dentro do 8ontainer2E e -ocC -er( como e#e %e arran,a para acomod(>#o%.
from &kinter import root ; &k!" my)ontainer* ; Jrame!root" my)ontainer*.pack!" root.mainloop!" ###!*" ###!2"

TT030 'riando um 0idget e colocando1o no +rame$


Ne%te programaE nM% criamo% no%%o primeiro Iidget e o co#ocamo% dentro de my)ontainer*. S2T 7 Kidget %er( um bot*o ! i%to 6E e#e %er( uma in%tncia da c#a%%e GJuttonH de Tkinter. $ #inhaA
'utton*;'utton!my)ontainer*"

cria o bot*oE dando>o o nome de Gbutton2HE e a%%ocia>o ao %eu me%treE o ob,eto container chamado my)ontainer*. S4TS=T 7% Iidget% tem muito% atributo%E todo% di%pon<-ei% no dicion(rio do namespace #oca#. 7 Iidget GJuttonH tem atributo% para contro#ar %eu tamanhoE %ua cor de 9undo e de 9onteE %eu teFtoE como %ua% borda% %e parecer*oE etc. Ne%te eFemp#oE nM% iremo% a,u%tar %omente doi%

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

atributo% de buttonA a cor de 9undo e o teFto. /aremo% i%%o mudando o% -a#ore% do %eu dicion(rio re9erente% V% cha-e% GteFtH e GbackgroundH.
button*KYte?tYL ; Y3ello= $orld% button*KYbackgroundYL ; YgreenY

S+T EE 6 c#aroE nM% 9azemo% pack no bot*o button(.


button*.pack!"

'omportamento do programa 3uando -ocC rodar e%te programaE de-er( -er &ue o 8ontainer2 agora cont6m um bot*o -erde com o teFto GOe##oE Kor#dLH. 3uando -ocC c#ica ne#e n*o acontece nadaE por&ue nM% ainda n*o e%peci9icamo% o &ue &ueremo% &ue aconte)a &uando o bot*o 9or c#icadoE %e bem &ue o 9aremo% mai% tarde. Por oraE -ocC de-er( c#icar no bot*o W da barra de t<tu#o para 9ech(>#oE como ante%.
from &kinter import root ; &k!" my)ontainer* ; Jrame!root" my)ontainer*.pack!" button* ; 'utton!my)ontainer*" button*K#te?t#L; #3ello= $orld%# button*K#background#L ; #green# button*.pack!" root.mainloop!" ### !*" ### !2" ### !I"

### !B"

TT033 *sando a estrutura de classes no programa$


Ne%te programaE introduziremo% o conceito de ap#ica)'e% de Tkinter e%truturada% como c#a%%e%. Ne#eE criamo% uma c#a%%e chamada My$pp e tran%cre-emo% a#gun% cMdigo% do% programa% anteriore% para dentro de %eu m6todo con%trutor S__init__T. Ne%ta -er%*o ree%truturada do programaE 9azemo% = coi%a% di9erente%A S2T Em no%%o cMdigoE de%ignamo% uma c#a%%e SMy$ppT &ue de9ine como &ueremo% &ue a GU" %e pare)a e &ue tipo de coi%a &ueremo% 9azer com i%%o. Todo e%te cMdigo 6 in%erido no m6todo con%trutor da c#a%%e. 2D

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

S4T 3uando o programa 6 eFecutadoE a primeira coi%a &ue e#e 9az 6 criar uma in%tncia da c#a%%e. $ #inha &ue cria a in%tncia 6
myapp;:y pp!root"

Perceba &ue o nome da c#a%%e 6 GMy$ppH Sob%er-e o ,ogo de mai5%cu#a%T e o nome da in%tncia 6 GmyappH Sagora tudo min5%cu#oT. Perceba tamb6m &ue e%%a #inha 9az de GrootHE a raizE um argumento dentro do m6todo con%trutor de My$pp. 7 m6todo con%trutor reconhece root %ob o nome Gmy<arentH. S=T /ina#menteE deiFamo% a raiz em main#oop. >or Bue estruturar sua aplicao como uma classeD Uma da% raz'e% para u%ar uma e%trutura de c#a%%e% em %eu programa 6 %imp#e%mente contro#(>#o me#hor. Um programa e%truturado em c#a%%e% 6 pro-a-e#mente ! e%pecia#mente %e %eu programa 9or muito grande ! muito mai% 9(ci# de %er entendido. Uma con%idera)*o muito importante 6 &ue e%truturar %ua ap#ica)*o como uma c#a%%e a,udar( -ocC a e-itar o u%o de -ari(-ei% g#obai%. E-entua#menteE con9orme %eu programa 9or cre%cendoE -ocC pro-a-e#mente ir( &uerer &ue a#gun% de %eu% e-ent hand#er con%igam comparti#har in9orma)'e% entre %i. Uma maneira 6 u%ar -ari(-ei% g#obai%E ma% 6 uma t6cnica muito ma)ante. Um caminho muito me#hor 6 u%ar in%tncia% Si%to 6E u%ar G%e#9.H na% -ari(-ei%TE e para i%%o -ocC preci%a e%truturar %ua ap#ica)*o como c#a%%e%. EFp#oraremo% e%%e tMpico em outro% programa% de%ta %6rie. Euando introdu,ir a estrutura de classes Temo% introduzido a no)*o de e%trutura de c#a%%e% para programa% de Tkinter #ogo cedo para podermo% eFp#ic(>#a e partir para outro% a%%unto%. Por6mE no andar da carruagemE -ocC poder( e%co#her proceder de outra 9orma. Em muito% ca%o%E um programa em Tkinter come)a com um %cript %imp#e%. Todo o cMdigo acontece numa 5nica #inhaE como no%%o% programa% anteriore%. Ent*oE con9orme a ap#ica)*o toma corpoE o programa cre%ceE de 9orma &ue em pouco tempo -ocC %e -er( en-o#-o por uma porrada de cMdigo. UocC pode come)ar a u%ar -ari(-ei% g#obai%... ta#-ez uma porrada de -ari(-ei% g#obai%. 7 programa come)a a 9icar di9<ci# de entender e editar. 3uando i%%o aconteceE 6 hora de -o#tar V prancheta e re9azer tudoE de%ta -ez u%ando c#a%%e%. Por outro #adoE %e -ocC %e %entir bem com c#a%%e%E e tem uma boa id6ia da 9orma 9ina# do %eu programaE comece e%truturando>o em c#a%%e% de%de o come)o. Por outro #ado S-o#tamo% a%%im ao #ado anterior1TE #ogo no come)o do proce%%o de de%en-o#-imento Scomo ob%er-ou Gerrit Mu##erT 9re&Qentemente -ocC ainda n*o %abe a 22

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

me#hor e%trutura de c#a%%e% a u%ar ! #ogo no come)oE -ocC %imp#e%mente n*o tem uma id6ia c#ara o %u9iciente do prob#ema e %o#u)*o. 8ome)ar a u%ar c#a%%e% cedo demai% no proce%%o pode gerar muita% e%trutura% de%nece%%(ria% &ue %M %er-em para bagun)ar o cMdigoE a#6m de gera#mente eFigir mai% con%erto%. Tudo depende do go%to pe%%oa# e da% circun%tncia%. /a)a o &ue parecer bem a -ocC. E ! n*o importa o &ue -ocC e%co#ha ! n*o %e a%%u%te com a% ree%trutura)'e% &uando %e tornarem nece%%(ria%. 'omportamento do programa 3uando -ocC rodar e%te programaE e#e ter( uma aparCncia eFatamente igua# V anterior. Nada 9unciona# 9oi mudado ! %omente como o cMdigo 9oi e%truturado. $gora e#e e%t( em 9orma de c#a%%e%.
from &kinter import class :y pp: ### !*" def __init__!self= my<arent": ### !*a" self.my)ontainer* ; Jrame!my<arent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*" self.button*K#te?t#L; #3ello= $orld%# self.button*K#background#L ; #green# self.button*.pack!" root ; &k!" myapp ; :y pp!root" root.mainloop!" ### !2" ### !I"

TT040 4lgumas +ormas di+erentes de de+inir um .idget$


S2T No programa anteriorE nM% criamo% um ob,eto JuttonE button2E e ent*o mudamo% %eu teFto e cor de 9undo mai% ou meno% a%%imA
self.button*K#te?t#L; #3ello= $orld%# self.button*K#background#L ; #green#

Ne%te programaE adicionamo% mai% trC% bot'e% ao 8ontainer2E u%ando m6todo% #igeiramente di9erente%. S4T Para o bot*o button4E o proce%%o 6 e%%encia#mente o me%mo &ue no bot*o button2E ma% em -ez de ace%%ar o dicion(rio de JuttonE u%amo% o m6todo Gcon9igureH atribu<do ao% ob,eto% Jutton.

GRUPO PYTHON UNESP ILHA SOLTEIRA

24

PENSANDO EM TKINTER

STEVEN FERG

S=T Para o bot*o button=E -emo% &ue o m6todo con9igure pode ter muito% argumento%E ent*o de%ignamo% -(ria% op)'e% em uma 5nica #inha. S+T No% eFemp#o% anteriore%E 9azer um bot*o era uma tare9a em doi% pa%%o%A primeiro criar o bot*o e ent*o con9igurar %ua% propriedade%. Tamb6m 6 po%%<-e# con9igurar e%ta% propriedade% ao me%mo tempo em &ue criamo% o bot*o. 7 Iidget GJuttonHE como &ua#&uer IidgetE e%pera como primeiro argumento o nome do %eu me%tre. Depoi% de%%e argumento -ocC podeE %e de%e,arE adicionar um ou mai% argumento% %obre a% propriedade% do Iidget. 'omportamento do programa 3uando -ocC rodar e%te programaE de-er( -er &ue o 8ontainer2 agora cont6mE ,unto com o antigo bot*o -erdeE mai% trC% bot'e%. Ue,a como my8ontainer2 So 9rameT %e e%tica para acomodar todo% e%te% bot'e%. Perceba tamb6m &ue e%%e% bot'e% %*o empi#hado% um %obre o outro. No prMFimo programaE -eremo% por &ue e#e% %e arran,am de%%a 9ormaE e -eremo% como arran,(>#o% de 9orma di9erente.
from &kinter import class :y pp: def __init__!self= parent": self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*" self.button*K#te?t#L ; #3ello= $orld%# ###!*" self.button*K#background#L ; #green# ###!*" self.button*.pack!" self.button2 ; 'utton!self.my)ontainer*" self.button2.configure!te?t;#Cff to Moin the circus%#" ###!2" self.button2.configure!background;#tan#" ###!2" self.button2.pack!" self.buttonI ; 'utton!self.my)ontainer*" self.buttonI.configure!te?t;#Noin meA#=background;#cyan#"#!I" self.buttonI.pack!" self.buttonB ; 'utton!self.my)ontainer*= te?t;#6oodbye%#= background;#red# " ###!B" self.buttonB.pack!" root ; &k!" myapp ; :y pp!root" root.mainloop!"

GRUPO PYTHON UNESP ILHA SOLTEIRA

2=

PENSANDO EM TKINTER

STEVEN FERG

TT030 >acking$
No 5#timo programaE nM% -imo% &uatro bot'e%E empi#hado% um %obre o outro. EntretantoE pro-a-e#mente go%tar<amo% de -C>#o% #ado a #ado em a#guma oca%i*o. Ne%te programa 9azemo% i%%oE e come)aremo% a -er a% po%%ibi#idade% &ue packST o9erece. S2T S4T S=T S+T /azer pack 6 um da% maneira% de contro#ar a re#a)*o -i%ua# entre o% componente% da GU". 7 &ue 9aremo% agora 6 u%ar a op)*o G%ideH como argumento de pack para co#ocar o% bot'e% #ado a #adoE de%%e ,eitoA
self.button*.pack!side;40J&"

Ue,a &ue LE/T Sa%%im como R"GOTE T7P e J7TT7MT %*o con%tante% de nome% bem amig(-ei% de9inida% em Tkinter. "%to 6E GLE/TH de-eria aparecer no cMdigo como GTkinter.LE/THE ma% por cau%a da no%%a maneira de importar o mMdu#o Tkinter Sp(gina :TE n*o preci%amo% mai% u%ar o pre9iFo GTkinter.H. >orBue os bot:es apareceram erticalmente no Fltimo programa 8omo -ocC %e #embraE no 5#timo programa nM% %imp#e%mente empacotamo% o% bot'e% %em e%peci9icar a op)*o G%ideHE e o% bot'e% 9icaram da&ue#a 9ormaE empi#hado%. "%%o aconteceu por&ue a op)*o pr6>de%ignada da op)*o G%ideH 6 T7P. Ent*oE &uando 9izemo% pack no bot*o button2E e#e 9oi co#ocado no topo da ca-idade do 9rame my8ontainer2. $o 9azer pack %em argumento% %obre o bot*o button4E e#e tamb6m 6 co#ocado no topo da ca-idade de%te 9rameE &ue ne%te ca%o 9ica eFatamente abaiFo do bot*o button2E e a%%im por diante. e nM% ti-6%%emo% 9eito pack no% bot'e% em ordem di9erente ! por eFemp#oE %e ti-6%%emo% 9eito pack em button4 primeiroE e depoi% em button2 ! %ua% po%i)'e% teriam %ido in-ertida%A o bot*o button4 e%taria em cima. Ent*oE como -ocC pode -erE uma da% maneira% de contro#ar como %ua GU" -ai %e parecer 6 contro#ando a ordem de 9azer pack em cada um do% Iidget% dentro do container. 4lguns termos t?cnicos GOrientaoH 7rienta)*o %ertical inc#ui o% #ado% T7P Sde cimaT e J7TT7M Sde baiFoT. 7rienta)*o ori#ontal inc#ui o% #ado% LE/T Se%&uerdoT e R"GOT SdireitoT. 3uando -ocC e%t( empacotando Iidget% e containere%E 6 po%%<-e# me%c#ar doi% tipo% de orienta)*o. Por eFemp#oE podemo% preci%ar po%icionar um bot*o com orienta)*o -ertica# Scomo T7PT e outro com orienta)*o horizonta# Scomo LE/TTE ma% 9azer i%%o mi%turando orienta)'e% dentro do container n*o 6 uma boa id6ia. e -ocC mi%turar orienta)'e% poder( pre,udicar a maneira como o% ob,eto% aparecer*o na te#aE a#6m da be#a %urpre%a &ue ter( %e preci%ar redimen%ionar a ,ane#a depoi%. 2+

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

Por e%te% moti-o% 6 uma boa pr(tica de pro,eto nunca mi%turar orienta)'e%E ma% %em -ocC preci%ar me%mo 9azer i%%oE 6 me#hor u%ar um container dentro do outro. EFp#oraremo% e%te tMpico no prMFimo programa. 'omportamento do programa 3uando -ocC rodar e%te programaE -er( &uatro bot'e% #ado a #ado.
from &kinter import class :y pp: def __init__!self= parent": self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*" self.button*K#te?t#L; #3ello= $orld%# self.button*K#background#L ; #green# self.button*.pack!side;40J&" ### !*" self.button2 ; 'utton!self.my)ontainer*" self.button2.configure!te?t;#Cff to Moin the circus%#" self.button2.configure!background;#tan#" self.button2.pack!side;40J&" ### !2" self.buttonI ; 'utton!self.my)ontainer*" self.buttonI.configure!te?t;#Noin meA#= background;#cyan#" self.buttonI.pack!side;40J&" ### !I" self.buttonB ; 'utton!self.my)ontainer*= te?t;#6oodbye%#= background;#red# " self.buttonB.pack!side;40J&" ### !B" root ; &k!" myapp ; :y pp!root" root.mainloop!"

TT0%0 7inding$
$gora 6 hora de co#ocar no%%o% bot'e% para traba#har. 8hamamo% %ua aten)*o para a% dua% 5#tima% Sda% &uatroT &ue%t'e% b(%ica% da programa)*o GU" ! e%cre-er procedimento% de a#imenta)*o de e-ento% para 9azer o% traba#ho% nece%%(rio% no %eu programaE e #igar e%te% procedimento% a Iidget% e e-ento%. Perceba &ue ne%te programa re,eitamo% todo% o% bot'e% &ue t<nhamo% criado no 5#timo programaE e retornamo% a uma GU" muito %imp#e% contendo doi% bot'e%A G7PH e G8$N8ELH. 2.

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

UocC de-e %e #embrar da di%cu%%*o de no%%o primeiro programaE de &ue uma da% &ue%t'e% b(%ica% da programa)*o GU" 6 o GbindingH. Jinding 6 o proce%%o de de9inir a coneF*o ou re#a)*o Sgera#menteT entreA

um IidgetN um tipo de e-ento e um a#imentador de e-ento%.

Um a#imentador de e-ento% 6 um m6todo ou %ub>rotina &ue a#imenta e-ento% &uando e#e% ocorrem. Ta#-ez a,ude dizer &ue em Ja-aE a#imentadore% de e-ento% %*o chamado% G#i%tener%H S-igi#ante%TE um nome bem %uge%ti-o con%iderando %ua 9un)*o ! e%tar atento ao% e-ento% e re%ponder a e#e%. Em TkinterE uma maneira de criar binding% 6 pe#o m6todo bindSTE da %eguinte 9ormaA
(idget.bind!nome_do_tipo_de_evento=nome_do_alimentador_de_eventos"

E%%e tipo de #iga)*o 6 chamado Ge-ent bindingH. O( outro ,eito de #igar um a#imentador de e-ento% a um IidgetE chamado Gcommand bindingH e nM% a -eremo% em a#gun% programa% da&ui pra 9rente. Por oraE -e,amo% me#hor o e-ent bindingE e tendo entendido e%teE %er( mo#eza eFp#icar o command binding. $nte% de come)armo%E -amo% e%c#arecer uma coi%aA a pa#a-ra Gbot*oH pode %er u%ada para de%ignar dua% coi%a% inteiramente di9erente%A

um IidgetE Jutton ! uma GU" &ue 6 mo%trada no monitor do computador e um bot*o no %eu mou%e ! a&ue#e &ue -ocC pre%%iona com o dedo.

Para e-itar con9u%*oE procuraremo% di%tingui>#o% como Go bot*oH e Go bot*o do mou%eHE em -ez de %imp#e%mente Gbot*oH. S2T NM% #igamo% o e-ento ZJutton>2[ Sum c#i&ue com o bot*o e%&uerdo do mou%eT %obre o bot*o button2 ao m6todo self.button*)lick. 3uando button2 6 c#icado com o bot*o e%&uerdo do mou%eE o m6todo self.button*)lick!" 6 chamado para a#imentar o e-ento. S=T Ue,a &ueE embora n*o tenhamo% e%peci9icado na opera)*o de bindingE self.button*)lick !" receber( doi% argumento%. 7 primeiroE 6 c#aroE %er( G%e#9HE primeiro argumento para &ua#&uer m6todo de c#a%%e% em Python. 7 %egundo %er( um ob,eto e-ento. E%ta t6cnica de binding e e-ento ! i%to 6E u%ando o m6todo bindST ! %empre imp#ica na uti#iza)*o de um ob,eto e-ento como argumento. Em PythonXTkinterE &uando um e-ento ocorreE toma 9orma de um ob,eto e-ento. Um ob,eto e-ento 6 eFtremamente 5ti# por&ue carrega con%igo uma co#e)*o de in9orma)'e% 5tei% e

GRUPO PYTHON UNESP ILHA SOLTEIRA

2:

PENSANDO EM TKINTER

STEVEN FERG

m6todo%. UocC pode eFaminar o ob,eto e-ento para encontrar &ue tipo de e-ento ocorreuE o Iidget onde ocorreuE e outra% in9orma)'e% 5tei%. S+T Ent*oE o &ue acontece &uando button2 6 c#icado1 JemE ne%te ca%o nM% o de%ignamo% para 9azer a#go bem %imp#e%A mudar %ua cor de -erde para amare#o e -ice>-er%a. S4T Uamo% 9azer o button4 So bot*o do GTchauLHT 9azer a#go mai% 5ti#A 9echar a ,ane#a. Para i%%o #igamo% o e-ento de c#icar com bot*o e%&uerdo do mou%e %obre o button4 ao m6todo button2)lick!" e S:T /azemo% o m6todo button2)lick!" de%truir a ,ane#a raizE a me%tra de myapp. "%%o -ai ter um e9eito bem de-a%tadorE por&ue todo% o% e%cra-o% tamb6m %er*o de%tru<do%. Na -erdadeE toda a GU" %er( de%tru<da. \ c#aro &ue para i%%oE myapp tem &ue %aber &uem 6 %ua me%tra Sa&uiE a ,ane#a raizT. Ent*o adicionamo% um cMdigo S;T ao con%trutor da c#a%%e para #embr(>#a di%%o. 'omportamento do programa 3uando -ocC roda e%te programaE -C doi% bot'e%. 8#icar no bot*o G7PH o 9az mudar de cor. 8#icar no bot*o G8ance#H 9echa a ap#ica)*o. 3uando a GU" 6 abertaE %e -ocC apertar T$JE -er( &ue o 9oco do tec#ado -ai 9icar pu#ando entre o% doi% bot'e%E embora apertar ENTER no tec#ado n*o 9a)a nada. "%%o 6 por&ue temo% #igado %omente c#i&ue% de mou%e ao% no%%o% bot'e%E n*o e-ento% de tec#ado. 7% prMFimo% tMpico% 9a#ar*o de%te a%%unto. /ina#menteE ob%er-amo% &ue o% bot'e% tCm tamanho% di9erente% por&ue o% teFto% &ue contCm tCm tamanho% di9erente%. M por cau%a di%%o. N*o 9ica muito e#egante a%%imE por i%%o con%ertaremo% e%%e Gprob#emaH no prMFimo programa.
from &kinter import class :y pp: def __init__!self= parent": self.my<arent ; parent ### !O" lembra seu mestre= a raiz self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*" self.button*.configure!te?t;#CP#= background; #green#" self.button*.pack!side;40J&" self.button*.bind!#Q'uttonH*R#= self.button*)lick" ### !*" self.button2 ; 'utton!self.my)ontainer*" self.button2.configure!te?t;#)ancel#= background;#red#"

GRUPO PYTHON UNESP ILHA SOLTEIRA

2;

PENSANDO EM TKINTER

STEVEN FERG

self.button2.pack!side;1763&" self.button2.bind!#Q'uttonH*R#= self.button2)lick" ### !2" def button*)lick!self= eFent": ### !I" if self.button*K#background#L ;; #green#: ### !B" self.button*K#background#L ; #yello(# else: self.button*K#background#L ; #green# def button2)lick!self= eFent": self.my<arent.destroy!" root ; &k!" myapp ; :y pp!root" root.mainloop!" ### !S" ### !T"

TT0/0 8e9endo com +oco e ligando e entos de teclado a .idgets$


No programa anteriorE -ocC p]de 9azer bot'e% 9azerem a#guma coi%a c#icando ne#e% com o mou%eE ma% n*o p]de 9azC>#o% traba#har pre%%ionando tec#a% no tec#ado. Ne%te programaE -eremo% como 9azC>#o% reagir a e-ento% de tec#ado como reagiram ao% de mou%e. PrimeiramenteE preci%amo% de9inir o &ue -em a %er G9ocoH. e -ocC tem a#guma intimidade com a mito#ogia grega Sou %e -ocC -iu GO6rcu#e%HE a&ue#e 9i#me da Di%neyTE %e #embrar( da% /ate%. $% /ate% eram trC% -e#ha% &ue contro#a-am o de%tino do% homen%. 8ada humano -i-o era uma #inha em %ua% m*o%E e &uando uma de#a% corta-a a #inhaE a -ida do humano termina-a.

As Fates

Um 9ato not(-e# %obre a% /ate% era &ue ha-ia %omente um o#ho para a% trC%. $ &ue e%ta-a com o o#ho tinha &ue dizer para a% outra% dua% tudo o &ue e%ta-a -endo. 7 o#ho poderia 2B

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

pa%%ar de uma /ate a outraE a%%im e#a% podiam %e re-ezar entre -er ou n*o. \ c#aroE %e -ocC con%egui%%e roubar e%%e o#hoE teria a#go -a#io%<%%imo para barganhar o &ue &ui%e%%e com e#a%. G/ocoH 6 o &ue permite ao% Iidget% da %ua GU" -er o% e-ento% de tec#ado. 7 9oco e%t( para o% Iidget% da %ua GU" como o o#ho e%ta-a para a% /ate%. omente um Iidget por -ez pode ter o 9ocoE e o Iidget &ue o tem 6 o &ue -CE e re%ponde aE o% e-ento% de tec#ado. Ne%te programaE por eFemp#oE no%%a GU" tem doi% bot'e%E G7PH e G8ance#H. upondo &ue eu pre%%ione o bot*o ENTER no tec#adoE %er( &ue e#e %er( -i%to pe#o bot*o G7PH indicando &ue o u%u(rio e%t( con9irmando %ua e%co#ha1 7u %er( &ue o ato de pre%%ionar e%ta tec#a %er( -i%to pe#o bot*o G8ance#HE indicando &ue o u%u(rio e%t( cance#ando Se de%truindoT a ap#ica)*o1 Tudo i%%o depende de onde e%t( o 9oco. "%to 6E depende de &ue bot*o Gtem 9ocoH. 8omo a% /ate%E &ue pa%%a-am %eu o#ho de uma a outraE o 9oco pode %er pa%%ado de um Iidget na GU" para outro. O( -(ria% 9orma% de 9azer i%%o. Uma de#a% 6 c#icando no Iidget com o bot*o e%&uerdo do mou%e Se%%e modo 9unciona em KindoI% e Macinto%hE em Tk e Tkinter. O( a#gun% %i%tema% &ue u%am a con-en)*o G9oco %egue o mou%eHE em &ue o Iidget &ue e%t( %ob o mou%e tem 9oco automaticamente ! n*o 6 nece%%(rio c#icarT 7utra maneira de mudar o 9oto 6 u%ando o 9ato de &ue o% Iidget% %*o adicionado% a uma #i%ta con9orme %*o criado%. Pre%%ionando a tec#a T$JE o 9oco %e mo-e do Iidget atua# para o prMFimo da #i%ta. 7 Iidget %eguinte ao 5#timo 6 o primeiro. Pre%%ionando O"/T^T$JE o 9oco %e mo-e para o item anterior da #i%ta. 3uando um bot*o GU" tem 9ocoE i%%o 6 indicado por uma caiFinha de ponto% em torno do teFto do bot*o. Para -er i%%oE rode o programa anterior. 3uando o programa come)aE nenhum do% bot'e% tem 9ocoE por i%%o nenhum de#e% tem a caiFa de ponto%. Pre%%ione T$J e -ocC -er( e%%a caiFa em torno do teFto do bot*o e%&uerdoE mo%trando &ue o 9oco e%t( %obre e#e. $gora pre%%ione -(ria% -eze% T$J e ob%er-e o 9oco pu#ar de um bot*o a outro repetidamente. SDT Ne%te programaE &ueremo% &ue o bot*o 7P tenha 9oco de%de o come)o. Para i%%o u%amo% o m6todo focus_force!"E &ue 9or)a o 9oco a come)ar no bot*o 7P. 3uando -ocC roda o programaE -er( a caiFa de ponto% %obre o bot*o 7P de%de &ue a ap#ica)*o %e abrir. No 5#timo programaE no%%o% bot'e% re%pondiam ao e-ento de tec#ado Gpre%%ionar a tec#a T$JHE &ue mo-ia o 9oco entre o% bot'e%E ma% ao pre%%ionar ENTERE nada acontecia. "%%o por&ue %M 9oram #igado% c#i&ue% de mou%eE n*o e-ento% de tec#adoE ao% bot'e%. Ne%te programa nM% iremo% #igar tamb6m a#gun% e-ento% de tec#ado ao% bot'e%.

GRUPO PYTHON UNESP ILHA SOLTEIRA

20

PENSANDO EM TKINTER

STEVEN FERG

S2TS4T $% #inha% para #igar e-ento% de tec#ado ao% bot'e% %*o bem %imp#e% ! e#a% tCm o me%mo 9ormato &ue a&ue#a% &ue #igam e-ento% de mou%e. $ 5nica di9eren)a 6 &ue o nome do e-ento agora 6 o nome de um e-ento de tec#ado Sne%te ca%oE ZReturn4[T . 3uando &ueremo% &ue a tec#a ENTER ou um c#i&ue no bot*o e%&uerdo do mou%e tenham o me%mo e9eito no IidgetE #igamo% o me%mo a#imentador de e-ento% a ambo% e-ento%. E%te programa mo%tra &ue -ocC pode #igar -(rio% tipo% de e-ento% a um 5nico Iidget Scomo um bot*oTE ou me%mo #igar -(ria% combina)'e% de Iidget% a um me%mo a#imentador de e-ento%. S=TS+T $gora &ue no%%o% bot'e% re%pondem a -(rio% tipo% de e-ento%E podemo% demon%trar como receber in9orma)'e% de um ob,eto e-ento. 7 &ue -amo% 9azer 6 pa%%ar o ob,eto e-ento para S.T a rotina report_eFent &ue ir( S:T imprimir uma in9orma)*o %obre o e-entoE obtida a partir do% atributo% do e-ento. Perceba &ue para -ermo% e%ta% in9orma)'e% impre%%a% na te#aE 6 nece%%(rio rodar o programa u%ando python Snunca pythonI ! como "DLET. 'omportamento do programa 3uando -ocC roda o programaE -C doi% bot'e%. 8#icando no bot*o da e%&uerdaE ou pre%%ionando ENTER &uando o 9oco e%ti-er ne%te bot*oE a %ua cor %er( mudada. 8#icando no bot*o direitoE ou pre%%ionando ENTER &uando o 9oco e%ti-er ne%te bot*oE a ap#ica)*o %er( 9echada. Para &ua#&uer um de%%e% e-ento% de mou%e ou tec#adoE -ocC de-er( -er uma men%agem impre%%a na te#a in9ormando a hora e de%cre-endo o e-ento.
from &kinter import class :y pp: def __init__!self= parent": self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*" self.button*.configure!te?t;#CP#= background; #green#" self.button*.pack!side;40J&" self.button*.focus_force!" ### !." self.button*.bind!#Q1eturnR#= self.button*)lick" self.button*.bind!#Q1eturnR#= self.button*)lick" ### !*" self.button2 ; 'utton!self.my)ontainer*" self.button2.configure!te?t;#)ancel#= background;#red#" self.button2.pack!side;1763&" self.button2.bind!#Q1eturnR#= self.button2)lick"
4

7% americano% chamam a tec#a ENTER de RETURNE da< o e-ento de tec#ado Gpre%%ionar ENTERH receber a %intaFe ZReturn[. SNota do TradutorT

GRUPO PYTHON UNESP ILHA SOLTEIRA

4D

PENSANDO EM TKINTER

STEVEN FERG

self.button2.bind!#Q1eturnR#= self.button2)lick" def button*)lick!self= eFent": report_eFent!eFent" ### !I" if self.button*K#background#L ;; #green#: self.button*K#background#L ; #yello(# else: self.button*K#background#L ; #green# def button2)lick!self= eFent": report_eFent!eFent" ### !B" self.my<arent.destroy!"

### !2"

def report_eFent!eFent": ### !S" ###7mprime a descriEo de um eFento= baseado em seus atributos. ### eFent_name ; U#2#: #Pey<ress#= #B#: #'utton<ress#V print #&ime:#= str!eFent.time" ### !T" print #0Fent&ype;# W str!eFent.type"= , eFent_nameKstr!eFent.type"L=, #0Fent$idget7d;# W str!eFent.(idget"= , #0FentPey9ymbol;# W str!eFent.keysym" root ; &k!" myapp ; :y pp!root" root.mainloop!"

TT0/4 'ommand 7inding$


O( a#gun% programa% atr(%E introduzimo% o conceito de Ge-ent bindingH. O( outro ,eito de #igar um a#imentador de e-ento% a um Iidget chamado Gcommand bindingH. /a#aremo% %obre i%%o ne%te programa. 'ommand 7inding UocC de-e %e #embrar &ue no% no%%o% programa% anteriore%E nM% #igamo% o e-ento de mou%e ZJutton>2[ ao Iidget bot*o. GJuttonH 6 outro nome para um e-ento de mou%e GJuttonPre%%HE &ue 6 di9erente do e-ento de mou%e GJuttonRe#ea%eH=. 7 e-ento GJuttonPre%%H 6 o ato de pre%%ionar o bot*o do mou%eE ma% %em %o#t(>#oE e GJuttonRe#ea%eH e o ato de %o#tar o bot*oE deiFando>o retornar V %ua po%i)*o inicia#. Temo% &ue di%tinguir JuttonPre%% de JuttonRe#ea%e para podermo% eFp#icar manipu#a)'e% como Garra%tar e %o#tarHE na% &uai% 9azemo% um JuttonPre%% Spre%%ionamo% o bot*o do mou%e %em %o#tarT %obre um IidgetE o arra%tamo% para a#gum #ugarE e ent*o o %o#tamo% SJuttonRe#ea%eT. 7% Iidget% JuttonE no entantoE n*o podem %er Garra%tado% e %o#to%H. e um u%u(rio &ui%er arra%tar e %o#tar um bot*oE e#e preci%ar( eFecutar um JuttonPre%% %obre o bot*o e arra%t(>#o com o ponteiro do mou%e para um #ugar &ua#&uer na te#aE e ent*o %o#tar o bot*o. "%%o n*o 6
=

Re#ea%e _ LiberarE %o#tar SN do TT.

GRUPO PYTHON UNESP ILHA SOLTEIRA

42

PENSANDO EM TKINTER

STEVEN FERG

um tipo de ati-idade &ue nM% chamamo% de Gpre%%ionarH Sou ! em termo% t6cnico% ! Gin-ocarHT um Iidget Jutton. M 6 con%iderada uma Gin-oca)*oH do bot*o &uando o u%u(rio 9az um JuttonPre%% no IidgetE %em arra%t(>#oE e eFecuta imediatamente JuttonRe#ea%e. E%ta 6 uma no)*o mai% comp#icada de in-oca)*o de bot'e% do &ue nM% temo% u%ado at6 agoraE onde %imp#e%mente #igamo% o e-ento GJutton>2H ao Iidget bot*o u%ando e-ent binding. Por %orteE h( outra 9orma de 9azer binding &ue %uporta e%%a no)*o mai% comp#icada de in-oca)*o de Iidget%. \ o Gcommand bindingH. Ne%te programaE -e,a a% #inha% com coment(rio% S2T e S4T para -er como o command binding 6 9eito. Ne%ta% #inha%E u%amo% a op)*o GcommandH para #igar o button2 ao a#imentador de e-ento% self.button*)lickE e para #igar o button4 ao a#imentador de e-ento% self.button2)lick. S=TS+T DC uma o#hada em como o% a#imentadore% de e-ento% %e de9inem. Ue,a &ue ! di9erente do% a#imentadore% do% programa% anteriore% ! e#e% n*o e%peram por um ob,eto e-ento como argumento. "%%o por&ue o command bindingE di9erente do e-ent bindingE n*o 9az automaticamente a pa%%agem do ob,eto e-ento como um argumento. "%%o 9az %entido por&ue o command binding n*o #iga um 5nico e-ento a um a#imentadorE e %im m5#tip#o% e-ento%. Para um bot*oE por eFemp#oE e#e #iga o JuttonPre%% %eguido de um JuttonRe#ea%e a um a#imentador. Daremo% uma o#hada um pouco me#hor na% di9eren)a% entre e-ent binding e command binding no prMFimo programaE ma% por oraE rodemo% o programa. 'omportamento do programa 3uando -ocC roda o programaE o bot*o &ue aparece 6 eFatamente igua# ao do% programa% anteriore%... %M na aparCncia. Para comparar %eu comportamento com o% bot'e% anteriore%E #e-e o ponteiro do mou%e at6 o bot*o e%&uerdo e c#i&ueE mas n)o solte o bot)o do mouse. e 9o%%e 9eito i%%o no programa anteriorE imediatamente o bot*o mudaria de cor e a men%agem %eria impre%%a. Ne%teE nada acontece... at6 &ue o bot*o do mou%e %e,a %o#to. $< %imE o bot*o muda de cor e a men%agem 6 impre%%a. O( tamb6m outra di9eren)a. 8ompare %eu comportamento &uando -ocC pre%%iona a barra de e%pa)o e ENTER. Por eFemp#oE u%e T$J para 9ocar o bot*o 7P e pre%%ione e%pa)o ou ENTER. No programa anterior Sonde #igamo% o bot*o 7P ao e-ento de pre%%ionar ENTERTE pre%%ionar a barra de e%pa)o n*o tinha e9eitoE ma% pre%%ionar ENTER 9azia o bot*o mudar 44

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

de cor. Ne%te programaE por outro #adoE o comportamento 6 eFatamente o opo%to ! pre%%ionando a barra de e%pa)o% 9az o bot*o mudar de corE en&uanto ENTER n*o tem e9eito a#gum. Uamo% -eri9icar me#hor e%te% comportamento% no no%%o prMFimo programa.
from &kinter import class :y pp: def __init__!self= parent": self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*= command;self.button*)lick " ### !*" self.button*.configure!te?t;#CP#= background; #green#" self.button*.pack!side;40J&" self.button*.focus_force!" self.button2 ; 'utton!self.my)ontainer*= command;self.button2)lick " ### !2" self.button2.configure!te?t;#)ancel#= background;#red#" self.button2.pack!side;1763&" def button*)lick!self": ### !I" print #button*)lick eFent handler# if self.button*K#background#L ;; #green#: self.button*K#background#L ; #yello(# else: self.button*K#background#L ; #green# def button2)lick!self": ### !B" print #button2)lick eFent handler# self.my<arent.destroy!" root ; &k!" myapp ; :y pp!root" root.mainloop!"

TT0/3 *sando e ent binding e command binding (untos$


No programa anteriorE introduzimo% o conceito de command binding e de#imitamo% a#guma% da% di9eren)a% com e-ent binding. Ne%teE eFp#oraremo% %ua% di9eren)a% um pouco mai% deta#hadamente. >ara Buais e entos ser e command bindD No programa anteriorE %e -ocC u%ar T$J para 9ocar o bot*o 7P e pre%%ionar a barra de e%pa)oE o bot*o mudar( de corE ma% pre%%ionar ENTER n*o tem e9eito a#gum.

GRUPO PYTHON UNESP ILHA SOLTEIRA

4=

PENSANDO EM TKINTER

STEVEN FERG

$ raz*o para i%to 6 &ue a op)*o GcommandH d( a um Iidget Jutton di%tin)*o %obre e-ento% de tec#adoE a%%im como e-ento% de mou%e. Ne%te ca%oE o e-ento de tec#ado aguardado pe#o bot*o 6 o acionamento da barra de e%pa)oE n*o da tec#a ENTER. "%%o &uer dizer &ueE com command bindingE pre%%ionar a barra de e%pa)o% 9az o bot*o 7P mudar de corE en&uanto ENTER n*o tem e9eito. E%te comportamento parece Sao meno% para mimE u%u(rio KindoI%T incomum. Parte da mora# da hi%tMria a&ui 6 &ue %e -ocC e%t( 9azendo u%o de command bindingE 6 uma boa id6ia entender eFatamente o &ue -ocC &uer &ue %eu binding 9a)a. "%to 6E 6 uma boa id6ia entender eFatamente &ue e-ento% de mou%e eXou tec#ado de-er*o cau%ar o% comando% de%e,ado%. "n9e#izmenteE a 5nica 9onte con9i(-e# de%%a in9orma)*o 6 o cMdigo Tk em %i. Para in9orma)'e% mai% ace%%<-ei%E dC uma o#hada no% #i-ro% %obre Tk SGPractica# Programming in Tc# and TkHE de Jrent Ke#chE 6 e%pecia#mente bomT ou %obre Tkinter. $ documenta)*o %obre Tk 6 di9u%aE ma% di%pon<-e# on>#ine. UocC de-e tamb6m %aber &ue nem todo% o% Iidget% o9erecem a op)*o GcommandH. Muito% do% Iidget% Jutton o 9azem SRadioJuttonE 8heckJuttonE etc.T e outro% o9erecem op)'e% %imi#are% Spor eFemp#oE %cro##commandTE ma% -ocC rea#mente de-e in-e%tigar cada um do% di9erente% tipo% de Iidget% para %aber %e %uportam ou n*o command binding. "%%o dar( um contro#e maior %obre o comportamento da %ua GU" e tornar( mai% 9(ci# %ua -ida de programador. *sando 5 ent 7inding e 'ommand 7inding (untos$ Percebemo% no 5#timo programa &ue command bindingE di9erente de e-ent bindingE n*o 9az automaticamente a pa%%agem e-ento ob,eto ! argumento. "%%o pode tornar %ua -ida um pouco comp#icada %e -ocC de%e,a #igar um a#imentador de e-ento% a um Iidget u%ando %imu#taneamente e-ent binding e command binding. Por eFemp#oE ne%te programa rea#mente de%e,aremo% &ue no%%o% bot'e% re%pondam t*o bem V ati-a)*o da tec#a ENTER &uando da barra de e%pa)o%. Para i%%oE teremo% &ue u%ar e-ent binding para o e-ento de tec#ado ZReturn[E como 9oi 9eito no 5#timo programa S2T. 7 prob#ema 6 &ue o command binding n*o tran%9ormar( um ob,eto e-ento num argumentoE ma% o e-ent binding %im. Ent*o como de-eremo% e%cre-er no%%o a#imentador de e-ento%1 O( a#guma% %o#u)'e% para e%te prob#emaE ma% a mai% %imp#e% 6 e%cre-er dois a#imentadore% de e-ento%. 7 a#imentador Grea#H S4T %er( o 5nico u%ado pe#o command bindingE &ue n*o e%perar( por um ob,eto e-ento. 7 outro a#imentador S=T -ai %er %M um Irapper do rea#. E%te Irapper e%perar( o argumento do ob,eto e-entoE ma% o ignorar( e chamar( o a#imentador rea#. Daremo% ao Irapper o me%mo nome do a#imentador rea#E por6m adicionando o %u9iFo G@aH.

GRUPO PYTHON UNESP ILHA SOLTEIRA

4+

PENSANDO EM TKINTER

STEVEN FERG

'omportamento do programa e -ocC rodar e%te programaE o comportamento %er( o me%mo do programa anteriorE eFceto pe#o 9ato de &ue agora o% bot'e% ir*o re%ponder tanto ao ENTER &uando V barra de e%pa)o%.
from &kinter import class :y pp: def __init__!self= parent": self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.button* ; 'utton!self.my)ontainer*= command;self.button*)lick " self.button*.bind!#Q1eturnR#= self.button*)lick_a" ### !*" self.button*.configure!te?t;#CP#= background; #green#" self.button*.pack!side;40J&" self.button*.focus_force!" self.button2 ; 'utton!self.my)ontainer*= command;self.button2)lick " self.button2.bind!#Q1eturnR#= self.button2)lick_a" ### !*" self.button2.configure!te?t;#)ancel#= background;#red#" self.button2.pack!side;1763&" def button*)lick!self": ### !2" print #button*)lick eFent handler# if self.button*K#background#L ;; #green#: self.button*K#background#L ; #yello(# else: self.button*K#background#L ; #green# def button2)lick!self": ### !2" print #button2)lick eFent handler# self.my<arent.destroy!" def button*)lick_a!self= eFent": ### !I" print #button*)lick_a eFent handler !a (rapper"# self.button*)lick!" def button2)lick_a!self= eFent": ### !I" print #button2)lick_a eFent handler !a (rapper"# self.button2)lick!" root ; &k!" myapp ; :y pp!root" root.mainloop!"

TT0/% 'ompartil#ando in+orma:es entre alimentadores de e entos$


No% 5#timo% programa%E eFp#oramo% maneira% de 9azer no%%o% programa% rea#mente traba#har com a#imentadore% de e-ento%. $gora daremo% uma o#hadinha em como comparti#har in9orma)'e% entre e%te% a#imentadore%.
GRUPO PYTHON UNESP ILHA SOLTEIRA

4.

PENSANDO EM TKINTER

STEVEN FERG

'ompartil#ando in+orma:es entre +un:es alimentadoras de e entos$ O( uma -ariedade de %itua)'e% na% &uai% -ocC pode &uerer &ue um a#imentador de e-ento% rea#ize a#guma tare9a e di-ida o% re%u#tado% de%ta tare9a com outro% a#imentadore% em %eu programa. Um eFemp#o comum 6 &uando -ocC tem uma ap#ica)*o com doi% grupo% de Iidget%. Um de#e% %e#eciona a#guma parte da in9orma)*oE e ent*o o outro 9az a#guma coi%a com e%ta in9orma)*o. Por eFemp#oE ta#-ez -ocC &ueira ter um Iidget &ue permita a um u%u(rio e%co#her um nome de ar&ui-o de uma #i%taE e outro con,unto de Iidget% &ue o9ere)a -(ria% opera)'e% %obre o ar&ui-o e%co#hido ! abrirE de#etarE copiarE renomearE etc. 7u -ocC pode ter uma %6rie de Iidget% &ue modi9i&ue -(ria% con9igura)'e% da %ua ap#ica)*oE e outra %6rie de Iidget% So9erecendo op)'e% de $LU$R e 8$N8EL$RE ta#-ezT &ue %a#-e em di%co e%ta% modi9ica)'e% de con9igura)*o ou a% cance#e %em %a#-ar. 3uem %abe ainda um con,unto de Iidget% &ue mudem a#gun% parmetro% de um programa &ue -ocC de%e,e rodarE en&uanto outro Iidget Spro-a-e#mente um bot*o com um nome R7D$R ou EWE8UT$RT &ue rode o programa con%iderando o% parmetro% &ue -ocC e%co#heu. UocC pode preci%ar tamb6m re&uerer de uma 9un)*o a#imentadora de e-ento% o reconhecimento de a#guma in9orma)*o de uma eFecu)*o anterior da me%ma 9un)*o. 8on%idere um a#imentador &ue %imp#e%mente a#terna uma -ari(-e# entre doi% di9erente% -a#ore%. Para &ue e#a a%%imi#e um no-o -a#or da -ari(-e#E ter( &ue %aber &ua# -a#or atribuiu V -ari(-e# da 5#tima -ez &ue rodou. O problema 7 prob#ema a&ui 6 &ue cada um do% a#imentadore% 6 uma 9un)*o %eparada. 8ada um de#e% tem %ua% prMpria% -ari(-ei% #ocai% &ue n*o 9azem parte da% outra% 9un)'e% a#imentadora%E nem me%mo de in-oca)'e% anteriore% de#a% me%ma%. Ei% o prob#emaA como pode uma 9un)*o a#imentadora de e-ento% parti#har dado% com outro% a#imentadore%E %e e#a n*o pode parti#har %ua% -ari(-ei% #ocai% com e#e%1 $ %o#u)*oE 6 c#aroE 6 &ue a% -ari(-ei% &ue preci%amo% comparti#har n*o %e,am #ocai% V% 9un)'e% a#imentadora% de e-ento%. E#a% preci%am %er armazenada% G9oraH de%ta% 9un)'e%. >rimeira soluo usar ariC eis globais Uma t6cnica para con%eguir i%to 6 9azer de#a% Sa% -ari(-ei% &ue &ueremo% comparti#harT -ari(-ei% g#obai%. Por eFemp#oE em cada a#imentador &ue preci%e modi9icar ou -er minha/ariaFel* e minha/ariaFel2E -ocC pode e%cre-er o %eguinteA
global minha/ariaFel*= minha/ariaFel2

GRUPO PYTHON UNESP ILHA SOLTEIRA

4:

PENSANDO EM TKINTER

STEVEN FERG

CuidadoA o u%o de -ari(-ei% g#obai% 6 potencia#mente perigo%o por cau%a de con9#ito%E e gera#mente re%er-ado para programa% pe&ueno%. Segunda soluo usar ariC eis instanciadas Uma boa t6cnica 6 u%ar -ari(-ei% in%tanciada% Si%to 6E Gself.nome_da_FariaFelHT para trocar in9orma)'e% &ue -ocC &uer comparti#har entre o% a#imentadore% de e-ento%. Para 9azer i%%oE 6 c#aroE %ua ap#ica)*o de-er( %er imp#ementada em uma c#a%%eE e n*o num %imp#e% cMdigo e%truturado. E%te 6 uma da% raz'e% pe#a% &uai% nM% de%en-o#-emo% a% ap#ica)'e% de%te tutoria# em 9orma de c#a%%e%. \ por termo% come)ado ne%te 9ormato #ogo de in<cio &ue ne%te ponto no%%a ap#ica)*o ,( temo% uma in9ra>e%trutura &ue no% permitir( u%ar -ari(-ei% in%tanciada%. Ne%te programaE iremo% comparti#har uma in9orma)*o bem %imp#e%A o nome do 5#timo bot*o pre%%ionado. $rmazenaremo% e%ta in9orma)*o numa -ari(-e# in%tanciada chamada Gself.my4ast'utton7nFokedH S-e,a o coment(rio ``` 2T. Para mo%trar &ue rea#mente e%tamo% #embrando de%ta in9orma)*oE toda -ez &ue o a#imentador do bot*o 9or %o#icitadoE e#a %er( impre%%a S-e,a o coment(rio ``` 4T. 'omportamento do programa E%te programa mo%tra trC% bot'e%. 3uando -ocC co#oc(>#o para rodarE %e -ocC c#icar em &ua#&uer um do% bot'e%E %er( mo%trado %eu prMprio nomeE e o nome do bot*o &ue 9oi c#icado anteriormente. Perceba &ue nenhum do% bot'e% 9echar( a ap#ica)*oE ent*o %e -ocC de%e,ar 9ech(>#aE de-er( c#icar no Iidget /E8O$R So <cone com um GWH em uma caiFaE do #ado direito da barra de t<tu#oT.
from &kinter import class :y pp: def __init__!self= parent": ### * inda no solicitamos o alimentador do boto

self.my4ast'utton7nFoked ; 5one self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" self.yello('utton;'utton!self.my)ontainer*= command;self.yello('utton)lick " self.yello('utton.configure!te?t;#2044C$#= background;#yello(# " self.yello('utton.pack!side;40J&"

GRUPO PYTHON UNESP ILHA SOLTEIRA

4;

PENSANDO EM TKINTER

STEVEN FERG

self.red'utton;'utton!self.my)ontainer*= command;self.red'utton)lick " self.red'utton.configure!te?t;#10D#= background;#red#" self.red'utton.pack!side;40J&" self.(hite'utton;'utton!self.my)ontainer*= command;self.(hite'utton)lick " self.(hite'utton.configure!te?t;#$37&0#=background;#(hite#" self.(hite'utton.pack!side;40J&" def red'utton)lick!self": print #10D button clicked. <reFious button inFoked (as#= self.my4ast'utton7nFoked ### 2 self.my4ast'utton7nFoked ; #10D# ### * def yello('utton)lick!self": print #2044C$ button clicked. <reFious button inFoked (as#= self.my4ast'utton7nFoked ### 2 self.my4ast'utton7nFoked ; #2044C$# ### * def (hite'utton)lick!self": print #$37&0 button clicked. <reFious button inFoked (as#= self.my4ast'utton7nFoked ### 2 self.my4ast'utton7nFoked ; #$37&0# ### * print #,n#-*.. # um Meito simples de limpar a tela print #9tarting...# root ; &k!" myapp ; :y pp!root" root.mainloop!" print #... Done%#

TT0// Transmitindo argumentos para alimentadores de e entos I O problema


Ne%te programa eFp#oraremo% um poucoa 'aractersticas mais a anadas de command binding No programa ttD;..pyE u%amo% a op)*o GcommandH para #igar um a#imentador de e-ento% a um Iidget. Por eFemp#oE ne%te programa a #inha
self.button* ; 'utton!self.my)ontainer*= command;self.button*)lick"

#igou a 9un)*o button28#ick ao Iidget button2. Tamb6m u%amo% e-ent binding para #igar no%%o% bot'e% ao e-ento de tec#ado ZReturn[.
self.button*.bind!#Q1eturnR#= self.button*)lick_a"

GRUPO PYTHON UNESP ILHA SOLTEIRA

4B

PENSANDO EM TKINTER

STEVEN FERG

Em um do% 5#timo% programa%E o% a#imentadore% de e-ento% para o% doi% bot'e% rea#izaram dua% 9un)'e% di9erente%. Ma% %uponha &ue a %itua)*o %e,a di9erente. uponha &ue temo% di-er%o% bot'e%E todo% e#e% de%en-o#-endo e%%encia#mente o me%mo tipo de a)*o. $ me#hor maneira de a#imentar e%te tipo de %itua)*o 6 #igar o% e-ento% de todo% o% bot'e% a um 5nico a#imentador de e-ento%. 8ada um do% bot'e% de-er( in-ocar a me%ma rotina a#imentadoraE ma% 9ornecendo a e#a di9erente% argumento% contando o &ue 9azer. \ i%%o &ue 9azemo% ne%te programa. 'ommand binding Ne%te programaE como -ocC pode -erE temo% doi% bot'e%E e u%amo% a op)*o GcommandH para #ig(>#o% todo% ao me%mo a#imentador de e-ento% ! a rotina GbuttonOand#erH. /ornecemo% a e%ta rotina trC% argumento%A o nome do bot*o Sna -ari(-e# button@nameTE um n5mero e uma %tring.
self.button*;'utton!self.my)ontainer*= command;self.button3andler!button_name=*= #6ood stuff%# " "

Em ap#ica)'e% %6ria%E a rotina buttonOand#er iriaE 6 c#aroE traba#har %eriamenteE ma% ne%te programa e#a meramente imprime o% argumento% &ue recebeu. 5 ent binding 8hega de command binding. 7 &ue diremo% %obre e-ent binding1 UocC perceber( &ue comentamo% a% dua% #inha% &ue 9azem e-ent binding no e-ento ZReturn[.
self.button*.bind!#Q1eturnR#=self.button3andler_a!eFent= button_name= *= #6ood stuff%# " "

E%te 6 o primeiro %ina# de um prob#ema. 7 e-ent binding automaticamente tran%mite o argumento de e-ento ! ma% %imp#e%mente n*o h( como inc#uir &ue o argumento de e-ento em no%%a #i%ta de argumento%. Teremo% &ue -o#tar a e%te prob#ema mai% tarde. Por oraE -amo% %imp#e%mente rodar o programa e -er o &ue acontece.

GRUPO PYTHON UNESP ILHA SOLTEIRA

40

PENSANDO EM TKINTER

STEVEN FERG

'omportamento do programa Uendo o cMdigoE o programa at6 &ue n*o parece t*o ma#E ma% &uando -ocC o rodaE percebe &ue e#e n*o traba#ha direito. $ rotina buttonOand#er 6 %o#icitada ante% me%mo &ue a GU" %e,a eFibida. Na -erdadeE e#a 6 %o#icitada duas -eze%L e -ocC c#icar com o bot*o e%&uerdo do mou%e em &ua#&uer bot*oE de%cobrir( &ue nada acontece ! a rotina e-entOand#er n*o e%t( %endo %o#icitada. Ue,a &ue a 5nica maneira de 9echar o programa 6 c#icando no <cone /E8O$R So GWH na caiFaT no #ado direito da barra de t<tu#o%. Ent*o rode o programa agoraE e -e,a o &ue acontece. No prMFimo programa -eremo% por&ue i%%o acontece.
from &kinter import class :y pp: def __init__!self= parent": self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" button_name ; #CP# self.button*;'utton!self.my)ontainer*= command;self.button3andler!button_name= *=#6ood stuff%# " " # self.button*.bind!#Q1eturnR#= self.button3andler_a!eFent= # button_name= *= #6ood stuff%#"" self.button*.configure!te?t;button_name= background;#green#" self.button*.pack!side;40J&" self.button*.focus_force!" # Joca o teclado em button* button_name ; #)ancel# self.button2;'utton!self.my)ontainer*= command;self.button3andler!button_name= 2=#'ad stuff%# " " # self.button2.bind!#Q1eturnR#=self.button3andler_a!eFent= # button_name= 2= #'ad stuff%#"" self.button2.configure!te?t;button_name= background;#red#" self.button2.pack!side;40J&" def button3andler!self= arg*= arg2= argI": print #button3andler routine receiFed arguments:#= arg*.lMust !X"= arg2= argI def button3andler_a!self= eFent= arg*= arg2= argI": print #button3andler_a receiFed eFent#= eFent self.button3andler!arg*= arg2= argI"

GRUPO PYTHON UNESP ILHA SOLTEIRA

=D

PENSANDO EM TKINTER

STEVEN FERG

print #,n#-*.. # limpa a tela print #9tarting program tt.OO.# root ; &k!" myapp ; :y pp!root" print #1eady to start e?ecuting the eFent loop.# root.mainloop!" print #Jinished e?ecuting the eFent loop.#

TT0/; Transmitindo argumentos para alimentadores de e entos II *sando <ambda


Uendo a eFecu)*o do 5#timo programaE no% perguntamo%A G7 &ue e%t( acontecendo a&ui111 $ rotina buttonOand#er e%t( %endo eFecutada por cada um do% bot'e%E me%mo ante% do e-ent #oop entrar em a)*oLH $ raz*o 6 &ue uma #inha como
self.button* ; 'utton!self.my)ontainer*= command ; self.button3andler!button_name= *= #6ood stuff%# " "

9oi chamada de fun")o button*andlerE embora 9o%%e me#hor tC>#a chamado de rec amada. Embora n*o %e,a o &ue pretend<amo%E 6 o &ue rea#mente acontece. Ue,a &ueA

buttonOand#er 6 um ob,eto 9un)*oE e pode %er u%ado como uma #iga)*o de rechamada. buttonOand#erST S-iu o% parCnte%e%1TE por outro #adoE 6 uma chamada rea# da 9un)*o buttonOand#er.

3uando a #inha
self.button* ; 'utton!self.my)ontainer*= command ; self.button3andler!button_name= *= #6ood stuff%# " "

6 eFecutadaE e#a e%t( na -erdade 9azendo a chamada da rotina buttonOand#er. $ rotina 6 ent*o eFecutadaE imprimindo uma men%agemE e retornando o re%u#tado da chamada Sne%te ca%oE o ob,eto NoneT. $< a op)*o GcommandH do bot*o 6 #igada ao re%u#tado da chamada. Em re%umoE GcommandH 6 #igada ao ob,eto GNoneH. \ por cau%a di%%o &ueE &uando -ocC c#ica em &ua#&uer um do% bot'e%E nada acontece.

GRUPO PYTHON UNESP ILHA SOLTEIRA

=2

PENSANDO EM TKINTER

STEVEN FERG

IC uma soluoD Ent*o... &ua# a %o#u)*o1 O( a#gum meio de parametrizarE e reuti#izarE uma 9un)*o a#imentadora de e-ento%1 im. O( uma %6rie de t6cnica% reconhecida% de 9azer i%%o. Uma de#a% u%a a 9un)*o LambdaE uma 9un)*o bui#t>in de PythonE e outra u%a uma t6cnica chamada de GcurryingH. Ne%te programa di%cutiremo% como traba#har com #ambdaE e no prMFimo programa daremo% uma o#hada em currying. N*o -ou tentar eFp#icar como #ambda e currying traba#ham ! i%%o 6 muito comp#icado e e%t( bem #onge do no%%o ob,eti-o principa#E &ue 6 ter programa% Tkinter rodando. Uamo% ent*o %imp#e%mente trat(>#a% como caiFa%>preta%. N*o -ou dizer como e#a% traba#ham ! %M como traba#har com e#a%. Ue,amo% #ambda. 'ommand binding O( pouco tempoE ach(-amo% &ue a %eguinte #inha de-e%%e 9uncionarA
self.button* ; 'utton!self.my)ontainer*= command ; self.button3andler!button_name= *= #6ood stuff%# " "

a ma% ,( de%cobrimo% &ue e#a n*o 9az o &ue pen%amo% &ue 9aria. 7 ,eito de 9azer o &ue &ueremo% 6 ree%cre-er e%ta #inha da %eguinte 9ormaA
self.button* ; 'utton!self.my)ontainer*= command ; lambda= arg*;button_name=arg2;*= argI;#6ood 9tuff%#:self.button3andler!arg*= arg2= argI" "

5 ent binding /e#izmenteE #ambda tamb6m no% d( um ,eito de parametrizar e-ent binding. Em -ez deA
self.button*.bind!#Q1eturnR#= self.button3andler_a!eFent= button_name= *= #6ood stuff%#" "

S&ue n*o 9uncionaria por&ue n*o 6 po%%<-e# inc#uir argumento% de e-ento dentro da #i%ta de argumento%TE podemo% u%ar #ambdaE de%%a 9ormaA =4

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

# eFent binding Y transmitindo o eFento como um argumento self.button*.bind!#Q1eturnR#= lambda eFent= arg*;button_name= arg2;*= argI;#6ood stuff%# : self.button3andler_a!eFent= arg*= arg2= argI" "

SUe,a &ue Ge-entH a&ui 6 o nome de uma -ari(-e# ! n*o uma keyIord de Python ou a#go &ue o -a#ha. E%te eFemp#o u%a o nome Ge-entH para o argumento de e-entoN a#gun% autore% u%am o nome GeH para i%%oE ma% tanto 9az. Poder<amo% ter e%crito Ge-ent@argHE %e &ui%6%%emo%.T Uma da% caracter<%tica% mai% e#egante% &uando %e u%a #ambda 6 &ue podemo% S%e &ui%ermo%TE %imp#e%mente n*o tran%mitir o argumento de e-ento. e 9izermo% i%%oE poderemo% ent*o chamar a 9un)*o %e#9.buttonOand#er diretamenteE em -ez de indiretamente pe#a 9un)*o %e#9.buttonOand#er@a. Para i#u%trar e%ta t6cnicaE iremo% programar o e-ent binding do button4 di9erente do button2. Ei% o &ue 9izemo% com o %egundo bot*oA
# eFent binding Y sem transmitir o eFento como um argumento self.button2.bind!#Q1eturnR#= lambda eFent= arg*;button_name= arg2;2= argI;#'ad stuff%# : self.button3andler!arg*= arg2= argI" "

'omportamento do programa Rodando o programaE e#e %e comportar( eFatamente como &ueremo%. Ue,a &ue -ocC pode mudar o 9oco de tec#ado entre o% bot'e% 7P e 8$N8EL pre%%ionando a tec#a T$J. Particu#armenteE tente ati-ar 7P pre%%ionando ENTER. /azendo i%%o -ocC e%tar( co#ocando>o para traba#har pe#a 9un)*o buttonOand#er@aE e tamb6m receber( uma men%agem impre%%aE in9ormando %obre &ua# e-ento 9oi recebido por e#e. Em &ua#&uer ca%oE tanto c#icando em um do% bot'e% com o mou%eE ou %o#icitando um Iidget -ia ENTERE o programa imprimir( direitinho o% argumento% &ue 9oram tran%mitido% pe#a 9un)*o buttonOand#er.
from &kinter import class :y pp: def __init__!self= parent":

GRUPO PYTHON UNESP ILHA SOLTEIRA

==

PENSANDO EM TKINTER

STEVEN FERG

self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" #HHHHHHHHHHHHHHHHHH 'C&ZC 5.[ * HHHHHHHHHHHHHHHHHHHHHHH button_name ; #CP# # command binding self.button* ; 'utton!self.my)ontainer*= command ; lambda arg*;button_name= arg2;*= argI;#6ood stuff%# : self.button3andler!arg*= arg2= argI" " # eFent binding Y transmitindo o eFento como um argumento self.button*.bind!#Q1eturnR#= lambda eFent= arg*;button_name= arg2;*= argI;#6ood stuff%# : self.button3andler_a!eFent= arg*= arg2= argI" " self.button*.configure!te?t;button_name= background;#green#" self.button*.pack!side;40J&" self.button*.focus_force!" # p\e o foco de teclado em button* #HHHHHHHHHHHHHHHHHH 'C&ZC 5.[ 2 HHHHHHHHHHHHHHHHHHHHHHH button_name ; #)ancel# # command binding self.button2 ; 'utton!self.my)ontainer*= command ; lambda arg*;button_name= arg2;2= argI;#'ad stuff%#: self.button3andler!arg*= arg2= argI" " # eFent binding Y sem passer o eFento como um argumento self.button2.bind!#Q1eturnR#= lambda eFent= arg*;button_name= arg2;2= argI;#'ad stuff%# : self.button3andler!arg*= arg2= argI" " self.button2.configure!te?t;button_name= background;#red#" self.button2.pack!side;40J&" def button3andler!self= argument*= argument2= argumentI": print #button3andler routine receiFed arguments:# , = argument*.lMust!X"= argument2= argumentI def button3andler_a!self= eFent= argument*= argument2= argumentI": print #button3andler_a receiFed eFent#= eFent self.button3andler!argument*= argument2= argumentI" print #,n#-*.. # limpa a tela print #9tarting program tt.OX.# root ; &k!" myapp ; :y pp!root"

GRUPO PYTHON UNESP ILHA SOLTEIRA

=+

PENSANDO EM TKINTER

STEVEN FERG

print #1eady to start e?ecuting the eFent loop.# root.mainloop!" print #Jinished e?ecuting the eFent loop.#

TT0/2 Transmitindo argumentos para alimentadores de e entos III *sando 'urr=ing


No programa anteriorE -imo% uma t6cnica en-o#-endo #ambda para tran%mitir argumento% a uma 9un)*o a#imentadora de e-ento%. Ne%te programaE daremo% uma o#hada em como 9azer a me%ma coi%a u%ando uma t6cnica chamada GcurryingH. Sobre 'urr= Em %eu %entido mai% %imp#e%E currying 6 a t6cnica de u%ar 9un)*o para con%truir outra% 9un)'e%. 8urrying 6 uma t6cnica herdada da programa)*o 9unciona#. e -ocC &ui%er %aber mai% %obre e#aE h( di-er%a% in9orma)'e% no GPython 8ookbookH. $ c#a%%e curry u%ada ne%te programa 6 a receita de cott Da-id Danie#E G8urry ! a%%ociando parmetro% com 9un)'e%HE di%pon<-e# em
http://aspn.actiFestate.com/ 9<5/)ookbook/<ython/1ecipe/S2SB]

8omo 9oi di%cutido %obre #ambdaE n*o 6 meu ob,eti-o eFp#icar como 9unciona curryingA trataremo% i%%o como uma caiFa>preta. 'urr= como usC1lo $ maneira de u%ar curry Sa t6cnicaE n*o o temperoLT 6 inc#uir a c#a%%e GcurryH em %eu programaE ou import(>#a de %eu prMprio ar&ui-o Python. Ne%te programaE iremo% inc#uir o cMdigo curry diretamente no programa. "nicia#menteE pen%amo% &ue a %eguinte #inha #iga %e#9.buttonOand#er V op)*o command de %e#9.button2E ma% de%cobrimo% &ue i%%o n*o 9unciona da maneira &ue pen%(-amo%.
self.button* ; 'utton!self.my)ontainer*= command;self.button3andler!button_name=*=#6ood stuff%#" "

U%ando curryE o ,eito de 9azer o &ue &ueremo% 6 ree%cre-er e%ta #inha a%%imA
self.button* ; 'utton!self.my)ontainer*= command;curry!self.button3andler=button_name=*=#6ood stuff%#" "

8omo -ocC pode -erE o cMdigo 6 bem direto. Em -ez de %o#icitar a 9un)*o %e#9.buttonOand#erE criamo% um ob,eto curry Si%to 6E uma in%tncia da c#a%%e curryTE tran%mitindo a 9un)*o %e#9.buttonOand#er em %eu primeiro argumento. Ja%icamenteE o &ue =.

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

acontece 6 &ue o ob,eto curry recorda o nome da 9un)*o dada. Por i%%oE &uando 6 re&ui%itadoE o ob,eto curry chama a 9un)*o &ue #he 9oi dada &uando 9oi criado. 5 ent binding 8had Netzer de%en-o#-eu uma t6cnica %imi#ar ao curryingE &ue pode %er u%ada para parametrizar e-ent binding+ &ue en-o#-e uma 9un)*o Ge-ent@#ambdaH. Para u%ar e-ent@#ambdaE como com curryE -ocC de-e inc#uir o cMdigo para a 9un)*o Ge-ent@#ambdaH em %eu programaE ou import(>#a de %eu prMprio ar&ui-o Python. Ne%te programaE inc#u<mo% o cMdigo da 9un)*o e-ent@#ambda diretamente no programa.

# HHHHHHHHHH cGdigo def eFent_lambda!f= ###0screFendo return lambda

para a funEo eFent_lambda HHHHHHHHHH -args= --k(ds ": lambda numa interface mais amig^Fel### eFent=f;f=args;args=k(ds;k(ds: f!-args=--k(ds"

Uma -ez tendo a 9un)*o e-ent@#ambda di%pon<-e#E podemo% u%(>#a para #igar %e#9.buttonOand#er ao e-ento de tec#ado ENTERE 9ornecendo a e#a a#gun% argumento%. Ei% como 9azemo% i%%oA
self.button*.bind!#Q1eturnR#= eFent_lambda!self.button3andler=button_name= *=#6ood stuff%#" "

e -ocC ti-er uma curio%idade in%aci(-e# %obre como e-ent@#ambda 9uncionaE dC uma o#hadinha no cMdigo do bot*o button4. Para button4E u%amo% um proce%%o em doi% pa%%o%. Primeiro %o#icitamo% a 9un)*o e-ent@#ambdaA
eFent_handler;eFent_lambda!self.button3andler= button_name=2=#'ad stuff%#"

3uando e#a 6 %o#icitadaE u%a #ambda para criar um ob,eto 9un)*o no-o e %em nome SGan]nimoHT.
lambda eFent= f;f= args;args= k(ds;k(ds : f! -args= --k(ds "

7 ob,eto 9un)*o %em nome 6 um en-o#tMrio para a 9un)*o &ue rea#mente &ueremo% %o#icitar SG9HE &ue ne%te programa 6 G%e#9.buttonOand#erHT e o% argumento% nM% e%peci9icamo% &uando chamamo% a 9un)*o e-ent@#ambda. $%%imE a 9un)*o e-ent@#ambda retorna e%ta no-a e an]nima 9un)*o. 3uando e-ent@#ambda retorna a 9un)*o an]nimaE damo% a e#a o nome de Ge-ent@hand#erH.
+

$ uti#iza)*o de%ta t6cnica eFige -er%*o de Python igua# ou %uperior a Python 4.D

GRUPO PYTHON UNESP ILHA SOLTEIRA

=:

PENSANDO EM TKINTER

STEVEN FERG

eFent_handler;eFent_lambda!self.button3andler= button_name=2=#'ad stuff%#"

Ent*oE no %egundo pa%%oE #igamo% o e-ento ENTER SZReturn[T V 9un)*o Ge-ent@hand#erHA


self.button2.bind!#Q1eturnR#=eFent_handler"

Perceba &ue para a 9un)*o an]nimaE Ge-entH 6 %M um argumento %uporte &ue 6 de%cartado e n*o chega a %er u%ado. omente o% argumento% po%icionai% Sarg%T e o% argumento% de tec#ado SkId%T %*o tran%mitido% V rotina a#imentadora do bot*o. *+aJ KC torrei um monte de neurLniosJ E%te 6 um a%%unto comp#icado. Ma% -ocC n*o preci%a torrar %eu% neur]nio% tentando entender como tudo i%%o 9unciona. UocC n*o preci%a %aber como curry e e-ent@#ambda traba#ham %e %eu ob,eti-o 9or u%(>#o%. Trate>o% como caiFa%>preta%A u%e>o% %em %e preocupar com o &ue h( dentro. <ambda ersus 'urr= e e entMlambda Eual de o usarD Jema

7 cMdigo para u%ar curry e e-ent@#ambda 6 re#ati-amente intuiti-oE curto e %imp#e%. 7 #ado negati-o 6 &ue para u%(>#o% -ocC de-e inc#u<>#o% no cMdigo do %eu programaE ou import(>#o%. LambdaE em contrapartidaE 6 bui#t>in em Python ! -ocC n*o preci%a 9azer nada e%pecia# para import(>#aN %imp#e% a%%im. O( o #ado negati-oA o cMdigo para u%(>#a 6 grande e um pouco con9u%o.

E%co#ha o &ue #he con-ier. 8omo diz o ditadoE Go c#iente %empre tem raz*oH. U%e o &ue 9or c]modo para %ua% tare9a%. 4 N54< moral dessa #istOria ? Bue$$$ Python 6 uma #inguagem podero%aE e o9erece -(ria% 9erramenta% &ue podem %er u%ada% para criar 9un)'e% de rechamada para manipu#a)*o de e-ento%. GPen%ando em TkinterH 6 uma introdu)*o ao% conceito% b(%ico%E n*o uma encic#op6dia de t6cnica%E por i%%o eFp#oramo% %M a#guma% de#a% a&ui. Ma% c( entre nM%E -ocC %e torna muito mai% h(bi# com PythonE e como %ua nece%%idade por mai% 9#eFibi#idade 6 cada -ez maiorE h( caracter<%tica% mai% a-an)ada% da #inguagem &ue e%tar*o di%pon<-ei% para -ocC de%en-o#-er eFatamente o tipo de 9un)'e% de rechamada &ue -ocC preci%ar. 'omportamento do programa e -ocC rodar e%te programaE e#e %e comportar( como o anterior. N*o mudamo% nada no comportamento do programaE %omente a maneira como 9oi e%crito.

GRUPO PYTHON UNESP ILHA SOLTEIRA

=;

PENSANDO EM TKINTER

STEVEN FERG

from &kinter import # HHHHHHHHHH cGdigo da classe curry !in_cio" HHHHHHHHHH class curry: ###da receita de 9cott DaFid Daniel #curry Y associando par`metros com funE\es# no #<ython )ookbook# ### def __init__!self= fun= -args= --k(args": self.fun ; fun self.pending ; argsK:L self.k(args ; k(args.copy!" def __call__!self= -args= --k(args": if k(args and self.k(args: k( ; self.k(args.copy!" k(.update!k(args" else: k( ; k(args or self.k(args return self.fun!-!self.pending W args"= --k(" # HHHHHHHHHH cGdigo da classe curry !final" HHHHHHHHHH # HHHHHHHHHH cGdigo da funEo eFent_lambda !comeEo" HHHHHHHH def eFent_lambda!f= -args= --k(ds ": ###8ma funEo au?iliary Due enFolFe lambda numa interface mais amig^Fel Cbrigado a )had 5etzer pelo cGdigo.### return lambda eFent= f;f= args;args= k(ds;k(ds : f! -args= --k(ds " # HHHHHHHHHH cGdigo da funEo eFent_lambda !final" HHHHHHHHHHH class :y pp: def __init__!self= parent": self.my<arent ; parent self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" button_name ; #CP# # command binding Y usando curry self.button* ; 'utton!self.my)ontainer*= command ; curry!self.button3andler= button_name= *= #6ood stuff%#" " # eFent binding Y usando a funEo au?iliary eFent_lambda self.button*.bind!#Q1eturnR#= eFent_lambda!self.button3andler= button_name= *= #6ood stuff%#" " self.button*.configure!te?t;button_name= background;#green#" self.button*.pack!side;40J&" self.button*.focus_force!" # <\e o foco de teclado em button* button_name ; #)ancel#

GRUPO PYTHON UNESP ILHA SOLTEIRA

=B

PENSANDO EM TKINTER

STEVEN FERG

# command binding HH usando curry self.button2 ; 'utton!self.my)ontainer*= command ; curry!self.button3andler= button_name= 2= #'ad stuff%#" " dois passos # eFent binding Y usando a funEo au?iliary eFent_lambda em eFent_handler;eFent_lambda!self.button3andler= button_name=2= #'ad stuff%#" self.button2.bind!#Q1eturnR#= eFent_handler " self.button2.configure!te?t;button_name= background;#red#" self.button2.pack!side;40J&"

def button3andler!self= argument*= argument2= argumentI": print #button3andler routine receiFed arguments:#= , argument*.lMust!X"= argument2= argumentI def button3andler_a!self= eFent= argument*= argument2= argumentI": print #button3andler_a receiFed eFent#= eFent self.button3andler!argument*= argument2= argumentI" print #,n#-*.. # limpa a tela print #9tarting program tt.O].# root ; &k!" myapp ; :y pp!root" print #1eady to start e?ecuting the eFent loop.# root.mainloop!" print #Jinished e?ecuting the eFent loop.#

TT0;0 Op:es de .idget e con+igura:es de pack


No% 5#timo% programa%E perdemo% um temp*o di%cutindo t6cnica% para #igar a#imentadore% de e-ento% a Iidget%. 8om e%te programaE retornamo% ao tMpico de con9igurar a aparCncia da GU" ! mudando o% Iidget% e contro#ando %ua aparCncia e po%i)*o. Tr"s t?cnicas de controlar o la=out de uma )*I O( trC% t6cnica% de contro#ar o #ayout gera# de uma GU"A

$tributo% do% Iidget%N 7p)'e% de packST e Po%icionando o% containere% Scomo 9rame%T.

Ne%te programaE -eremo% como contro#ar a aparCncia mudando o% atributo% do% Iidget% e a% op)'e% de packST. Traba#hemo% um pouco com a#gun% bot'e% e com o 9rame &ue o% cont6m. Na% 5#tima% -er%'e% de%te programaE chamamo% o 9rame de Gmy8ontainer2H. $&uiE iremo% renome(>#o como a#go mai% de%criti-oA Gbutton%@9rameH.
GRUPO PYTHON UNESP ILHA SOLTEIRA

=0

PENSANDO EM TKINTER

STEVEN FERG

7% n5mero% da% %e)'e% %eguinte% %e re9erem ao% coment(rio% numerado% no cMdigo 9onte. S2T PrimeiroE para no% certi9icarmo% de &ue todo% o% bot'e% tCm a me%ma #arguraE e%peci9icamo% um atributo G#arguraH SIidthT &ue 6 o me%mo para todo% e#e%. Perceba &ue o atributo Iidth 6 e%pec<9ico para o Iidget Jutton de Tkinter ! nem todo% o% Iidget% po%%uem atributo% de #argura. Perceba tamb6m &ue o atributo Iidth 6 e%peci9icado em unidade% de caractere% Se n*oE por eFemp#oE em unidade% de piFe#%E po#egada%E mi#<metro%T. abendo &ue no%%o maior rMtu#o SG8ance#HT tem %ei% caractere%E -amo% de9inir a #argura do% bot'e% como G:H. S4T $gora adicionamo% padding ao% no%%o% bot'e%. Padding %*o e%pa)o% eFtra em torno do teFtoE entre o teFto e a borda do bot*o. /azemo% i%%o mudando o% atributo% GpadFH e GpadyH do% bot'e%. GpadFH cria o% e%pa)o% eFtra% ao #ongo do eiFo WE horizonta#menteE V direita e V e%&uerda do teFtoE en&uanto GpadyH 9az i%%o ao #ongo do eiFo bE -ertica#menteE acima e abaiFo do teFto. Uamo% e%peci9icar no%%o e%pa)o horizonta# como = mi#<metro% SpadF_H=mHT e no%%o e%pa)o -ertica# como 2 mi#<metro Spady_H2mHT. Ue,a &ueE di9erente do atributo IidthE &ue 6 num6ricoE e%te% atributo% %*o e%crito% entre a%pa%. "%%o por&ue e%tamo% e%peci9icando a% unidade% do padding por meio do %u9iFo GmHE ent*o temo% &ue e%peci9icar o tamanho do% e%pa)o% como uma %tring em -ez de n5mero%. S=T /ina#menteE adicionamo% a#gun% e%pa)o% ao container Sbutton%@9rameT &ue organiza o% bot'e%. Para o containerE e%peci9icamo% &uatro atributo% de padding. GpadFH e GpadyH e%peci9icam o e%pa)o &ue de-e eFi%tir em torno Sdo #ado de 9oraT do 9rame. GipadFH e GipadyH SGpadF internoH e Gpady internoHT e%peci9icam o% e%pa)o% interno%. E%te 6 o e%pa)amento em tono de cada um do% Iidget% dentro do container. ObsA n*o e%peci9icamo% o e%pa)amento do 9rame como um atributo do 9rameE e %im como uma op)*o &ue 9ornecemo% ao gerenciador de geometria Sne%te ca%oE packT. S+T 8omo -ocC pode -erE o e%pa)amento 6 um pouco con9u%o. /rame% tCm e%pa)amento% interno%E ma% Iidget% como button n*o. Em a#gun% ca%o%E o e%pa)amento 6 um atributo do IidgetE en&uanto em outro% ca%o% temo% &ue e%peci9ic(>#o com op)'e% de packST. 'omportamento do programa 3uando -ocC rodar e%te programaE -er( doi% bot'e%E ma% agora e#e% de-em ter o me%mo tamanho. 7 tamanho do% bot'e% 6 ta# &ue o teFto n*o 9ica t*o e%premido com ante%A agora o% bot'e% tCm uma borda con%ider(-e#.

GRUPO PYTHON UNESP ILHA SOLTEIRA

+D

PENSANDO EM TKINTER

STEVEN FERG

from &kinter import class :y pp: def __init__!self= parent": # HHHHHH constantes para controle do layout HHHHHH button_(idth ; T ### !*" button_pad? ; #2m# button_pady ; #*m# ### !2" ### !2"

buttons_frame_pad? ; #Im# ### !I" buttons_frame_pady ; #2m# ### !I" buttons_frame_ipad? ; #Im# ### !I" buttons_frame_ipady ; #*m# ### !I" # HHHHHHHHHHHHHH fim das constantes HHHHHHHHHHHHHHHH self.my<arent ; parent self.buttons_frame ; Jrame!parent" self.buttons_frame.pack! ipad?;buttons_frame_ipad?= ipady;buttons_frame_ipady= pad?;buttons_frame_pad?= pady;buttons_frame_pady= " ### !B" ### !I" ### !I" ### !I" ### !I"

self.button*;'utton!self.buttons_frame= command;self.button*)lick" self.button*.configure!te?t;#CP#= background; #green#" self.button*.focus_force!" self.button*.configure!(idth;button_(idth= ### !*" pad?;button_pad?= ### !2" pady;button_pady ### !2" " self.button*.pack!side;40J&" self.button*.bind!#Q1eturnR#= self.button*)lick_a" self.button2;'utton!self.buttons_frame= command;self.button2)lick" self.button2.configure!te?t;#)ancel#= background;#red#" self.button2.configure!(idth;button_(idth= ### !*" pad?;button_pad?= ### !2" pady;button_pady ### !2" " self.button2.pack!side;1763&" self.button2.bind!#Q1eturnR#= self.button2)lick_a" def button*)lick!self": if self.button*K#background#L ;; #green#: self.button*K#background#L ; #yello(# else: self.button*K#background#L ; #green# def button2)lick!self": self.my<arent.destroy!" def button*)lick_a!self= eFent": self.button*)lick!"

GRUPO PYTHON UNESP ILHA SOLTEIRA

+2

PENSANDO EM TKINTER

STEVEN FERG

def button2)lick_a!self= eFent": self.button2)lick!" root ; &k!" myapp ; :y pp!root" root.mainloop!"

TT020 >osicionando +rames$


Ne%te programaE daremo% uma o#hada em po%icionamento de containere% S9rame%T. 7 &ue iremo% 9azer 6 criar uma %6rie de 9rame%E co#ocado% um dentro do outroA botton@9rameE #e9t@9rame e big@9rame. E%te% 9rame% n*o conter*o nada ! nenhum Iidget. Norma#menteE por cau%a da e#a%ticidade do% 9rame%E e#e% %e enco#heriam at6 n*o %erem -i%<-ei%E ma% e%peci9icando atributo% de a#tura e #argura podemo% 9ornecer um tamanho inicia# a e#e%. Ue,a &ue n*o e%peci9icamo% a#tura e #argura para todo% o% 9rame%. Para my8ontainer2E por eFemp#oE n*o e%peci9icamo% nenhum do% doi% atributo%E ma% e%peci9icando e%te% atributo% para o% Iidget% &ue e%te 9rame continhaE e#e %e e%ticou at6 acomodar a% a#tura% e #argura% acumu#ada% pe#a% a#tura% e #argura% de%%e% Iidget%. Po%teriormente eFp#oraremo% como co#ocar Iidget% ne%te% 9rame%N por en&uanto %imp#e%mente criaremo% o% 9rame%E e daremo% a e#e% di9erente% tamanho%E po%i)'e% e core% de 9undo. 8o#ocaremo% tamb6m borda% em torno do% trC% 9rame% &ue no% intere%%ar*o mai% no 9uturoA bottom@9rameE #e9t@9rame e right@9rame. 7% outro% 9rame% Stop@9rame e button%@9rameT n*o receber*o borda%. 'omportamento do programa 3uando -ocC roda e%te programaE -C 9rame% di9erente%E com di9erente% core% de 9undo.
from &kinter import class :y pp: def __init__!self= parent": #HHHHHH constantes para controlar o layout dos bot\es HHHHHH button_(idth ; T button_pad? ; #2m# button_pady ; #*m# buttons_frame_pad? ; #Im# buttons_frame_pady ; #2m# buttons_frame_ipad? ; #Im# buttons_frame_ipady ; #*m# # HHHHHHHHHHHHHH fim das constantes HHHHHHHHHHHHHHHH

GRUPO PYTHON UNESP ILHA SOLTEIRA

+4

PENSANDO EM TKINTER

STEVEN FERG

self.my<arent ; parent ### 5osso frame mais importante chamaHse my)ontainer* self.my)ontainer* ; Jrame!parent" self.my)ontainer*.pack!" ### ### ### ### ### 8samos orientaEo /01&7) 4 !top/bottom" dentro de my)ontainer*. Dentro de my)ontainer*= primeiro criamos o frame buttons_frame 0nto criamos top_frame e bottom_frame 0stes sero nossos framesHe?emplo.

# buttons_frame self.buttons_frame ; Jrame!self.my)ontainer*" self.buttons_frame.pack! side;&C<= ipad?;buttons_frame_ipad?= ipady;buttons_frame_ipady= pad?;buttons_frame_pad?= pady;buttons_frame_pady= " # top_frame self.top_frame ; Jrame!self.my)ontainer*" self.top_frame.pack!side;&C<= fill;'C&3= e?pand;209= " # bottom_frame self.bottom_frame ; Jrame!self.my)ontainer*= border(idth;S= relief;17D60= height;S.= background;#(hite#= " self.bottom_frame.pack!side;&C<= fill;'C&3= e?pand;209= " ### ### ### ### )oloDuemos agora mais dois frames= left_frame e right_frame= dentro de top_frame= usando orientaEo 3C17aC5& 4 !left/right"

# left_frame self.left_frame ; Jrame!self.top_frame= background;#red#= border(idth;S= relief;17D60= height;2S.= (idth;S.= " self.left_frame.pack!side;40J&= fill;'C&3= e?pand;209= "

GRUPO PYTHON UNESP ILHA SOLTEIRA

+=

PENSANDO EM TKINTER

STEVEN FERG

### right_frame self.right_frame ; Jrame!self.top_frame= background;#tan#= border(idth;S=relief;17D60= (idth;2S." self.right_frame.pack!side;1763&=fill;'C&3=e?pand;209" # agora adicionamos os bot\es a buttons_frame #HHHHHH constantes para controle do layout HHHHHH button_(idth ; T ### !*" button_pad? ; #2m# button_pady ; #*m# ### !2" ### !2"

buttons_frame_pad? ; #Im# ### !I" buttons_frame_pady ; #2m# ### !I" buttons_frame_ipad? ; #Im# ### !I" buttons_frame_ipady ; #*m# ### !I" # HHHHHHHHHHHHHH fim das constantes HHHHHHHHHHHHHHHH self.button*;'utton!self.buttons_frame= command;self.button*)lick" self.button*.configure!te?t;#CP#= background; #green#" self.button*.focus_force!" self.button*.configure! (idth;button_(idth= pad?;button_pad?= pady;button_pady " self.button*.pack!side;40J&" self.button*.bind!#Q1eturnR#= self.button*)lick_a" self.button2;'utton!self.buttons_frame= command;self.button2)lick" self.button2.configure!te?t;#)ancel#= background;#red#" self.button2.configure!(idth;button_(idth= pad?;button_pad?= pady;button_pady " self.button2.pack!side;1763&" self.button2.bind!#Q1eturnR#= self.button2)lick_a" def button*)lick!self": if self.button*K#background#L ;; #green#: self.button*K#background#L ; #yello(# else: self.button*K#background#L ; #green# def button2)lick!self": self.my<arent.destroy!" def button*)lick_a!self= eFent": self.button*)lick!" def button2)lick_a!self= eFent": self.button2)lick!" root ; &k!" myapp ; :y pp!root" root.mainloop!"

GRUPO PYTHON UNESP ILHA SOLTEIRA

++

PENSANDO EM TKINTER

STEVEN FERG

TT023 8?todos gerenciadores de (anelas @ controlando o taman#o de (anelas com a opo geometry$
Dimen%ionar ,ane#a% pode %er uma eFperiCncia 9ru%trante &uando %e traba#ha com Tkinter. "magine e%ta %itua)*oA -ocC acredita em de%en-o#-imento interati-oE ent*o primeiro -ocC cuidado%amente cria um 9rame com a e%peci9ica)*o de a#tura e #argura &ue de%e,a e depoi% de un% te%te%E percebe &ue 9uncionou. Ent*o -ocC -ai para o prMFimo pa%%oE &ue 6 de adicionar a#gun% bot'e% ao 9rame. Te%ta de no-oE ma% agoraE para %ua %urpre%aE o Tkinter e%t( agindo como %e n*o hou-e%%e e%peci9ica)*o a#guma &uando V a#tura e #argura do 9rameA o 9rame %e enco#heu ao m<nimo %u9iciente para acomodar o% bot'e%. O Bue estC acontecendoDDD JemE o comportamento do gerenciador de geometria SpackE em no%%o% programa%T 6 con%i%tente. 7uE permita>me dizerA o comportamento de pack depende da %itua)*o. 7 ponto c#aro 6 &ue o pack honrar( com a %o#icita)*o de dimen%'e% %e o container e%ti-er -azioE ma% %e e%te conti-er &ua#&uer outro IidgetE ent*o a e#a%ticidade natura# do container -ir( V tona ! a% con9igura)'e% de a#tura e #argura do container %er*o ignorada% em 9a-or da% con9igura)'e% do% Iidget% e o container %e a,u%tar( a e%te% t*o apertado &uando po%%<-e#. "%%o 6 9atoA + imposs,%el contro#ar o tamanho de um container n*o>-azio. 7 &ue -ocC pode contro#ar 6 o tamanho inicia# da ,ane#a raiz inteira Sa&ue#a &ue 6 um container do container ! po%%ui barra de t<tu#oE etc.TE e -ocC 9az i%%o pe#a op)*o gerenciadora de ,ane#a% GgeometryH. S2T Ne%te programaE u%amo% a op)*o geometry para 9azer uma ,ane#ona em torno de um 9ramezinho. S4T Ue,a &ue a op)*o Gtit#eHE &ue nM% tamb6m u%amo% ne%te programaE 6 tamb6m um m6todo gerenciador de ,ane#a%. GTit#eH contro#a o teFto do t<tu#o na barra de t<tu#o% da ,ane#a. Ue,a tamb6m &ue a op)*o gerenciadora de ,ane#a% pode opciona#mente %er e%peci9icada com um pre9iFo GIm@H. Por eFemp#oE GIm@geometryH e GIm@tit#eH. Ne%te programaE %M para mo%trar &ue -ocC pode u%ar &ua#&uer uma de%ta% %intaFe%E u%amo% GgeometryH e GIm@tit#eH. 'omportamento do programa E%te programa mo%tra &uatro ,ane#a% em %uce%%*o 7b%er-e &ue -ocC ter( &ue 9echar cada uma de#a% c#icando no Iidget 8L7 E ! o 9amigerado GWH em uma caiFaE do #ado direito da barra de t<tu#o%.

GRUPO PYTHON UNESP ILHA SOLTEIRA

+.

PENSANDO EM TKINTER

STEVEN FERG

Na primeiraE -emo% &ue o 9rame det6m a% propriedade% de a#tura e #argura &ue e%peci9icamo%E ma% -e,aA e#e n*o cont6m Iidget%L Na %egundaE -emo% &ue eFatamente o me%mo 9rame %e comporta di9erentemente &uando a#gun% Iidget% Sa&uiE trC% bot'e%T %*o adicionado% a e#e. Ue,a &ue o 9rame %e enco#heu em torno do% trC% bot'e%. Na terceira ,ane#aE no-amente mo%tramo% como o 9rame -azio %e pareceE %M &ue de%%a -ez u%amo% a op)*o geometry para contro#ar o tamanho da ,ane#a inteira. Podemo% -er o 9undo azu# do 9rame dentro de um grande campo cinza da ,ane#a. Na 5#timaE no-amente mo%tramo% o 9rame com o% trC% bot'e% dentro de#eE ma% de%ta -ez e%peci9icando o tamanho da ,ane#a com a op)*o geometry. 7 tamanho da ,ane#a 6 o me%mo &ue na ,ane#a anteriorE por6m Scomo na %egunda ,ane#aT o 9rame %e enco#heu em torno do% bot'e%E por i%%o n*o podemo% -er %eu 9undo azu#.
from &kinter import class pp: def __init__!self= root= use_geometry= sho(_buttons": fm ; Jrame!root= (idth;I..= height;2..= bg;#blue#" fm.pack!side;&C<= e?pand;5C= fill;5C50" if use_geometry: root.geometry!#T..?B..#" ### !*" obserFe o mbtodo gerenciador de Manelas if sho(_buttons: 'utton!fm= te?t;#'utton *#= (idth;*.".pack!side;40J&" 'utton!fm= te?t;#'utton 2#= (idth;*.".pack!side;40J&" 'utton!fm= te?t;#'utton I#= (idth;*.".pack!side;40J&" case ; . for use_geometry in !.= *": for sho(_buttons in !.=*": case ; case W * root ; &k!" root.(m_title!#)ase # W str!case"" ### !2" obserFe o mbtodo gerenciador de Manelas (m_title display ; pp!root= use_geometry= sho(_buttons" root.mainloop!"

TT100 Op:es de pack! sideA e9pandA +ill e anc#or$


Ne%te programaE -eremo% mai% op)'e% de packST para contro#ar #ayout% dentro de 9rame%A

ideN /i##N EFpand e $nchor. +:

GRUPO PYTHON UNESP ILHA SOLTEIRA

PENSANDO EM TKINTER

STEVEN FERG

E%te programa 6 di9erente do% outro% da %6rie. "%to 6E -ocC n*o ter( &ue #er %eu cMdigo para entender %ua% caracter<%tica%. M preci%a rodar o programa. 7 propM%ito do programa 6 mo%trar a -ocC o% re%u#tado% da% op)'e% de pack. Rodar o programa -ai permitir a -ocC e%co#her di9erente% op)'e% e ob%er-ar o% e9eito% da% di9erente% combina)'e% de op)'e%. Os conceitos sub(acentes da opo pack Para entender como podemo% contro#ar a aparCncia do% Iidget% dentro de um container Scomo um 9rameTE preci%amo% #embrar &ue o gerenciador de geometria pack u%a o mode#o de arran,o ba%eado no conceito de Gca-idadeH. "%to 6E cada container 6 uma ca-idadeE e pack acomoda o conte5do dentro de#a. Em termo% de po%icionamento e eFibi)*o do% componente% num containerE 6 5ti# entender trC% conceito%A

E%pa)o n*o>%o#icitado Sca-idadeTN E%pa)o %o#icitado ma% n*o uti#izado e E%pa)o %o#icitado e uti#izado.

3uando -ocC acomoda um IidgetE como um bot*oE e#e 6 %empre acomodado ao #ongo de um do% &uatro #ado% da ca-idade. $ op)*o G%ideH de pack e%peci9ica &uai% #ado% %er*o u%ado%. Por eFemp#oE %e e%peci9icamo% G%ide_LE/THE o Iidget %er( acomodado Si%to 6E po%icionadoT do #ado e%&uerdo da ca-idade. 3uando um Iidget 6 acomodado ao #ongo de um #ado do containerE 6 %o#icitado o #ado inteiroE me%mo &ue e#e n*o ocupe todo o e%pa)o %o#icitado. uponha &ue acomodemo% um pe&ueno bot*o chamado W ao #ongo do #ado e%&uerdo de uma grande ca-idadeE como na 9igura da prMFima p(gina. $ ca-idade S(rea n*o %o#icitadaT 6 agora ao #ado direito do Iidget. 7 Iidget W %o#icitou o #ado e%&uerdo inteiroE numa tira &ue 6 #arga %omente o %u9iciente para acomod(>#o. Por %eu tamanho reduzidoE o Iidget W u%a %omente uma pe&uena parte da (rea tota# &ue 9oi %o#icitadaE %omente o nece%%(rio para &ue e#e apare)a.

GRUPO PYTHON UNESP ILHA SOLTEIRA

+;

PENSANDO EM TKINTER

STEVEN FERG

8omo -ocC pode -erE o Iidget W %o#icitou %omente o e%pa)o &ue nece%%ita-a para aparecer. e e%peci9icarmo% a op)*o de pack chamada GeFpand_bE HE e#e ir( %o#icitar toda a (rea di%pon<-e#. Nenhum peda)o do #ado direito da ca-idade permanecer( n*o>%o#icitado. "%%o n*o %igni9ica &ue o Iidget usa a (rea inteiraN e#e continua u%ando %omente a pe&uena parte de &ue nece%%ita. Em ta# %itua)*oE o Iidget W tem um e%pa)o muito grande %em uti#idade em torno de#e. Em &ue #ugar de%te e%pa)o e#e de-er( %e po%icionar1 \ i%%o &ue a op)*o GanchorH diz a e#e. 3uando um Iidget %o#icitou mai% e%pa)o do &ue rea#mente u%aE a op)*o anchor re9ina %ua% coordenada% de po%icionamento. GNH %igni9ica Norte Si%to 6E centrado no topo da (rea %o#icitadaT. GNEH %igni9ica Norde%te Si%to 6E acima e V direita da (rea %o#icitadaT. E a%%im por diante. J( a op)*o G9i##H %er-e para dizer ao Iidget %e e#e de-e ou n*o ocupar todo o e%pa)o #i-reE e em &ue dire)*o e#e de-e %e eFpandirA

9i##_N7ME %igni9ica &ue o Iidget n*o de-e %e eFpandirN 9i##_W %igni9ica &ue e#e de-e %e eFpandir na dire)*o do eiFo W Shorizonta#menteTN 9i##_b %igni9ica &ue e#e de-e %e eFpandir na dire)*o do eiFo b S-ertica#menteT e 9i##_J7TO %igni9ica &ue e#e de-e %e eFpandir para todo% o% #ado%.

Nodando o programa 7kE -amo% rodar o programa. UocC n*o preci%a #er o cMdigoE %M rodar o programa e eFperimentar com a% -(ria% op)'e% de pack do% trC% bot'e%>demon%tra)*o. 7 9rame do bot*o $ d( uma ca-idade horizonta# para o bot*o %e #ocomo-er ! o 9rame n*o 6 muito mai% a#to &ue o bot*oN o 9rame do bot*o J d( a e#e uma ca-idade -ertica# para %e #ocomo-er ! o 9rame n*o 6 t*o mai% #argo &ue o bot*oE e o 9rame do bot*o 8 tem uma enorme ca-idade ! muito mai% a#ta e #arga &ue o bot*o ! para e#e %e di-ertir #( dentro. e a aparCncia de &ua#&uer do% bot'e% %ob certa% con9igura)'e% %urpreende -ocCE tente de%cobrir por &ue e#e %e parece a%%im. E 9ina#mentea *m (eito prCtico de encontrar erros Ue,a &ue empacotar Iidget% em containere% 6 um negMcio comp#icado por&ue o po%icionamento de um Iidget em re#a)*o a outro% Iidget% prMFimo% depende em parte de como o% Iidget% prMFimo% 9oram acomodado%. "%to 6E %e o% outro% Iidget% 9oram acomodado% V e%&uerdaE ent*o a ca-idade dentro da &ua# o prMFimo Iidget %er( empacotado %er( V direita. Ma% %e e#e% 9oram acomodado% no topo da ca-idadeE ent*o a ca-idade dentro da &ua# o prMFimo Iidget %er( empacotado %er( abaiFo de#e%. Tudo i%%o 6 uma be#a %a#adaL

GRUPO PYTHON UNESP ILHA SOLTEIRA

+B

PENSANDO EM TKINTER

STEVEN FERG

Ei% uma 9orma pr(tica de encontrar erro%A %e -ocC e%t( de%en-o#-endo %eu #ayout e %e deparar com um prob#ema ! coi%a% &ue n*o 9uncionam da maneira &ue -ocC pen%a-a &ue de-eriam 9uncionar ! ent*o dC a cada um do% %eu% containere% Si%to 6E cada um do% %eu% 9rame%T uma cor de 9undo di9erenteE por eFemp#o bg _ GredHE ou bg _ GcyanHE ou bg _ GtanH. ... ou amare#oE ou azu#E ou -erme#hoE o &ue -ocC &ui%erL "%%o permitir( a -ocC -er como o% 9rame% e%t*o %e arran,ando. /re&QentementeE o &ue -ocC -ir #he dar( um ind<cio de &ua# 6 o prob#ema.

Meu% agradecimento% a Pedro Kerneck e 7%-a#do antana pe#a re-i%*o e a Doug#a% oare% pe#a% ob%er-a)'e%.

TRADUZIDO PELO GRUPO PYTHON UNESP ILHA SOLTEIRA

Ui%ite o %ite do Grupo PythonL httpAXXgeocitie%.yahoo.com.brXgrupopython


Dvidas sobre a traduo? Fale com o tradutor: labaki@feis.unesp.br

GRUPO PYTHON UNESP ILHA SOLTEIRA

+0

Você também pode gostar