[wxPython] Laying out widgets

Hello,

I'm trying to reproduce a Visual Basic program written by a friend of mine
to show us both how useful Python is. I'm trying to reproduce this window:

    http://24.66.42.86

I've read the wxPython tutorial and tried searching around the web for more
information (ie. chapter 20 of Python Programming on Win32), but I'm still
seriously lacking a clue about how to layout that window, ie. best layout
management style, and how to go about doing it. The tutorial and the book
chapter are not very detailed (to put it mildly :slight_smile: in explaining how this is
done. Also, I've started looking at the wxPython demo code, but it still
seems a pretty far cry from showing off this somewhat more complex widget
layout. Of course, I'd rather not have to specify pixel coords if possible.

Any ideas for how I can get started with building this window, any sample
code from one of your projects that contains something similar, and maybe
just general tips about laying out widgets in general (ie. your techniques
for coming up with the best layout code) would be greatly appreciated.

Regards,

Brad

···

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

I'm trying to reproduce a Visual Basic program written by a friend of mine
to show us both how useful Python is. I'm trying to reproduce this window:

    http://24.66.42.86

I spent a few minutes in wxDesigner and came up with the window in the
attached image, and it also generated the attached code. Since the code is
machine generated it's not that pretty but it should help you get an idea
how nesting sizers can be used to create nearly any layout. wxDesigner
doesn't know about the wxCalendarCtrl so I had to use its Foriegn Control
capabilities and so what you see there is just a place holder.

Any ideas for how I can get started with building this window, any sample
code from one of your projects that contains something similar, and maybe
just general tips about laying out widgets in general (ie. your techniques
for coming up with the best layout code) would be greatly appreciated.

The best way to learn it is to just do it and fiddle until you understand
how it works.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

begin 666 Image1.gif
M1TE&.#EA!@**`?<`````````A @`A @`C @(C! (C! (E! 0E!@0E!@0G!@8
MG"$8G"$8I2$AI2DAI2DAK2DIK3$IK3$IM3$QM3DQM3DQO3DYO4(YO4(YQDI"
MQDI"SE)"SE)*SE)*UEI*UEI2UEI2WF-2WF-:WF-:YVM:YVM:[VMC[W-C[W-C
M]W-K]WMC6GMK]WMK_WMS_X1S_ZV<E-[6SO__________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M_____________________RP`````!@**`0`(_@!?"!Q(L*#!@P@3*ES(L*'#
MAQ C2IQ(L:+%BQ@S:MS(L:/'CQ4!O(!!LJ3)DRA3JES)LJ7+ES!CRIQ)LZ;-
MFSASZMS)LZ?/GT"#UE0A$@;(HTB3*EW*M*G3IU"C2J5(=.34JUBS:MW*M:O7
MKQ.K&GT1H*S9LVC3JEVK5D ``@$$P"4@]ZU<N@3RZMV[MP`!OWX/_!5\H$#A
M`X<1*UZL&,$!QY /*' \N3*"R@HR:]ZL8$'GSYY#+VBP8+1ITJA3-UC-VD$#
MU[!?PW8`P0'MV[5S0] -(4+OW[XC!!<>04*$"<6/*Y\P00)S"A(H3)!.O3J%
MZQ0J7-=N@4)W"Q6^_E^H<,'"^/+HS5]8?P'#>O?PVU_(X)Z^?0P9[.?'G_
M?PWY`2A@!AIPD,$&!2;(08$+<N#@@PYV$"$'$E8HH0<=?-"!!QIVR.$''X+X
MP0<@C%CBB22&\$$((+ H0HLOBA""C#2*0.,(-N*HHP@ZCD""""3X*"0)01)I
M@I$D'*EDDB8TZ>0))D I9912GF"EE2E@>4*67'*Y0@I?A@EFF&2.:>8*80HD
MED!LK>567'"Z)<"<<,EU5U]XY@787X,-%IAA@"+FV&*1%?H89)-=AH"BFGFV
M66B@15J:`J259MIIHZ7FVFN<QC:;;+7=AIL#$>!6:G# ]38<<<H)AQP%_LM%
M`"MUTTU7G:W897===[MF=P$%OYYGWK#H%<N>>_+)5]]\\^'GK'[^11LM@ %F
M8"" #2JX08,<; LAA1."ZP$''W PKH8<9IBNB.R2:.**[I:H(HLNP@@"C3/.

&.._/Z(XX\`#UDDD4@F:3"43$ZI<)547NFPPUF>L(+$$H-I,9ICDHGFQBNX

M@&8+:'HL<@LND&QRR2B?3/(*:A;%9IMQQBQG77B]A1=>=^JI\YY__GF888D!
M_5AC0T.&Z&6/8<8HHXY*"IIGE5***6JGO99I;)W*!BILN=E66ZF]T08<J:JJ
M*EQOR+D:ZZO'32=K=+;B>MUTW'FW7;!VGP>L_GG &LM>LN_)EP&S^+4WN'[\
M\3=MM=06:"V!VUJK0>0.,NBM@QM(..&XYYIK+KKE@JCNB.R6R*&*\,*K8HP?
MR'COC*_7& *.-LX.Y.W_`NFC[D3Z2+ )(AQI\)$G)%D\\5$F;V7#RT.LY<1@
M;CGQEQ*7R?'U'V\,LL<==PQR3 !XW+)59+EIUILQST6SG7GEK)=??/+\%V""
M%6#_SX@);5AD0Q_J/])+4UIF'+6 RWSF:9T)3:6HQL!,78TTGM*:;63CM0IV
M;3=D(UNJSL8J5:6M5<AQ&ZRF`[=;Y>J$O;(;>?)F`;ZAASSJ4<^Q`J<LPAVN
M<-#*H;2HM8%J]=! _@VRUK88Q*UO:6Y"Y=H0N9;HH1&-KETE>M>)YK6B>ZTH
M1K"3G8UX5+M^<1%@O/L1\(1GL#(.SWA-.M["F/<P+3UO2Q5#4QPQMK&,<6Q[
MW5L!'EW@@K$LA"@D&]]88 :G0@H@!C&0DUW4=Y=#)E(OB,33G@I#@,-4,E"(
MS.1C$$DT0P$0D4O+9"8-Z#1(*3"!I$'DU%#C@ =F[5.VH0T%+W@;WV0051Q<
MU0=!**OEE%!6<9M;KK2CJ^X0\SO "D\RBQ7#OR4+6<LJ' ZGN1]I^8=:!*K6
MM;8I1 85R%N7.Z+G+D2A<RE11!EZXH= $")YP<N=5JQ7%O/5Q1',:$>Y_LM=
MD<)(I.#]#DE+.AX)%#;0AAGT2A&#(Y<H!KTY5L^.UP-91$?6/3\JA"CB>\&:

^LB@R`(A<WR+91X!(0C(&\4LI8 SCI\,@$F@OY>2@/$D9!(#2,HBL3$X]

M8T!3)C"!H^E,`U39P-6,QC4+V%0$)QA+487J@E^+*B[+QBJUK:V7T@'FK((I
MS!/RJCMX"Q8,@V4>\JQ'ALZLX;(&1TW$Z?":_\GFM7XX.2 2D8B7`Y>X'-0Y
M=9%K=.HDG;O>J;K6M<BP(8 =/;6XQ1G]R$9@C.SNQO@[?PH/>6@T7D$9UD;G
MP;&ATZO>'.T(T>SA48_>*YD?`2"2@;"V98'4_JC+.,H6],$II'%9W\T<&=*\
MF!1^/*O?)5E:&$X"S3"<+)J@"G493N(T!IFQ*70'>$"?BD9J"T!D43,%P=4H
M58*S@<#6: DV#4XUEV=+FWJOFE7JE- ZV*E;"I$)'K+:]SQ^BT^RV-JL&Q[N
MK7"-ZP\)!,0#V;5RF(/0MC0GSG&1LUP8`A&YT$DZ#IDNBJD[[&%?-*,KQFZQ
MMJ,=/GD4,(#UDV"^*]B2B+=9Y5'IH)Z-&&BEER4ZG@E[V=N8Q_"(1XN^]@4_
MEFU&-VH646:RR$=V)$@?N>3>EC23)_V+**4<4R/'`+E73LP!9"K*H8G2,:"\
MZ4T5L%-1=L;(H1'E_FB(NLJDML;-2YU-!9U**MJ +6SG7555USO"$990A-:1
M&W9XI<RP>D=8B&:/>9 UP_BPU;_]=:LULUFM;#H.00<>8H*_]2 '@RN)$ YU
M8$,4(A6AB(KT0BP68[0O?=$NLB2^W3Z/Y,_A6?9@3-*LBYO7V1A3K,9Q?&@=
M<9R]'7=O9'TL"&N#+-O8$KDLB%RRM,\2;5&ZY<ER":E)MXW2]T7RI4\N0)7%
M'0-"D7O+Y9:N=#<9`^G>U-V9Q$QF<IK)[,; WF>^-YM3<]1^OQ*\K@D5G6D9
MM@U2E3CKM6H(>RG"6G55F,?<C@J!Y9T5NK"9?J,ALOC[Z/[.!UJ*"W#C_AYW
M+9)_$XC<"F>X/.=@SF7HKQ0F]6 Q#$\2B>"**W*1SAG+(U?S:W>[&QB0^DG&
M,JYXH$C?-6?;&+&%?I:AT;,>L5'+,>[M<046%0BSA<PRV9(/R=*.-F^KC5NZ
M6!G;3_8M2LF=27)3^=Q5QA^ZY[YN4 Z-S._&NP$OXQDCX[WO^D:S=MO,&D
MFZE,?:H%[2PVL.79;&9;+]N><YRM0N?A*+0;KWY5Z(LCVJP9AZ;@#,<L^T0Z
MY)/.9@]5S\T@=@O!FWX0@QT$X25&^',3YM"'2.U.4U-QPU:DT8>[N$5[^NMV
MLI:U[U*<I%L'E$E1*NAFJT3]7C<TZE"GH_9Q_GQ:BHHLZ\MN+6Q=(,B7A3T&
MYX<V^JW]EM[:Y>QICZ3;P5WE)Z-;:,4M-Y?UW^ZDH?O=.45*>#=OT%5F!7AO
M"K1O5=-=W15G6S-G7>-X=H9GP*%GK1(KR]%G6A4=)C1,=C-H>4-QB+8W9U6"
MSQ0XCD9ZIB=IJ$=IV#0@K5=7UI)R"J97X^1IYB1J%-8N'D!SI -/JV,OBL5J
MKG9/6_1%RE=B0Q<D9%1T1W<\2O=BO=9T"O5KT$,FPC9U$F5:(;,]+>!CK15D
M&-5USY9^9!<79.=(;M%;UA9EW[9V;^@7<1=W^3=W^X=N8-9N8=9N>A==!)AO
M?_=W!FAOA(=4W]4I_K"4>(NG&[=D<.B%<) X>6_3<(&6>;VB';\"5A5G7V.5
M<7_#:!RG@FT%8"+W.)=F8)+S>I;#:3;X8)Z#+N0283L8(H-56!M613>W<\-7
M(S*R(S^7?$('/$8")$?'8M$7?0HCA;T&1U8R8Z$E)MM';"!S=5Z(=:XE?D#6
M6H!$?EXW2.J7?DV6ADN6;9GD2.T3?]UF9&Y';O-7;FQG7,G597EH=P%(;WS8
M&0;D=P:8;T2E@/SV9H<G9[7Q&HH7@;EQ*AND9[NT< PW0J\":%PE<1]H3"'(
M-R[4B:"G'OH5']$$:9(V:2]X(/G10X[C>B='@RNW5^"B1#G((1.F3E%T_CJ#
MY7LIXF%#J"\XZ8LA<'Q@%'1!AV(%8W1)IVM2,GW5AU!(N5!7>#%9J#%W5'6H
MM3+?UQ!C6'ZTU5$>E977MI7J<S->R2<ZHU(L%2ADJ1A",RC*52@*<"B6T9:D
MU#35A4"3<BG;Q4H/Y("(IWBC@D&VY(BK$GF1&"O4H541*6@2MWG9`58K]$+,
ME%:-MAZAZ)$?:4TAB2VJEXJ4\WJQ%RZ>5GL=`G/KLGL55HLU-R_Q='/"AR^-
M57Q>I$]A%#RU)D;_M&)JE$;*0WULY$; YHRCQ3&E56PATX45194`X&RS14@R
M$R=U0A<CM5MY`I8\,Y;U@S^!TC\S)2A%8S1K_NF6\B9OUB4I4%,:"[1*K.1=
M1_5*X<4UBR>!OT&!PV$VO,1+[05,'.AP\%5,((B)%&>1B696: 4X*&A#HIA#
M+8A-EF:*!Y:*0@1["39[?+57$+8AH3,ZHCES(X(Z&I:+B'4O,(*3-6)/7@2,
M00>;O:-B9T2;1#E]N:F;S:A0TW,Q-_:;5)=CQH8R,* ".)JC.JJCX4.&Q]E1
MZ*-(==*<-N,^7@E<*C4_?E*6^=.DV.E);,F6`:0H!/26X"E4"B2>4V,:ANA=
MZ EP`X<;!VE>!P>?K+)P"^>06B4KE9AY7Z5YR42")(AQBQ:@T22@*SB9.]0?
MJR<@!D)7KY>*FLF*_CBX1!WP<J&V+NPB<X1%D\#78?04.\2'(T:(3Y)E8@-#
M,)KZ?"R6C+QVE+XV,0PUJM'XF]3H/=T3?JJZJL7)C64(,V^B2'5!)W;12%\)
M/SN34I14&,1U7%K&/];Y/TD#0 *D&3T5E]85GEOZCYKB9E\:2^(%@:/2E^Y9
M@<.1<*VBII?G<&R**[82<1^(-V"EF(SIB<XD>AWGD2'7@BZH3:8(J(**DGIU
M1)K3<KC7(8 U(NOT+OR*:KCH8:M&3R#*1<C7DY<Z,)15C$D'A0BS1E.H)51(
M/=!X8TZI/=BS1R>36AJ+,AIKE6WR4;'Z%G!2,^=X)T:*I/)S/Y<D=[[:_J37
MR5QKN2B2,:65X2C'>J6F@:5T637GV1H!24%T-JU113:X])=[IC9I6GE899^&
MZ8$4J9C+Y'G-A%:BEX+4='JIMS@C1SDEJ6F70T000DZ=:7L2&HNS.)I19&KN
MXB+PPF&IZ:&U(V)<I"/^HH0EJJFS>:+(&(57LJ(.<WVD>C$5RWVH)3*%>VQ>
MB&P;VP)6"1:.^[B0&[F2.[F4*Q4;5;F8F[F:N[F<V[E;<;F>&[JB.[JD6[JF
M"[JFF[JJN[JLV[I-@;JN&[NR.[NT6[N-:[NXF[NZN[N3"[N\^[O &[S">Q2^
M.[S&>[S(F[P'4;P,@8W8&!'.J[S2.[W4&Q7,_KL00?:\$!&]U=N]WON]&G&]
M"I&]%"$2XJ>]X)N^ZKN^!2&^"6&^6G>-81B_0*9L]4N_RZ9UYOM:6\>^_ON_
MN^N[.XJC!@&_]WN^!TR_"CR_!&' #/R\`QS!$CS!%%S!%GS!&)S!&IQU`-S!
MI2O *%' \1N&X5>_\,N]"9R-_(N_"BP00O'",'P3*L#!XXL0Z/L1-WR^6Z>J
M+7R_#=R_$W'#-=S T#O$^BO$^7O$\DO$`3Q;[4O#3)R-/7S"/JS"/V; )LS"
M5>S!&@7%-MS#3 '$5^Q:49S%9>S#.?P00OR^]KN]-DR^8(S&<HS 2:R[((R]
MU[C >DS&1(S%#JS%_ERL)EY\$ S\%&*LO2ALPCK<QD;<O!*1O6M,R$:,P#5,
MQWR\Q;9[QXVLPY1<Q<_KP/G[P'$,P#/LQE+,QSM\RBJLQ5A,QH7<RBT<O9#,
MR#],PG-,PE<\QIBLRI!LRZNLR)*\QVQLR<*<NYH<R)1;RFH\Q2FLOR/LRH!L
MOXB\Q9]<PED,R[\LS7K\RMJ\RU0\S=RLRU'<R<%,S'+<Q.3SQ,A<N<KL$(4<
MS=L,S50LPM0<R_3<QV8<S%;<S'^,OZ$<Q]\LO_U\R=-<S(QLSN2,N\>\SI';
MS@WQSN=,T'-\S81LS4<LSF><PD@<SQ/=T6:,OJ+<T9]\R1(]RBCLQR2M_M!.
M3! .S="/V])X7,_OC- &?<]MG,8WS<R W,\K[-&^3,\A_='0#,:=#-(''=&1
M[+H+[=*."].3S,2I[,]%;=(ZS<,I7<_*QFS6;,M^G,1;7<8C?=%H+,X%K<2Q
MO-6]G-&UN]1,_15.W=;ZG-1AW,%L#==<\=9V[<QY;;TK/1!XO==3\=> /=A.
M4=>$;;F#?-B*C12&S:J._=B0'=F2/=F47=F6?=F8G=DW+-B+W=D=T=A6%MJB
M/=JD7=JF?=JHG=JJO=JL;=J;G=B>'=L9`=JM7=NV?=NXG=NZ?=JO+=N^#1*T
MO=O"/=S$7=R[W=N_G=P;$=S&W=S._=S0C=S*_CW=%L'<T'W=V)W=K"W=U-W=
M$6'=VAW>XCW>,<#=WGW># '>Y+W>[%W<YHW>\+V\?2W(-MS>]GW?POW>\;W?
MM^O74 P`^!W@`K[=",'9_-W=ZCW@"K[@B*3?;'S5RPSAT&O15HS+6>W5M+S1
MC?S(05S'$;Z]0&S6V>SA<GW7\]W%]<W@*J[B#O[&$O[0:EW$^ES,LISA#W[C
M0<SA$H[3'V[4S_SCBESBGWOB;PW@*W[D`][B%?WB>)S0.3[C$>W)O!S64?[%
M(:'C5 WEICS,0UWE#4WD_XWD8H[?2B["KZS+$(W2O\R_;#[%&+[/42[+BSS.
M!-W+)\S)>2S6:P[0_N.<RV9MT5[-XU],TZ/<U&">XF.>Z.1=YMT<SM%,R2,=
MTCXNY5)]X6,\SR7-S[<,Y'^<T ,-UAQ-T^;\PS%-Z+O\TH=.R(J^ZN+-Z%!]
MP"4<T"6-RSQ=Z%1-SN"<S_(\UO_,Z14NS+3>S*".U:(>ZSA^U+YNZVZ=Z@7,
MZLZ.W:Y>Y\R,Z;^>S[5^ZCL>YT!-U!2MT];NS1PMU#:=YN$.RQH^[EWNY)";
MX,_>[KH=[0O,S=J.S\0<U'0NT;B^[>!NS[XNZOV.RH+NZ#[MT36-U=^N[%[!
M[NZ^\+4-[Y0^XB0=Z6(MZ9C\YB,>U6<\Z=7,R6I>QW:NYXD,YR)NX2)O_O%+
M?-:!CN=,ONSIS-)ASO PG]L.#]_J/A5"_L',KFPQO_.V/?/>'>*>K? \/_2A
M[?,'+MM"3_1*W^ %#MM'/]U)O_1$;_1/W]E1+_4\3_55K]A7C_4QK_5;3]A=
M[_4,#_9A#]AC3_;N;O9GG]=IK_;/SO9M#]=O#_>L+O=SS]1U;_>*CO=YS]![
MS_=C[O=_C\R!+_A(3OB%S\6'C_@K3OA63<N2#^,KO_C)G/,-[/A*#_E8WODW
M;_F&WO+^C>B:O_.<+^,<7O.@S\Z8[UJE/_2G_^J^O,+[*]#=#.M<W>9ZO?I8
MT?BOG^1-_Q 17, >_\SS>_S''_&HW.@L#-$:_OS\T!_]TC_]U%_]UD_]L.W[
MOQ_@\#[#)V'3>2[O*)WOK-SK%&\0,9S^ZK_^["\3G*W]VW_?W9_8("W^_X[R
MES[40?WYO/_=V0\0`%[ >%'0X L5! \:!!##X4.($25.I%C1XD6,&35NY-AQ
MH\"%!1.&)"E28<D7( ^"%-BRH,N4,5_*I*ER)LR8+&?FW(G2YT^@084.)5K4
MZ%&D25&._*E"X,F#3$,V]%C5ZE6L6;5:M1D5:M.O4P&,U<DSI4J7:%^29;@0
M)MFW.UEV55K7[EV\>?7FE;KT*<F^*[<.)ES8\.&'=$T.#;SWIV+'D25/IES9
M\N*F?T,V?HG8\V?0_J$3E^1,.FQEN)=5KV;=VK57H$X'`CZ=4O1MW+D]0BY-
M^_5OX,&%#P_:VZ#LTZ6IZF;>W#GOVKZ)3Z=>W;ICXR(U+U3NW/MWT= 91>
MWOSY\MD1;H=-<CEX^/&UBA>J'OU]_/DMJT<N?:I\``/<S;3Q]#/P0 0EXX^]
MXVI[3T ((XR(ON+(2_!"##/<S,+U9MNPI <E%%% "F/C4$,44\QO00^Y<W!$
M&"$L$2P5:[3Q0!:3>S%&'N.;T:?>5!!R2"*+-/)())-4<DDFFW3R22BCE')*
M*JNTTLGH<O3/K1Z[_.['I;*$:TPRRS3S3#335'---MMT\TTXXY1S3CKA_FSQ
MP\SN;!!$+_MD#DP"20,`!D(+-?101!-5=%%&&W44AD$?E7122BLM-%)+,]5T
M4TX)U;,](!G$[#\_2PTOT K].A''06]<;U57@\J2P_[P)-547!$#=$ON6KW1
M*5CU`S96O&:-352$=LQU6<)VM74S7VT<]M=HB57*V#QUY)-9;N=#U415W6/+
M/;P@4VI:M\:=ZBYU\4+7VJ2P#?739+?M]MZJG'4Q7+=6(K>N=MVMMB>:_ 6X
M+;X&AM<H>?VBMSM\(^9(7U"A#<M<A.W"&*EW"091KXV+ZGCAHAH6]&%E)5;9
M(HKW%/1B<752BZVQ;E(L9*-&OKEFLW*JF>>6_LS%F3&%21[*9,"0A7AEIB=J

52+U^WWIIIDDKDL@_7266J>9I;K+(_#KFMDHX5"&EJ4[6UZ;8>>KO=EKC-.

MJZVR<*)K:**VGKIKNK]6:^^$@RW;H+-[3=L]MA./P>T@%;Z[;Z^MKAIP@6'>

VZJ)?\[8ZV+'ORGPJ-2.F7%5V9<3,LSYQOLNB?/.O"X[3;K9[\YQUMDSS]'

M*?3C1E>[=)5/YS==GL^J&W.9.1=[[*)36^OXV56W:<S.!?^<=^T.OQ7XX+^E
M$6YJK;^/;-UW#_-8[;GDWG3O@43=5?(SC+_\D+#O4%O$U^^>5_=5O?)_`!II
M4 $D( `'6$ $)O!)_O2"VLGPMSW]W4MX@JI3!2UX00QF4(,;Y."<&/BV>3U0
M?1'$UP231D(4KNR#6GJ68%+8+1-"ZX4S[-8*:>6[_-$P5S'LE0Y]:"H;HD^$
M+OQAJ7@HNB(FL4=!S!;_.J/$/AVQ=Q.:#Q2MJ!4FAM")MKEBCZ2H'2HN+E]C
MZ6(9/9)%APV1(6:,T1?7$\80?82-<\0(&AVXQ3C243YN= H<J4*6MI&1C!+)
MHQ[I:,>DI8^(A@P0'Q_TQ[8E1HR3#%$A&6E&1*)-C4^\)( <"<= `A*2DX2(
M)3MYQ4P:;I-</*6/VG<^08&2E)&D)"%;:<A4BDZ1:[PE?#Y92EHNIR&C_JQD
M+P]IOUKM*X?&?,XKG?E&8 9SD,2T)3,QB4P<0M":N?GE-KUYD5SV;I><_"9N
MNEE.=$(DG-E;I2G3V:QGMA")[Z3G.N^'1WJ>:HO[[&,^TVG/9%9LD?X\S#D)
MNDV 9G.$!S6,0=UY$4 R-(4)'2<K)0K/?<ISBM%\:#5G>5'N4;2=("V,0VEY
ME8Z2-&(BQ:=*MV+2Q?UQFH(L9$I=6D-L5M2F-Z4(3$<I1FIZE*>)8ZE&+3K4
M`654F2?D:"@%&4RA(G5M15WJ0J4ZL7A6M8=-_6A0)7E5HN9TI&#MB$]/.DRH
M?I6L4Q5K2]>J$9A2<III=>I.W[K$MAK5KF U_NA=K4A5@?+2KQ#-:F W.EA4
MYE6K@D5L3POK,J8V%HJ A:Q5)5O*QS9PGI=-(F4U2T[.CD:IA@5C:(OH61!:
M-K1QY<H@30M$Q9)VKU<UZV[4^MH^H79IN*TM2G%;*MV2SK0^E6EQ8UJ1V?[V
M.\']W7 SF]JM?O6G:*WEA)*K7.\P=YFOK>V8JIO'ZV*7.=K5YFJ?VSA9/I*N
M810OC\BK6LYV5Y)>)65XVXN;]P[4N:.M;'3/&LJT/M*U]X51?AG+W?.*B< D
M-#!H]VM4?MIWP;"%I1;UBMV^3CBL%4ZC6WF;8+]H>'T-/NJ#%\MA_XIXPX4-
M:'\/;&+21EC%P".Q_H1=FN$9JS"V+G:P>?G[V=+FF&TUQC"(8RGD(>\8R#96
M*8Z1C"\B*]?)3\8IBA,YUM].F<K,BG*6C1S9+4NLRQ_^,70W&^:5*MG,/8[O
MEV6(9C&K>;<(+C-ZX9QF*VO2PW2&,(3[>>=[U;B#@R9TH0OMYA0#>EDDII_N
M[ -D:"J:6XQN]. >O>8@2WK1<A9?I:4%*SMK>M-Y5F69/1VK2X=:U+BB]*D7
MEFH%KSI7K7:UM6 =8EFSFM.UIM^MCYQKX.Z:UXX&=:R![2=:#_M7Q<;UL7,K
M;&67S==@=C9>2:W+5;JZ4]OF-J&T7&T()9M^G:Z.;.IL;'"[%]J;42 `_LE]
MM!29N\\GSG2Z"[SN7AG:3N\V6[R_;6_Y,/K/`?I@7OA-''G36\8`CY' F4R8
M@A?+WX@^,\,EY/ (1?PNP0H84*:'G7];?+GXGJ=WD0L7`)<2Y5VEB,;M`JO-
M48Y@MZM/R$7N'(Q_%+GL?4_/63X1E]<%YAY?5\P%1O'#WCS<)-]H1]5[TED.
M4YAY#/JUAK*SN?3K;^/Z6==KCO1Z*QU .5_Y;6,Z5ZC[W+4#5N?!@<+QXD5.
M;AZ+B^30=^YFBYW@3"^M,%DF7;:;'*W4E4C5XW64N=#L<G)1O-UQEO 8^_GA

M]*SJ.)$<+[G(J#;[G;08=XNA,/:%5K7<$<_H;W7U,^X'R/M-EW[G?7T[?M

MEAGZUU1G>LQ%S^YY0CVU50\>LKO^\IF_O'2A/OO*P'UZ<5?>6QI?>M[/.\8#
M_SWP6?_GB,9^[8&/*M4][Y/O`P?R/'XF]:N?W>M/OO+A+PG[7S-^2$O^_/&Q
M_-YI/_'>OWG^([^V.+-M?OISO_K!/^DCO];;O^80./,0P(5@0-: /TQ;. 3$
M.=;K-@L\E/M#$0B<-OV;P/%BO5.#@78;022Q.0\L#'$K'WU;0; [P!.\C12,
M-@UDMM1[01@$01G\M *I01L,C1C,00SAP$3KP<_X02!,$"&L."(L0AP\PAG<
M0=];0L0P0B<TD"0\_HXJS$+K:$(M1$(:)(D+#$,Q'$,R+$,S/$-*Z3]V,K4N
M7)$O;$,X%)8;JJ@X]$(HK$,\- \64K@\E,[[$- 1+@YS+9 ')\W+$1$?+]!
M9,-$'(XK;$1(I(P]C#'J(8J-P9E*;,1'C$1.W(M)-,"/RPN\&<4VW,1./$6[
M^$1("\5RN3I7[$)31$59/ I5C$!6Y#JOZQJTP,6LHQRNLYG7B;98G$5BK(]%
MA+!,C)SD&3VYPXG744;3<\)A+$9J5,-[0D:#H9[6D9V928V;60GG&3U8/,1J
M+$=P:2)L1)BNV$;2ZYM@G#FQ6)X<W$0TK$='P1A[1$-\S$=^1!1SJ<7>_@A%
M:%R=GN'&?^F)N* Y3Z-'DH' @G# U7!(PPO"?SQ&A;M%<5Q&=>1%L5G'C(1'
M(&3(5\-'`@1#HW%(@(1(<\P;<B2<AB1)#83)D;3&%HN_E8S(EGS(EP2_DAS
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
M:@5%Y*7>3F\,[ZV646\>Y]Q>Y])L;W0.F+C6S24>[. &Z.$6:!*EZ2,4K?,
M#YQNZ>Z6J.]FEP2G'P,?</.XXUK];X3&P#B.:(9><(9J< U/7@NGZ `WM0(M
M: E'8)D688TIY1 ^<*+K[P8V:<64\00VY9VF5M.^9]06[Q6?<9J.<*Y\1@+W
M8*)[ZZGLRKUL\5 ^_I@'IV<./R@/+W(E?V ?CV12UFC1YE\`MO)HW.\8'V&=
M!KTFO\L0?VF?1F$A7^&Z%FO3/._:O!J@#NI(9FRO2PNB#N>CAO&.?.K>]N;;
MC$W%1N,ZAO/ZSCVNMN:L3L4G)Z@HE\RJO-(U7VU1QM+GOFRP5&="A^X@WLXA
MIDO_Y&(GE73G3L[:\60NYN^CXVD3/O-I[DM!9L?45F0R;<U>1M!+[-!D1G7;
M%N09CVQ55M,_GFVU+NY/WN,H15'-]DM5CV96C^GJ+O3FEFDU!NS:-NXH'?9J
M%](MAV=>)^/=6V[=(W:^,78B/\X$=VFSAFFTUFYL9^6[+N7K/F6]ADQS_G_M

9T7O9DR*'N:5].+=9U!%U2P=Z<BT;WPE9WC<7(/ZY2_M3I-P_E1_](UP9G

M7T9G8A[K_F;-<A[O4(?37V[F2H?/KM;XI$Z8,D_W9E_W3AQSS5WV'$_H#"]$
M"A=>@_=NPP;?#S^UFF?PF\]YZ#WY@T]Y[:UIG[>T1?>G1E\-EB]Z!0=ZFT=X
MG*=QIJ^1G>_PGG_%AS]B]5YAK9[Z8'5YX=9QXK9WW7[17_;Z175ZGH=Z+8]V
MT9OOLT?[9P5[`!?[NF5D6/::*^5RN2^WH\^GI'_7V/[SV=[[I>_[5,?QL(?Y
M]?7L^S;2/H[\-4;\\ZAZ*+]ZJZ3\D/Q[>@I\_G'1_"JT?$;'?-#?<+6W>K8O
M?404?:0G?=7O0]8'?-=_?3R,_<Z??=J/0]M_)\_/?2W<_73J?=\/?<[G?=P?
M_M\O_N _?N0G_M.__-1O?C@$?G02?NF70>HO)^N_?I)5_NIG?N['?N_7?O /
M_^Y__M&/?O.7QO'_INT_1::UP'V,_VVCN>QW__*7Q:CW1%E]UKP!" `O8+PH
M:/"%"H('#ZH`$.,AQ(@2)U*L:/$BQHP:-W+LR!$&R) B0PY<R%"AR90J5[)L
MZ?(ES)@R9Z*<:?-FS(8L:^+LZ7.A3IDZ>19,N+*AQZ1*ES)MZA3CR*@@2ZHT
M^O,JUJQ:81+=ZO6H_L"57;^291@VI\"N5E,B?>KV+=RX2Z5&I<IV;-F\>O/B
MW;LUJ,J^?K,"ACGT+EBYBA<SEDMWI%V3:P=3KOQ3L.6>A4UBSGQSL\O#DO&V
M;6SZ-&JHCTF2[NSYM6?7*<^^H)T9]$'9+ 'P#FM[+VZ6HH&2=ICZ.'+4+M,>
MU0W[^5[G!VG_;ED=9_""TDU2KVTY>U7FHQ,G+V\>[L#'P\=#;P]]N_>SUU?.

_G3NW^NS%4^<_'D!"NA19$#YQYY["68&GT#R]6;0@]X5U"!_:.UTU6^^

M\0:A@Q6&YJ%9!195W( EFGB1B :M]Y^"+5*VG7P30BAA?#."^-)]&.H7_J-O
M--X8WDPKC@C@B46>F&)1![+H(I-\W12CCU'RJ%6./V48I8^]_=A?D$H.&9Z1
M89I(E0IEEIDDD@CAUR2;%]JD98\R3BDGE?6M*>-"#<Z(YY;";2FDFD2*.6AR
M=IDY%:!?MKDH5M+9IB>=D6[8)UAN^M0=I#5J2B-V?WH9*)B$BHI<9 DIE"BH
MC*K:DZ-YUA;AJPY*"&F<0MF)E99\;CAAAU>!QZ5:)(XZ[&D%HH3J9*LJ&].=
M"5:Y+)"VIIBL6<1:RUB:R#8++9/;MO<LMP9V.:VPUYK[5K:?*AHNNYRU*ZY8
M[X8H;;""GGNO4@B9N:^9ZJ8J[[O>0@?NN*_O8IM2H:AR_#2<'Y\(:M`0RP
MP,\1W*[!XM9;U<0=7]:<Q^U6#-O%[&8<XL8IK;8RRRV[_#+,<L\,\TD535R
MR(/!P"_//?O\,]!!"\VOG4,;?3321WM*;LY-`X>STWE!/#7555M]-=9P[I8U
MUUU[??6X*4<]-F%0DWTVVJ\!FG#:;8=FMMMQRUTGTW/;??/=>>M-,L)P[[TJ
MVW\+/KBO?1-N=^"'*[YX2VO[S7B+B4,^.>2.4XZVY)=K+KCEFT>=N>>AS[UV
MTJ6;?CKJJ:N^^NJ/B_ZZLH#6/#OMM=M^.^ZSP[Z[WJCR_COPP:OMK_#%&W\\
MW:XCOSSSH?O>//311D/_O/356P\\]==KO[WFV7/_/?B#Z\0Z^>6;?S[ZZ:N_
H/OOMN_\^_/&[_S7]]=M_/_[YZ[\___W[_S\``RC `1*P@ \+" ``.P``
`
end

begin 666 quickie_wdr.py
M(R$O=7-R+V5N=B!P>71H;VX-"B,M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+0T*(R!0>71H;VX@<V]U<F-E(&=E;F5R871E9"!B>2!W>$1E<VEG
M;F5R(&9R;VT@9FEL93H@<75I8VMI92YW9'(-"B,@1&\@;F]T(&UO9&EF>2!T
M:&ES(&9I;&4L(&%L;"!C:&%N9V5S('=I;&P@8F4@;&]S="$-"B,M+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+0T*#0HC($EN8VQU9&4@=WA7:6YD
M;W=S)R!M;V1U;&5S#0IF<F]M('=X4'ET:&]N+G=X(&EM<&]R=" J#0H-"B,@
M5VEN9&]W(&9U;F-T:6]N<PT*#0I)1%]&3U)%24=.(#T@,3 P,# -"DE$7U1%
M6%1#5%),(#T@,3 P,#$-"DE$7T)55%1/3B ](#$P,# R#0I)1%]415A4(#T@
M,3 P,#,-"DE$7TQ)4U1#5%),(#T@,3 P,#0-"@T*9&5F(&UA:V5!;&%R;4-L
M;V-K4&%N96PH('!A<F5N="P@8V%L;%]F:70@/2!T<G5E+"!S971?<VEZ97(@
M/2!T<G5E("DZ#0H@(" @:71E;3 @/2!W>$)O>%-I>F5R*"!W>$A/4DE:3TY4
M04P@*0T*(" @( T*(" @(&ET96TR(#T@=WA3=&%T:6-";W@H('!A<F5N="P@
M+3$L("(@3F5W($%L87)M("(@*0T*(" @(&ET96TQ(#T@=WA3=&%T:6-";WA3
M:7IE<B@@:71E;3(L('=X5D525$E#04P@*0T*(" @( T*(" @(&ET96TS(#T@
M<&%R96YT+D9I;F17:6YD;W=">4ED*"!)1%]&3U)%24=.("D-"B @("!I=&5M
M,2Y!9&17:6YD;W<H(&ET96TS+" P+"!W>$=23U=\=WA!3$E'3E]#14Y415)?
M5D525$E#04Q\=WA!3$PL(#4@*0T*#0H@(" @:71E;30@/2!W>$)O>%-I>F5R
M*"!W>$A/4DE:3TY404P@*0T*(" @( T*(" @(&ET96TU(#T@=WA497AT0W1R
M;"@@<&%R96YT+"!)1%]415A40U123"P@(C4@.B U."!032(L('=X1&5F875L
M=%!O<VET:6]N+"!W>%-I>F4H-C L+3$I+" P("D-"B @("!I=&5M-"Y!9&17
M:6YD;W<H(&ET96TU+" P+"!W>$%,24=.7T-%3E1217QW>$%,3"P@-2 I#0H-
M"B @("!I=&5M-"Y!9&13<&%C97(H(#$P+" Q,"P@,2P@=WA!3$E'3E]#14Y4
M4D5\=WA!3$PL(#4@*0T*#0H@(" @:71E;38@/2!W>$)U='1O;B@@<&%R96YT
M+"!)1%]"55143TXL(")3970@06QA<FTB+"!W>$1E9F%U;'10;W-I=&EO;BP@
M=WA$969A=6QT4VEZ92P@," I#0H@(" @:71E;30N061D5VEN9&]W*"!I=&5M
M-BP@,"P@=WA!3$E'3E]#14Y44D5\=WA!3$PL(#4@*0T*#0H@(" @:71E;3$N
M061D4VEZ97(H(&ET96TT+" P+"!W>$=23U=\=WA!3$E'3E]#14Y415)?5D52
M5$E#04PL(#4@*0T*#0H@(" @:71E;3<@/2!W>%-T871I8U1E>'0H('!A<F5N
M="P@241?5$585"P@(E)E;6EN9&5R(%1E>'0@.B B+"!W>$1E9F%U;'10;W-I
M=&EO;BP@=WA$969A=6QT4VEZ92P@," I#0H@(" @:71E;3$N061D5VEN9&]W
M*"!I=&5M-RP@,"P@=WA!3$E'3E]#14Y415)?5D525$E#04Q\=WA,1494?'=X
M4DE'2%1\=WA43U L(#4@*0T*#0H@(" @:71E;3@@/2!W>%1E>'1#=')L*"!P
M87)E;G0L($E$7U1%6%1#5%),+" B(BP@=WA$969A=6QT4&]S:71I;VXL('=X
M4VEZ92@X,"PV,"DL('=X5$5?355,5$E,24Y%("D-"B @("!I=&5M,2Y!9&17
M:6YD;W<H(&ET96TX+" Q+"!W>$=23U=\=WA!3$E'3E]#14Y415)?5D525$E#
M04Q\=WA!3$PL(#4@*0T*#0H@(" @:71E;3 N061D4VEZ97(H(&ET96TQ+" P
M+"!W>$=23U=\=WA!3$E'3E]#14Y415)?2$]225I/3E1!3'QW>$%,3"P@-2 I
M#0H-"B @("!I=&5M.2 ]('=X0F]X4VEZ97(H('=X5D525$E#04P@*0T*(" @
M( T*(" @(&ET96TQ," ]('=X4W1A=&EC5&5X="@@<&%R96YT+"!)1%]415A4
M+" B270@:7,@;F]W.B T.C0R(%!-(%-A='5R9&%Y+"!-87)C:" Q,"P@,C P
M,2(L('=X1&5F875L=%!O<VET:6]N+"!W>$1E9F%U;'13:7IE+" P("D-"B @
M("!I=&5M.2Y!9&17:6YD;W<H(&ET96TQ,"P@,"P@=WA!3$E'3E]#14Y415)?
M5D525$E#04Q\=WA!3$PL(#4@*0T*#0H@(" @:71E;3$Q(#T@=WA3=&%T:6-4
M97AT*"!P87)E;G0L($E$7U1%6%0L(").97<@06QA<FTZ(#4Z-3@@4$T@5V5D
M;F5S9&%Y+"!/8W1O8F5R(#,L(#(P,#$B+"!W>$1E9F%U;'10;W-I=&EO;BP@
M=WA$969A=6QT4VEZ92P@," I#0H@(" @:71E;3DN061D5VEN9&]W*"!I=&5M
M,3$L(# L('=X04Q)1TY?0T5.5$527U9%4E1)0T%,?'=X04Q,+" U("D-"@T*
M(" @(&ET96TQ,R ]('=X4W1A=&EC0F]X*"!P87)E;G0L("TQ+" B($5X:7-T
M:6YG($%L87)M<R B("D-"B @("!I=&5M,3(@/2!W>%-T871I8T)O>%-I>F5R
M*"!I=&5M,3,L('=X5D525$E#04P@*0T*(" @( T*(" @(&ET96TQ-" ]('=X
M3&ES=$-T<FPH('!A<F5N="P@241?3$E35$-44DPL('=X1&5F875L=%!O<VET
M:6]N+"!W>%-I>F4H,C<P+#$R,"DL('=X3$-?4D503U)4?'=X4U5.2T5.7T)/
M4D1%4B I#0H@(" @:71E;3$R+D%D9%=I;F1O=R@@:71E;3$T+" Q+"!W>$=2
M3U=\=WA!3$E'3E]#14Y415)?5D525$E#04Q\=WA!3$PL(#4@*0T*#0H@(" @
M:71E;3$U(#T@=WA";WA3:7IE<B@@=WA(3U))6D].5$%,("D-"B @(" -"B @
M("!I=&5M,38@/2!W>$)U='1O;B@@<&%R96YT+"!)1%]"55143TXL(")6:65W
M(%)E;6EN9&5R(BP@=WA$969A=6QT4&]S:71I;VXL('=X1&5F875L=%-I>F4L
M(# @*0T*(" @(&ET96TQ-2Y!9&17:6YD;W<H(&ET96TQ-BP@,"P@=WA!3$E'
M3E]#14Y44D5\=WA!3$PL(#4@*0T*#0H@(" @:71E;3$W(#T@=WA"=71T;VXH
M('!A<F5N="P@241?0E545$].+" B0VQE87(@06QA<FTB+"!W>$1E9F%U;'10
M;W-I=&EO;BP@=WA$969A=6QT4VEZ92P@," I#0H@(" @:71E;3$U+D%D9%=I
M;F1O=R@@:71E;3$W+" P+"!W>$%,24=.7T-%3E1217QW>$%,3"P@-2 I#0H-
M"B @("!I=&5M,3@@/2!W>$)U='1O;B@@<&%R96YT+"!)1%]"55143TXL(")#
M;&5A<B!!;&P@06QA<FUS(BP@=WA$969A=6QT4&]S:71I;VXL('=X1&5F875L
M=%-I>F4L(# @*0T*(" @(&ET96TQ-2Y!9&17:6YD;W<H(&ET96TQ."P@,"P@
M=WA!3$E'3E]#14Y44D5\=WA!3$PL(#4@*0T*#0H@(" @:71E;3$R+D%D9%-I

F5R*"!I=&5M,34L(# L('=X04Q)1TY?0T5.5%)%+" U("D-"@T*(" @(&ET

M96TY+D%D9%-I>F5R*"!I=&5M,3(L(# L('=X04Q)1TY?0T5.5%)%?'=X04Q,
M+" U("D-"@T*(" @(&ET96TQ.2 ]('=X4W1A=&EC5&5X="@@<&%R96YT+"!)
M1%]415A4+" -"B @(" @(" @(EQN(@T*(" @(" @(" B5&\@8W)E871E(&$@
M;F5W(&%L87)M+"!S96QE8W0@=&AE(&1E<VER960@;6]N=&@L('EE87(L(%QN
M(@T*(" @(" @(" B9&%Y+"!A;F0@=&EM92!A;F0@96YT97(@86X@87!P<F]P
M<FEA=&4@;65S<V%G92!I;B!T:&4@7&XB#0H@(" @(" @("(G4F5M:6YD97(G
M('1E>'0@8F]X+B @2&ET=&EN9R!T:&4@)U-E="!!;&%R;2<@8G5T=&]N('=I
M;&P@<V%V92!<;B(-"B @(" @(" @(GEO=7(@86QA<FTN(BP-"B @(" @(" @
M=WA$969A=6QT4&]S:71I;VXL('=X1&5F875L=%-I>F4L(# @*0T*(" @(&ET
M96TY+D%D9%=I;F1O=R@@:71E;3$Y+" P+"!W>$=23U=\=WA!3$E'3E]#14Y4
M15)?5D525$E#04Q\=WA!3$PL(#4@*0T*#0H@(" @:71E;3(P(#T@=WA";WA3
M:7IE<B@@=WA(3U))6D].5$%,("D-"B @(" -"B @("!I=&5M,C$@/2!W>$)U
M='1O;B@@<&%R96YT+"!)1%]"55143TXL(")!8F]U="XN+B(L('=X1&5F875L
M=%!O<VET:6]N+"!W>$1E9F%U;'13:7IE+" P("D-"B @("!I=&5M,C N061D
M5VEN9&]W*"!I=&5M,C$L(# L('=X04Q)1TY?0T5.5%)%?'=X04Q,+" U("D-
M"@T*(" @(&ET96TR,B ]('=X0G5T=&]N*"!P87)E;G0L($E$7T)55%1/3BP@
M(D-L;W-E(BP@=WA$969A=6QT4&]S:71I;VXL('=X1&5F875L=%-I>F4L(# @
M*0T*(" @(&ET96TR,"Y!9&17:6YD;W<H(&ET96TR,BP@,"P@=WA!3$E'3E]#
M14Y44D5\=WA!3$PL(#4@*0T*#0H@(" @:71E;3DN061D4VEZ97(H(&ET96TR
M,"P@,"P@=WA!3$E'3E]224=(5'QW>$%,24=.7T-%3E1%4E]615)424-!3'QW

$%,3"P@-2 I#0H-"B @("!I=&5M,"Y!9&13:7IE<B@@:71E;3DL(# L('=X

M1U)/5WQW>$%,24=.7T-%3E1%4E](3U))6D].5$%,?'=X04Q,+" U("D-"@T*
M(" @(&EF('-E=%]S:7IE<B ]/2!T<G5E.@T*(" @(" @("!P87)E;G0N4V5T
M075T;TQA>6]U="@@=')U92 I#0H@(" @(" @('!A<F5N="Y39713:7IE<B@@
M:71E;3 @*0T*(" @(" @("!I9B!C86QL7V9I=" ]/2!T<G5E.@T*(" @(" @
M(" @(" @:71E;3 N1FET*"!P87)E;G0@*0T*(" @(" @(" @(" @:71E;3 N
M4V5T4VEZ94AI;G1S*"!P87)E;G0@*0T*(" @( T*(" @(')E='5R;B!I=&5M
M, T*#0HC($)I=&UA<"!F=6YC=&EO;G,-"@T*#0HC($5N9"!O9B!G96YE<F%T
)960@9FEL90T*
`
end

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

Hello. I'm new to wxPython, and went through the demo program
(which is wonderful, btw) -- quickly focusing on the wx*Sizer
example to fulfil my current needs. My problem is sorta
complicated. First, I'm creating a table of wigets that is
data driven via an html-like syntax. The stock grid does
well, but it won't handle "colspan" and "rowspan". Am I
missing something? Clearly I could re-write the incoming
syntax into a bunch of nested boxes, but I was looking for
a more direct solution. Example:

  <table>
    <tr><td>WidgetX</td><td>WidgetY</td><td rowspan=2>WidgetZ</td></tr>
    <tr><td colspan=2>WidgetA</td></tr>
  </table>

Which is drawn as:

···

+----------+-----------+----------+
   > WidgetX | WidgetY | WigetZ |
   +----------+-----------+ |
   > WidgetA | |
   +----------------------+----------+
  
Thank you for any hints!

Clark

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

Hello. I'm new to wxPython, and went through the demo program
(which is wonderful, btw) -- quickly focusing on the wx*Sizer
example to fulfil my current needs. My problem is sorta
complicated. First, I'm creating a table of wigets that is
data driven via an html-like syntax. The stock grid does
well, but it won't handle "colspan" and "rowspan". Am I
missing something?

Nope. I would like to have colspan and rowspan capabilities in the grid
sizers, but han't taken the time to figure it out yet. There is a Python
version of the grid sizers in wxPython/lib/grids.py if you want to play
around with it.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

Hello Robin,

Sunday, March 11, 2001, 10:25:52 AM, you wrote:

Hello. I'm new to wxPython, and went through the demo program
(which is wonderful, btw) -- quickly focusing on the wx*Sizer
example to fulfil my current needs. My problem is sorta
complicated. First, I'm creating a table of wigets that is
data driven via an html-like syntax. The stock grid does
well, but it won't handle "colspan" and "rowspan". Am I
missing something?

Nope. I would like to have colspan and rowspan capabilities in the grid
sizers, but han't taken the time to figure it out yet. There is a Python
version of the grid sizers in wxPython/lib/grids.py if you want to play
around with it.

I use this in my projects. If there is interest i can try to separate
it into wxPython.lib.

class GridSizer(wxPySizer): #FOLD00

    col_w = 10
    row_h = 22

    def _add( self, size, opt, dim ): #FOLD01
        #print self.__class__, size, opt, dim
        c,r,c2,r2 = dim
        if r2 > len(self.rows0):
            x = [self.row_h] * (r2-len(self.rows0))
            self.rows0.extend( x )
            self.rows1.extend( x )
        if c2 > len(self.cols0):
            x = [self.col_w] * (c2-len(self.cols0))
            self.cols0.extend( x )
            self.cols1.extend( x )
        if opt == 0: # fixed
            scale = (r2-r)
            for i in range(r,r2):
                self.rows1[i] = self.rows0[i] = max( self.rows0[i], size.y/scale )
            scale = (c2-c)
            for i in range(c,c2):
                self.cols1[i] = self.cols0[i] = max( self.cols0[i], size.x/scale )
        else:
            scale = (r2-r)
            for i in range(r,r2):
                self.rows0[i] = max( self.rows0[i], size.y/scale )
                self.rows1[i] = self.rows0[i] * opt
            scale = (c2-c)
            for i in range(c,c2):
                self.cols0[i] = max( self.cols0[i], size.x/scale )
                self.cols1[i] = self.cols0[i] * opt

    def CalcMin( self ): #FOLD01
        children = self.GetChildren()
        if not children:
                return (10, 10)

        self.rows0 =
        self.cols0 =
        self.rows1 =
        self.cols1 =

        for cell in children:
            self._add( cell.CalcMin(), cell.GetOption(), cell.GetUserData() )

        self.minWidth = reduce( operator.add, self.cols1 )
        self.minHeight = reduce( operator.add, self.rows1 )
        self.fixedWidth = reduce( operator.add, self.cols0 ) # size without stretched widgets
        self.fixedHeight = reduce( operator.add, self.rows0 )

        return wxSize( self.minWidth, self.minHeight )

    def RecalcSizes( self ): #FOLD01
        #print 'r0', self.rows0
        #print 'r1', self.rows1

        # get current dimensions, save for performance
        myWidth = self.GetSize().x
        myHeight = self.GetSize().y

        # relative recent positions
        px = self.GetPosition().x
        py = self.GetPosition().y

        # calculate space for one stretched item
        stretchC = 0
        for i in range(len(self.cols0)):
            if self.cols1[i] <> self.cols0[i]:
                stretchC = stretchC + self.cols1[i] / self.cols0[i]
        if myWidth > self.fixedWidth and stretchC:
            deltaw = (myWidth - self.fixedWidth) / stretchC
            extraw = (myWidth - self.fixedWidth) % stretchC
        else:
            deltaw = extraw = 0

        stretchR = 0
        for i in range(len(self.rows0)):
            if self.rows1[i] <> self.rows0[i]:
                stretchR = stretchR + self.rows1[i] / self.rows0[i]
        if myHeight > self.fixedHeight and stretchR:
            deltah = (myHeight - self.fixedHeight) / stretchR
            extrah = (myHeight - self.fixedHeight) % stretchR
        else:
            deltah = extrah = 0

        #print myWidth, self.fixedWidth, deltaw, extraw, stretchC

        self.rpos = [0] * len( self.rows0 )
        self.cpos = [0] * len( self.cols0 )

        for i in range(len(self.rows0)):
            newHeight = self.rows0[i]
            if self.rows1[i] <> self.rows0[i]:
                weight = self.rows1[i] / self.rows0[i]
                newHeight = newHeight + (deltah * weight) + extrah # first stretchable gets extra pixels
                extrah = 0
            self.rpos[i] = py
            self.rows1[i] = newHeight
            py = py + newHeight

        for i in range(len(self.cols0)):
            newWidth = self.cols0[i]
            if self.cols1[i] <> self.cols0[i]:
                weight = self.cols1[i] / self.cols0[i]
                newWidth = newWidth + (deltaw * weight) + extraw # first stretchable gets extra pixels
                extraw = 0
            self.cpos[i] = px
            self.cols1[i] = newWidth
            px = px + newWidth

        #print 'P', self.rpos
        #print 'R1', self.rows1

        # iterate children ...
        for cell in self.GetChildren():
            c,r,c2,r2 = cell.GetUserData()
            #print cell.GetUserData()
            newWidth = reduce( operator.add, self.cols1[c:c2] )
            newHeight = reduce( operator.add, self.rows1[r:r2] )
            cell.SetDimension( (self.cpos[c], self.rpos[r]), (newWidth, newHeight) )

#/class GridSizer #FOLD00

then

    grid.AddWindow( control, option, flag, userData=(x,y,(x+w),(y+h)) )

where x,y,w,h are in cols and rows

WARNING: option must start from 2 for resizeable controls.

···

--
regards,
Niki Spahiev

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

only curious: how difficult would it be to port wxPython to BeOS? (without
using the beos port of xwindows of course)...

-s

···

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

Great, thanks, this is all I need to get me going on this. Your
recommendation of wxDesigner, and the example code, along with Rob's links
to some wxPython code is a big help. Thanks for the help guys!

···

----- Original Message -----
From: "Robin Dunn" <robind@earthling.net>
To: <wxpython-users@lists.sourceforge.net>
Sent: Saturday, March 10, 2001 7:03 PM
Subject: Re: [wxPython] Laying out widgets

>
> I'm trying to reproduce a Visual Basic program written by a friend of

mine

> to show us both how useful Python is. I'm trying to reproduce this

window:

>
> http://24.66.42.86
>

I spent a few minutes in wxDesigner and came up with the window in the
attached image, and it also generated the attached code. Since the code

is

machine generated it's not that pretty but it should help you get an idea
how nesting sizers can be used to create nearly any layout. wxDesigner
doesn't know about the wxCalendarCtrl so I had to use its Foriegn Control
capabilities and so what you see there is just a place holder.

> Any ideas for how I can get started with building this window, any

sample

> code from one of your projects that contains something similar, and

maybe

> just general tips about laying out widgets in general (ie. your

techniques

> for coming up with the best layout code) would be greatly appreciated.

The best way to learn it is to just do it and fiddle until you understand
how it works.

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

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

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

Check out wxHtmlWindow's <Wxp> facility, in combination with the <Table>...
</table> HTML construct. I'm preparing some code which makes this a little
easier at the moment, but it's not really difficult anyway... check out the
demo...

Chris

···

-------------------------------------------------------------------------
Chris Fama <mailto:Chris.Fama@whollysnakes.com> Phone:(07) 3870 5639
Brisbane, Australia Mobile:(0400) 833 700
-------------------------------------------------------------------------
The heart knows its own bitterness, and a stranger does not share its
joy. Proverbs 14:10

-----Original Message-----
From: wxpython-users-admin@lists.sourceforge.net
[mailto:wxpython-users-admin@lists.sourceforge.net]On Behalf Of Clark C.
Evans
Sent: Sunday, 11 March 2001 5:40 PM
To: wxpython-users@lists.sourceforge.net
Subject: [wxPython] html-like grid sizer...

Hello. I'm new to wxPython, and went through the demo program
(which is wonderful, btw) -- quickly focusing on the wx*Sizer
example to fulfil my current needs. My problem is sorta
complicated. First, I'm creating a table of wigets that is
data driven via an html-like syntax. The stock grid does
well, but it won't handle "colspan" and "rowspan". Am I
missing something? Clearly I could re-write the incoming
syntax into a bunch of nested boxes, but I was looking for
a more direct solution. Example:

  <table>
    <tr><td>WidgetX</td><td>WidgetY</td><td rowspan=2>WidgetZ</td></tr>
    <tr><td colspan=2>WidgetA</td></tr>
  </table>

Which is drawn as:

   +----------+-----------+----------+
   > WidgetX | WidgetY | WigetZ |
   +----------+-----------+ |
   > WidgetA | |
   +----------------------+----------+

Thank you for any hints!

Clark

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

Check out wxHtmlWindow's <Wxp> facility, in combination with the

<Table>...

</table> HTML construct. I'm preparing some code which makes this a

little

easier at the moment, but it's not really difficult anyway... check out

the

demo...

Great idea! It definitly would be nice to get some generic classes into the
wxPython.lib that facilitate this.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users

only curious: how difficult would it be to port wxPython to BeOS?

(without

using the beos port of xwindows of course)...

Once the BeOS version of wxWindows was done, it should be fairly simple to
do wxPython. There has been some initial investigation into doing wxBe, but
no implementation work yet. If interested in more details you can ask about
it on wx-users or wx-devel as the person who looked it hangs out there.

···

--
Robin Dunn
Software Craftsman
robin@AllDunn.com Java give you jitters?
http://wxPython.org Relax with wxPython!

_______________________________________________
wxPython-users mailing list
wxPython-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/wxpython-users