




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGE
PAGE
24
AnIntroductionto
wxPython
TutorialWorkbook
July2001
MarkLutz,2001
TableofContents
TOC\o"2-2"\h\z\t"Heading1,1"
WhatmakesPythongoodatGUIs?
2
GUIOptionsforPython
3
Tkinter
3
wxPython
4
OtherGUIOptions
5
TheGreatTkinterversuswxPythonDebate
6
wxPythonPros
6
wxPythonCons
7
Butyourmileagemayvary
8
TkinterOverview(forcomparison)
9
TheBasics
9
Events
9
Layout
9
Afirstexample:Tkintercodingbasics
10
Asecondexample:Framesandcallbacks
11
TkinterCodingStructure
12
MoreonEvents
13
MoreonLayout
14
UsingOOPwithTkinter
17
TkinterWidgetSet
20
Formoredetails
21
wxPythonOverview
22
TheBasics
22
Events
22
Layout
22
AFirstExample:wxPythonCodingBasics
23
Asecondexample:eventcallbacks
24
Athirdexample:subclassingwxFrame
25
wxPythonApplicationStructure
27
MoreonLayout
28
MoreonEvents
34
wxPythonWidgetSet
37
FinalHints
40
OnefortheRoad:Trees
41
Formoredetails
43
WhatmakesPythongoodatGUIs?
Rapidturnaround… easytoexperiment
Veryhigh-level… fasttocodeGUIs
Object-oriented… codereusability
Dynamicreloading… changeswithoutstopping
Portability… easytodistribute
ThePythonlanguageisoptimizedfor...
DeveloperProductivity
ScriptPortability
ComponentIntegration
SoftwareQuality
GUIOptionsforPython
Tkinter
AnOOinterfacetotheTklibrary
TkusedbyPython,Perl,Tcl,others
Python'sdefactostandardGUItoolkit
OpenSource,shipswithPython,booksavailable
ScriptsareportabletoX/Unix,Windows,Macs
Mostlynativelook-and-feel
20basewidgetsplusahandfulofextensions
PMWpackageaddsadditionalwidgets
Vaultssitehasotherextensions:trees,...
IDLEdevelopmentIDEcodedwithTkinter
PythonWorksGUIbuilderforTkinter
wxPython
AnOOwrapperoverwxWindowsclasses
wxWindowsisaC++developmentframework
SupportsGUIs,threads,data-structures,andmore
Probablythe2ndmostpopularPythonGUItoolkit
OpenSource,fetchedandinstalledseparately
ScriptsareportabletoWindows,X/Unix(withGtk)
Mostlynativelook-and-feel
Self-installeronWindows,RPMsandlibsonLinux
Richcollectionofwidgets:trees,MDI,calendars,...
BoaConstructorGUIbuilderforwxPython
OtherGUIOptions
MFC
win32allpackagewrappersforWindows
WPY
PortableMFC-likeAPIforWindows,Unix
KDE/QtandGnome/Gtk
DevelopmentlibwrappersforLinux
Jython(JPython),Swing,AWT
JavaGUIdevelopmentclasslibs
HTMLgen
MakeswebpagesfromPythonobjecttrees
Motif,FXPy,pyFLTK,wafe,PyAmulet,DynWin,...
SeeVaultsofParnassussiteforlesscommonoptions
TheGreatTkinterversuswxPythonDebate
wxPythonPros
Hasaricherwidgetset
wxPythoncomeswithaverynicewidgetset:MDI...
TkinterneedsPMWfornotebooks,comboboxes,...
Tkinterneedsotherextensionsfortrees,MDI,...(seeVaults)
ButTkinterTextandCanvasarefunctionallyrich
ButTkinter'swidgetsetiseasytoextendviaOOP(PMW)
Someoperationsmaybefaster
Butdependsonwhatyoutest
Tkintercodingstylesmayinfluencespeed(canvas)
Somewidgetsmaylookmorenative
Butdependsonwhatyoucompare
wxPythonhasownlook-and-feelforsomewidgets
Tkinterhasbecomeverynative:dialogs,menus,...
wxPythonCons
Morecomplextoprogramandlearn
TkinterisalightweightAPI:mixeswellwithscriptinglanguages
wxPythonbasedonaC++API:tendstorequiremorecode
wxPythonisalargeMFC-likeframework:requiredmindset
wxPythonrequiresOOP,evenforsimplethings
wxPythonlacksTkinter'slayoutandwidgetconfigsimplicity
Lackofdocumentation
Tkinter:adedicatedbook,250pagesinPP2E,Tcl/Tkbooks
wxPython:mostlydeferstowxWindowsC++docs,nobooks
Lessportable
wxPythonscriptsdonotrunonMacstoday
wxPythonrequiresGtkonUnix/Linux
Notaswidelyavailable
TkinterispartofPython:scriptsrunonmostPythons
wxPythonscriptsrequireextrainstallationsteps
Notaswellsupportedormature
TkusedbyPython,Perl,Tcl:millionsofusers
CanbedifficulttoinstallonUnix/Linux
requiresextralibsbesideswxPythonpackage
wxWindowsnon-GUIextrasredundantinPython
Threads,sockets,data-structures,areprovidedbyPythonitself
Butyourmileagemayvary
Bothareviabledevelopmenttoolkits
Choicedependsonyourapprequirements
Tkinter+PMWroughlylikewxPython
wxPythoncomplexitymaybenecessaryinsomeapps
ATkinter/wxPythonportabilitylayermighthelp
TkinterOverview(forcomparison)
TheBasics
OnePythonclassperTkwidgettype
Widgetobjectmethodsforwidgetactions
Widgetconfigurationbykeywordarguments
20widgetclasses,relatedtools,dozensofconfigoptions
TextandCanvaswidgetsarefunctionallyrich
WrapsaClibraryinclasses,routeseventsbacktoPython
Events
Widget-specificeventhandlerregistration
widget.bind()tointerceptlower-levelevents
Plustimers,scrolls,fileI/O
Layout
3geometrymanagersavailable
Pack:arrangeschildrenbyconstraints:side,fill,etc.
Grid:arrangeschildreninrow/columnfashion
Place:usesexactorrelativewindowpositionandsize
Canvaswidgetalsoallowsgeneralpixel-leveldrawing
Afirstexample:Tkintercodingbasics
fromTkinterimportLabel#getwidget
widget=Label(None,text='HelloGUIworld!')#makeone
widget.pack()#arrangeit
widget.mainloop()#eventloop
ApplicationStructure
Make/linkwidgets,arrangewidgets,callmainloop()
Allwidgetsmustbepacked,gridded,orplace
mainloop()startstheTkintereventprocessingloop
Eachapphasamaintop-levelwindow(arealordefaultTk)
EachToplevelwidgetmakesanewtop-levelwindow
YoucanuseOOPforappsandwidgetsifyouwantto
Asecondexample:Framesandcallbacks
Framesarecontainersforwidgets,andotherFrames
Widgets(e.g.,Button)attachtosidesofaparent
Eventhandlersareanycallableobject:func,method,etc.
Buttonhandlersareregisteredas‘command’options
pack()arrangesawidgetinitsparent
mainloop()startsapp:Tkintereventloop,returnsonclose
fromTkinterimport*#widgets,constants
defmsg():#callbackhandler
print'hellostdoutworld...'
top=Frame()#makeacontainer
top.pack()
Label(top,text="Hellocallbackworld").pack(side=TOP)
Button(top,text="pressme",command=msg).pack(side=BOTTOM)
top.mainloop()
%pythonguiexample.py
hellostdoutworld...
hellostdoutworld...
TkinterCodingStructure
OnePythonclassperTkwidgettype
fromTkinterimportButton
widget=Button()
Onewidgetobjectmethodperwidgetaction
widget.pack()
Widgetconfiguration:keywordarguments
widget.config(bg='navy')
Callbackfunctions:registeredaskeywordargs
defhandlerfunc():code
Button(command=handlerfunc)
Events:perwidget,orlower-levelbind()call
defeventfunc(event):code
widget.bind("<KeyPress>",eventfunc)
Layout:3geometrymanagersavailable
widget.pack(side=RIGHT)
widget.grid(row=1,col=2)
widget.place(relx=0.5)
Composition:passcontaineras1stargwhenmakingnewwidget
parent=Frame()
Button(parent,command=handler,bg='navy')
Packingwidgetswithoutsavingthem(butdon'tassignresult!)
Label(text='spam').pack(side=LEFT)
...versus...
widget=Label(text='spam')
widget.pack(side=LEFT)
MoreonEvents
Per-widgeteventregistration
widget=Button(command=onClick)#noargs
widget.config(command=onClick)
Lower-levelregistration:mouse,keyboard,windowevents
widget.bind("<B1-Motion>",eventfunc)#evtarg
Timers:foranimation,threads,etc.
widget.after(msecs,func)
Other:scrollbars,WMeventsonToplevels,fileI/Oevents
Bindexample
fromTkinterimport*
defhello(event):
print'Presstwicetoexit'#onsingleleftclick
defquit(event):#ondoubleleftclick
printevent.widget,event.x,event.y
importsys;sys.exit()
widget=Button(None,text='Helloeventworld')
widget.pack()
widget.bind('<Button-1>',hello)#bindleftmouseclick
widget.bind('<Double-1>',quit)#binddoubleleftclick
widget.mainloop()
C:\Python20\test>pythonTK-test3.py
Presstwicetoexit
Presstwicetoexit
.83982042510
MoreonLayout
3Geometrymanagers:arrangewidgetsinaparent/container
Pack,Grid,Place:calledthroughmethodsofwidgetobjects
Canmixmanagersinanapp,butnotinagivencontainer
Packer:widget.pack(side=TOP,fill=X)
Widgetsarrangedbyvery-high-levelconstraints
Optionsgivesideofattacment,expansionpolicy,anchorposition
Grids:widget.grid(row=i,col=j)
Widgetsarrangedbyrowandcolumnwithintheirparent
Options:stickycontrolsstretchingandresizingbehavior
Placer:widget.place(relx=0.5)
Widgetsarrangedbyexactorrelativepixelpositionandsize
Tedioustouseforrealisticallycomplexinterfaces
Packexample
fromTkinterimport*
root=Tk()#Tk=rootwindow
widget=Label(root,bg='beige')#attachtoroot
widget.config(text='HelloGUIworld!')
widget.pack(side=LEFT,expand=YES,fill=BOTH)
Button(root,text='Press').pack(side=RIGHT)
root.title('guiexample4.py')
root.mainloop()
Packerdetails
Orderofpackingmatters:decreasingspacecavitymodel
Whenpacked,widgetgetsentiresideofremainingcavityinparent
sideoptionstellwhichsideawidgetgets(default=TOP)
Otheroptions:expand=sizing,fill=stretch,anchor=placement
Clipping:itemspackedlastareclippedfirstwhenwindowskrinks
Generallayouttechnique:
Layoutwindowdisplayasahierarchyofrectangles
Implementtopmostrectangle(window)asaTkorToplevel
ImplementrectanglesinwindowasFrames
ImplementnestedrectanglesasFrameswithinFrames
AttachbasicwidgetstoinnermostFrames
Framehierarchymodelalsoappliestogrids:gridsinnestedFrames
Grids,packs,nestedFrame,andToplevels
Tkistheapprootwindow(explicitordefault)
EachToplevelisanewindependentwindow
TkandToplevelarealsowidgetcontainers
TkandToplevelhavetitle,size,WMevents,menubar
Checkbuttonisasimple2-statewidget
SeewxPythonsizeranaloglater
fromTkinterimport*
root=Tk()
Label(root,text='Hellogridworld').grid(col=0)
Button(root,text='Spam').grid(row=0,col=1,sticky=NSEW)
Checkbutton(root,text='Eggs').grid(row=1,col=1,sticky=NSEW)
root=Toplevel()
Label(root,text='Hellopackworld').pack(side=LEFT,anchor=N)
Button(root,text='Spam').pack(side=TOP,fill=BOTH)
Checkbutton(root,text='Eggs').pack(side=BOTTOM,fill=BOTH)
root=Toplevel()
Label(root,text='Helloframeworld').pack(side=LEFT)
panel=Frame(root,bd=2,relief=SUNKEN)
panel.pack(side=RIGHT,expand=YES,fill=BOTH)
Button(panel,text='Spam').pack(side=TOP,fill=BOTH)
Checkbutton(panel,text='Eggs').pack(side=TOP,fill=BOTH)
root.mainloop()
UsingOOPwithTkinter
EachwidgetisaPythonclassobject
Usenormalinheritancetocustomizewidgets
UsenormalcompositiontoattachGUIcomponents
SubclassFrametobuildreusablewidgetpackages
Framesubclassexample
Methodsattachwidgetsto‘self’--akindofFrame
Callbacksareboundmethodsof‘self’--intheclass
Toattach,passinanotherGUIastheparent:
part=Hello(anotherFrame)
part.pack(side=RIGHT)
#!/usr/local/bin/python
fromTkinterimport*#getwidgets
classHello(Frame):#anewcomponent
def__init__(self,parent=None):
Frame.__init__(self,parent)#superclassinit
self.pack()
self.make_widgets()#attachtoself
defmake_widgets(self):
widget=Button(self,text='Hello')
widget.config(command=self.onPress)
widget.pack(side=LEFT)
defonPress(self):
print'Hi.'#writetostdout
if__name__=='__main__':Hello().mainloop()
Largerexample:Toplevelsubclass,commondialogs
Toplevel(andTk)iswindow,andtopmostcontainerwidget
Classprovidesstate:"count"differsperinstance/window
Commondialogcalls:fortypicalmodalinteractions
fromTkinterimport*
fromtkMessageBoximportshowinfo
classMyWindow(Toplevel):
def__init__(self,parent=None,hdr='',size=(150,50)):
Toplevel.__init__(self,parent)
self.title(hdr)
self.minsize(size[0],size[1])
self.makeWidgets()
self.count=0
self.header=hdr
defmakeWidgets(self):
Label(self,text='Popups').pack()
btn=Button(self,text='Go',command=self.onClick)
btn.pack(expand=YES,fill=BOTH)
defonClick(self):
msg='Gotbuttonclick:%d'%self.count
self.count+=1
showinfo(self.header,msg)
root=Tk()
Button(root,text='ExitAll',command=root.quit).pack()
MyWindow(root,hdr='Spam1')
MyWindow(root,hdr='Spam2')
root.mainloop()
Largerexample:standaloneclass,nestedFrames
Tk(window)isthetopmostcontainer
LeftandrightsidesofwindowareFramesinwindow
LabelsandbuttonsattachtothesideFrames
Thisclassisnotakindofwidget:notdirectlyattachable
SeewxPythonsizeranaloglater
fromTkinterimport*
classMyApp:
def__init__(self,title='Tkdemo'):
root=Tk()
root.title(title)
lpnl=Frame(root)
rpnl=Frame(root)
lpnl.pack(side=LEFT,expand=YES,fill=BOTH)
rpnl.pack(side=RIGHT,expand=YES,fill=BOTH)
Label(lpnl,text='Hello1').pack()
Button(lpnl,text='go1',command=self.onBtn).pack()
Label(rpnl,text='Hello2').pack(side=LEFT)
Button(rpnl,text='go2',
command=self.onBtn).pack(side=RIGHT)
defonBtn(self):
print'Hello!...'
MyApp(title='NestedFrames')
mainloop()
TkinterWidgetSet
WidgetClass
Description
Label
Simplemessagearea
Button
Simplelabeledpushbuttonwidget
Frame
Containerforattachingandarrangingotherwidgetobjects
Toplevel,Tk
Top-levelwindowsmanagedbythewindowmanager
Message
Multilinetext-displayfield(label)
Entry
Simplesingle-linetextentryfield
Checkbutton
2-statebuttonwidget,usedformultiple-choiceselections
Radiobutton
2-statebuttonwidget,usedforsingle-choiceselections
Scale
Asliderwidgetwithscalablepositions
PhotoImage
Imageobjectforplacingfull-colorimagesonotherwidgets
BitmapImage
Imageobjectforplacingbitmapimagesonotherwidgets
Menu
OptionsassociatedwithaMenubuttonortop-levelwindow
Menubutton
ButtonthatopensaMenuofselectableoptions/submenus
Scrollbar
Barforscrollingotherwidgets(e.g.,listbox,canvas,text)
Listbox
Listofselectionnames
Text
Multilinetextbrowse/editwidget,supportforfonts,etc.
Canvas
Graphicsdrawingarea:lines,circles,photos,text,etc.
OptionMenu
Composite:pull-downselectionlist
ScrolledText
Composite:TextwithattachedScrollbar
Dialog
Old:commondialogmaker(seenewcommondialogcalls)
Plus...
Common/standarddialogcalls
Fileselectors,colorchoosers,alerts,inputs,etc.
Tkinterlinkedvariableclasses
StringVar,IntVar,DoubleVar,BooleanVar
Geometrymanagementmethods
pack,grid,place,plusconfigurationoptions
Scheduledcallbacks
Widgetafter,wait,andupdatemethods;fileI/Ocallbacks
OtherTkintertools
clipboardaccess,bind/Event,widgetconfigoptions,modaldialogs
Tkinterextensions(Vaultssite)
PMW=morewidgets,PIL=images,hackicon=replaceredTk,trees,...
Formoredetails
Book:Manning'sPythonandTkinterProgramming,coversTkinterandPMWextension;includesreferenceappendixesforbothsystems,largerexamples,etc.
Book:O'Reilly'sProgrammingPython2ndEdition,aTkintertutorial,widgettour,andadvancedexamplessuchasmailclients,texteditors,paintprograms,clocks,etc.(250pages)
Site::onlineTkinterreferencemanual,tutorial,tools
AnO'ReillyTkinterbookisintheworks
MostotherPythonbooksintroduceTkinterbriefly
MostTcl/Tkbooks,especiallyBrentWelch's,andO'Reilly'sTcl/TkPocketReference
wxPythonOverview
TheBasics
OnewxPythonclassperwxWindowsclass
PythontuplesreturnedforC++outputarguments
WindowIDintegersidentifywidgetsinvariouscontexts
Widgetconfigurationviamethodcalls,notkeywordargs
Hundredsofclassesinframework,inheritancehierarchy
wxWindowsC++classwrappersgeneratedwithSWIG
Events
EVT_*funcsbindcallableobjecttowindowandeventtype
MuchlikeTkinter'swidget.bind()low-leveleventscheme
NonotionofTkinter'sper-widgetcallbackregistration
Layout
5layoutschemessupported
Bruteforce:specifyexactpositionsprogrammatically
Sizerobjects:aroworcolumnofwidgets,widgetgrids
Constraintobjects:relativetosiblingorparent
Layoutalgorithmobjects:forMDI,SDIframes
Resources:wxWindowsdialogeditorgeneratesresourcefiles
AFirstExample:wxPythonCodingBasics
CodewxAppsubclass,overrideOnInitmethod
Createinstanceofsubclass,callitsMainLoop()
Boilerplatecode,repeatedinmostwxscripts
Parentsarepassedintowidgetconstructorcalls
WindowsIDs:-1meansmakeadefaultID
fromwxPython.wximport*#wxexports
classMyApp(wxApp):#redefOnInit
defOnInit(self):
frame=wxFrame(NULL,-1,"HellowxPythonworld")
frame.Show(true)
self.SetTopWindow(frame)#mainwindow
wxStaticText(frame,-1,'Spam!')#addalabel
returntrue#signalsuccess
app=MyApp(0)#makeanapp
app.MainLoop()#runeventloop
Asecondexample:eventcallbacks
Setsframe(window)size
EVT_BUTTON()registershandlertorunonbuttonclicks
ID_BTNidentifiesbuttonwidgetinregistrationcall
fromwxPython.wximport*
ID_BTN=10
classMyApp(wxApp):
defOnInit(self):
frame=wxFrame(NULL,-1,'Buttons',
wxDefaultPosition,(200,100))
frame.Show(true)
self.SetTopWindow(frame)
btn=wxButton(frame,ID_BTN,'Spam')
EVT_BUTTON(frame,ID_BTN,self.onClick)
returntrue
defonClick(self,event):
print'Hello!',event.GetId()
app=MyApp(0)
app.MainLoop()
%pythonprogram.py
Hello!10
Hello!10
Hello!10
Athirdexample:subclassingwxFrame
BuildscustomizedwxFramesubclass
EachwxFrameinstanceisanewwindow
Usescommondialogclasstodisplaycountvalue
Subclassprovidesstatenamespace:"count"isper-instance
fromwxPython.wximport*
ID_BTN=10
classMyFrame(wxFrame):
def__init__(self,parent=NULL,ID=-1,hdr='wxPython',
pos=wxDefaultPosition,size=(250,100)):
wxFrame.__init__(self,parent,ID,hdr,pos,size)
self.makeWidgets()
self.Show(true)
self.count=0
self.title=hdr
defmakeWidgets(self):
btn=wxButton(self,ID_BTN,'Press')
EVT_BUTTON(self,ID_BTN,self.onClick)
defonClick(self,event):
msg='Gotbuttonclick:%d'%self.count
self.count+=1
dlg=wxMessageDialog(self,msg,self.title,
wxOK|wxICON_EXCLAMATION)
choice=dlg.ShowModal()
dlg.Destroy()
classMyApp(wxApp):
defOnInit(self):
frame1=MyFrame(hdr='Spam1')
frame2=MyFrame(hdr='Spam2')#twonewwindows
#self.SetTopWindow(frame1)#default=1stfrm
#self.SetTopWindow(frame2)#exit=allclosed
returntrue
app=MyApp(0)
app.MainLoop()
wxPythonApplicationStructure
TostartawxWindowsapplication,deriveawxAppclassandoverridewxApp.OnInit.
Anapplicationmusthaveatop-levelwxFrameorwxDialogwindow(orasubclassofoneofthese).
EachframemaycontainoneormoreinstancesofclassessuchaswxPanel,wxSplitterWindow,orotherwindowsandcontrols.
AframecanhaveawxMenuBar,awxToolBar,astatusline,andawxIconforwhentheframeisiconized.
AwxPanelisusedtoplaceuser-interactioncontrols:wxButton,wxCheckBox,wxChoice,wxListBox,wxRadioBox,wxSlider,andsoon.
InstancesofwxDialogcanalsobeusedforcontrols,anddonotrequireaseparateframe.
CommondialogclassessuchaswxMessageDialogandwxFileDialogarealternativestocreatingadialogboxandpopulatingitwithitems.
MoreonLayout
Bruteforce
Specifyexactpositionsprogrammatically
Tedioustouse,doesn'thandleresizesandfonts
Sizers(closesttoTkinter?)
BoxSizerobjects:aroworcolumnofwidgets
GridSizerobjects:arrangewidgetsintablefashion
Widgetsandcontainersnestwithinsizers
Sizerscannestwithinothersizers:hierarchies
Handlesresizesandplatformdiffsgracefully
Constraintobjects
Arrangeawidgetrelativetoaparentorsibling
Relativetopositions,edges
Canhandlesresizesandplatformdiffsgracefully
Morecomplextoprogramthansizers
Also:Layoutalgorithmobjects:forMDI,SDIframes
Also:Resources:generatedbywxWindowsdialogeditor
Also:Higher-levelstructures:MDI,Sashwindows,Notebooks,...
BruteForce:absoluteposition
Pass(x,y)positions,(width,height)sizes;tuplesorclassobjects
Tediousforcomplexdisplays
Doesn'thandleresizesorplatformfontdiffswell
(-1,-1)meansusedefaultsizeorposition
fromwxPython.wximport*
classMyApp(wxApp):
defOnInit(self):
frame=wxFrame(NULL,-1,'Buttons',
(-1,-1),(130,125))
frame.Show(true)
self.SetTopWindow(frame)
wxStaticText(frame,-1,'Hello',(25,10),(-1,-1))
wxButton(frame,10,'Spam',(25,50),(50,20))
EVT_BUTTON(frame,10,self.onClick)
returntrue
defonClick(self,event):
print'Hello!',event.GetId()
app=MyApp(0)
app.MainLoop()
BoxSizers:arow/columnofwidgets
Addwidgetstoveticalorhorizontalsizer
Callcontainer'sSetAutoLayout,SetSizer
Boxandgridsizershandleresizesandplatformdiffs
fromwxPython.wximport*
classMyApp(wxApp):
defOnInit(self):
frame=wxFrame(NULL,-1,'Buttons',
wxDefaultPosition,(100,100))
frame.Show(true)
self.SetTopWindow(frame)
box=wxBoxSizer(wxVERTICAL)
cntl1=wxStaticText(frame,-1,'Hello')
cntl2=wxButton(frame,10,'Spam')
box.Add(cntl1,1,wxALIGN_CENTER)
box.Add(cntl2,1,wxALIGN_CENTER)
frame.SetAutoLayout(true)
frame.SetSizer(box)
#box.Fit(frame)
EVT_BUTTON(frame,10,self.onClick)
returntrue
defonClick(self,event):
print'Hello!',event.GetId()
app=MyApp(0)
app.MainLoop()
Gridsizer,nestedboxsizers
fromwxPython.wximport*
classMyApp(wxApp):
defOnInit(self):
self.makeGridSizerWin()
self.makeBoxSizerWin()
returntrue
defmakeGridSizerWin(self):#seealso:AddMany
frame=wxFrame(NULL,-1,'',(-1,-1),(150,100))
frame.Show(true)
grid=wxGridSizer(2,2)
grid.Add(wxStaticText(frame,-1,'hellogrids'))
grid.Add(wxButton(frame,-1,'Spam'))
grid.Add(-1,-1)
grid.Add(wxCheckBox(frame,-1,'Eggs'))
frame.SetAutoLayout(true)
frame.SetSizer(grid)
defmakeBoxSizerWin(self):
frame=wxFrame(NULL,-1,'',(-1,-1),(150,100))
frame.Show(true)
box2=wxBoxSizer(wxVERTICAL)#right
box2.Add(wxButton(frame,-1,'Spam'),1)
box2.Add(wxCheckBox(frame,-1,'Eggs'),1)
box1=wxBoxSizer(wxHORIZONTAL)
box1.Add(wxStaticText(frame,-1,'helloboxes'),1)
box1.Add(box2)
frame.SetAutoLayout(true)
frame.SetSizer(box1)
app=MyApp(0)
app.MainLoop()
Largerexample:nestedsizers,panelsonframes
fromwxPython.wximport*
classMyApp(wxApp):
defOnInit(self):
frame=wxFrame(NULL,-1,'Buttons',(-1,-1),(200,100))
frame.Show(true)
self.SetTopWindow(frame)
pnl1=wxPanel(frame,-1,wxDefaultPosition,wxDefaultSize)
pnl2=wxPanel(frame,-1,wxDefaultPosition,wxDefaultSize)
box=wxBoxSizer(wxHORIZONTAL)
box.Add(pnl1,1,wxEXPAND)
box.Add(pnl2,1,wxEXPAND)
frame.SetAutoLayout(true)
frame.SetSizer(box)
box=wxBoxSizer(wxVERTICAL)
box.Add(wxStaticText(pnl1,-1,'Hello1'),1)
box.Add(wxButton(pnl1,10,'Spam1'),1)
pnl1.SetAutoLayout(true)
pnl1.SetSizer(box)
box=wxBoxSizer(wxHORIZONTAL)
box.Add(wxStaticText(pnl2,-1,'Hello2'),1)
box.Add(wxButton(pnl2,10,'Spam2'),1)
pnl2.SetAutoLayout(true)
pnl2.SetSizer(box)
EVT_BUTTON(frame,10,self.onClick)
returntrue
defonClick(self,event):
print'Hello!',event.GetId()
app=MyApp(0)
app.MainLoop()
Constraints:positionrelativetosiblingorparent
Constraintobjectshave8individualconstraints
Individualconstraintshavearrangementmethods
Set4ofthe8constraintstofullyconstrainawidget
Canhandleresizesandplatformdiffsgracefully
Butcomplextocode
fromwxPython.wximport*
classMyApp(wxApp):
defOnInit(self):
frame=wxFrame(NULL,-1,'Buttons',
(-1,-1),(200,100))
frame.Show(true)
self.SetTopWindow(frame)
frame.SetAutoLayout(true)
lbl=wxStaticText(frame,-1,'Hello')
btn=wxButton(frame,10,'Spam')
con=wxLayoutConstraints()
con.top.Below(lbl,10)
con.bottom.SameAs(frame,wxBottom)
con.left.SameAs(frame,wxLeft)
con.right.SameAs(frame,wxRight)
btn.SetConstraints(con)
EVT_BUTTON(frame,10,self.onClick)
returntrue
defonClick(self,event):
print'Hello!',event.GetId()
app=MyApp(0)
app.MainLoop()
MoreonEvents
EVT_*funcsbindcallableobjecttowindowandeventtype
WindowIDsusedtoassociatewindowwithhandler
MuchlikeTkinter'swidget.bind()low-leveleventscheme
Sampleeventregistrationfunctions(seemanualforall)
Function
EventType
EVT_BUTTON
Buttonclick
EVT_MENU
Menuitemselection
EVT_SIZE
Windowsizechange
EVT_MOVE
Windowmoved
EVT_CLOSE
Framecloserequest:event.Veto
EVT_PAINT
Partofwindowneedstoberedrawn
EVT_CHAR
Non-modifierkeystroke
EVT_IDLE
Whennotprocessingotherevents
EVT_LEFT_DOWN
Leftmousebuttonpress
EVT_LEFT_UP
Leftmousebuttonrelease
EVT_LEFT_DCLIC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度直播平臺主播培訓(xùn)及管理合同
- 2025年度新能源汽車產(chǎn)業(yè)投資合作合同
- 二零二五年度商標(biāo)共營協(xié)議及跨國品牌合作合同
- 二零二五年度超市商品陳列與文化氛圍營造合同
- 2025年度民宿租賃合同終止及服務(wù)質(zhì)量協(xié)議
- 二零二五年度集體合同簽訂與新型學(xué)徒制實(shí)施
- 二零二五年度個人對個人科技成果轉(zhuǎn)化借款合同
- 2025年度機(jī)關(guān)炊事員食品安全培訓(xùn)聘用協(xié)議
- 日常行政管理事務(wù)處理指導(dǎo)書
- 日化用品行業(yè)供應(yīng)鏈優(yōu)化與市場拓展策略研究計(jì)劃
- 山東教育出版社(魯教版)八年級化學(xué)全一冊教學(xué)課件
- 《外貿(mào)風(fēng)險(xiǎn)管理》完整全套課件
- 公路水運(yùn)工程施工企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員大綱和題庫
- 榜樣7航天追夢人王亞平事跡介紹PPT英雄航天員王亞平事跡介紹PPT課件(帶內(nèi)容)
- 物理word版2023山東高考答題卡涂準(zhǔn)考證號和條形碼
- 人教版《道德與法治》三年級下冊全冊全套課件
- GB/T 32294-2015鍛制承插焊和螺紋活接頭
- 部編人教版三年級語文下冊《快樂讀書吧》精美課件
- 建筑力學(xué) 李前程 第一章 緒 論
- 2023年新教科版科學(xué)六年級下冊學(xué)生活動手冊答案
- 體育測量與評價(jià)-第一章緒論課件
評論
0/150
提交評論