wxPython - 學(xué)習(xí) Python程序算法_第1頁
wxPython - 學(xué)習(xí) Python程序算法_第2頁
wxPython - 學(xué)習(xí) Python程序算法_第3頁
wxPython - 學(xué)習(xí) Python程序算法_第4頁
wxPython - 學(xué)習(xí) Python程序算法_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論