From: Kael F. <kae...@gm...> - 2011-04-02 17:11:51
|
Python card is great. But I caution people stating out on large computationally or database intensive projects that while pythoncard makes the easy stuff very easy, it makes that hard stuff harder. Note that even using wxPython getting the process-based and thread-based multitasking working properly can be hard and is essential in any program that uses the cpu, disk and network intensively and still needs wx to be responsive, draw progress bars, etc. I'm warning about big data here (for a GUI anyway): trees with 1000's-10,000's of nodes, grid data stores with ~1M cells. I've written some cool programs in python card, but they never scaled well. -Kael On Sat, Apr 2, 2011 at 8:53 AM, John Henry <ec...@ya...> wrote: > To give others an idea how simple Pythoncard is, I'll show you the code > necessary to produce the MDI example with Sashwindow that I posted earlier. > To create that ap, use the layout editor and create 2 resource files (the > widget childwindow is from the standard samples), one for the main window, > and one for the sash window (the one with a tree control and a button), and > then write the following (ridiculously simple) code: > ################################## > #!/usr/bin/python > """ > __version__ = "$Revision: 1.5 $" > __date__ = "$Date: 2004/04/30 16:26:12 $" > """ > import sys > from PythonCard import model > # Resource for the main window > from testMDI_rsrc import rsrc as testMDI_rsrc > # The widget example > from widgets import WidgetsTest > from widgets_rsrc import rsrc as widgets_rsrc > # Resource for the sash window > from sashLayoutWindow_rsrc import rsrc as SashWindow_rsrc > class wxMDIParentFrame(model.MDISashParentBackground): > def on_initialize(self, event): > # Pass the resource to the parent of the sash window > model.MDISashParentBackground.on_initialize(self, event, SashWindow_rsrc) > self.on_openNew_command(None) > # Need this for the sash contents to show up > self.resize(event) > # Opens a new widget window everytime the openNew option is selected > def on_openNew_command(self, event): > child1 = model.childWindow(self, WidgetsTest, rsrc=widgets_rsrc) > child1.Show(True) > > class MyBackground(model.Application): > def __init__(self, parent, rsrc): > model.Application.__init__(self, wxMDIParentFrame, rsrc=testMDI_rsrc) > def on_initialize(self, event): > # if you have any initialization > # including sizer setup, do it here > pass > if __name__ == '__main__': > app = model.Application(MyBackground) > app.MainLoop() > ################################# > I rest my case. > I attached the screen shot for completeness. Once I fix one more issue (when > I drag the sash window bar, the widget windows don't repaint unless I resize > the main), I am going to package up the MDI mod and upload to the Pythoncard > upload area. > -- > John Henry > > From: Teuvo Eloranta <te...@gm...> > To: John Henry <kim...@ya...> > Cc: John Henry <ec...@ya...>; Mark Carter <ma...@ma...>; > pyt...@li... > Sent: Sat, April 2, 2011 2:29:06 AM > Subject: Re: [Pythoncard-users] Added MDI support to Pythoncard (was MDI - > childwindows within a window) > > Hi there! > > It's so nice to hear people using Pythoncard, not to mention someone is > (willing to) developing it. > I think Pythoncard is an absolute superb tool for making GUI programs. > Amazingly fast method and produces code more readable (and short) than any > other (at least that i know of). > I've done something earlier with wxPython, but usually it's "too much" for > what I need, Pythoncard is definitely the nbr one tool I use for GUI > programs. > And when necessary, the missing pieces can be coded with wxPython still. > > For the developer, and everyone involved somehow for making pythoncard what > it is today - thank you! > > Just wanted to add my 5 cents too :) > > -Teuvo > > > 2011/4/2 John Henry <ec...@ya...> >> >> I couldn't agree with you more. Earlier there was a post claiming that he >> prefers wxPython over Pythoncard. I assume he's using a different animal >> than the one I am looking at. Pythoncard is simple, feature rich - and very >> stable. I've done numerous projects using Pythoncard. >> I've long suggested that somebody release a 1.0 version of Pythoncard. So >> far, it has fallen to death ears. If we can all convince the owner to do >> that, I can package up what I have done and contribute to the release. >> I've hecked together the following controls: >> pdfwindow, flashwindow, tree control, minimizable window (minimize to >> Windows lauch bar), MDI parent and child windows, sashwindows, ... >> I have to stress heck because I did all these kind of blind folded because >> I really don't know what's going on most of the time. Wing debugger is my >> friend. >> Controls I tried but unable to get it to work: >> matplotlib window, a graphic file viewer widget (works but not behaving >> properly), a MDI widget (not window). >> >> >> -- >> John Henry >> >> From: Mark Carter <ma...@ma...> >> To: pyt...@li... >> Sent: Fri, April 1, 2011 9:13:02 AM >> Subject: [Pythoncard-users] Added MDI support to Pythoncard (was MDI - >> childwindows within a window) >> >> Hi John. >> >> Awesome! Good to know someone is still developing PythonCard! PythonCard >> is really a super project, for infrequent programmers like myself looking >> for a Visual Basic-like development experience on Python, PythonCard does >> the job. >> >> I don't suppose you could shepherd through a new release? The current >> release is several years old IIRC, and the installer has issues (either with >> Vista and/or latest Python, can't recall). Most people who research >> PythonCard these days just assume it's a dead project. >> >> Mark >> >> >> On Fri, Apr 1, 2011 at 10:53 AM, John Henry <ec...@ya...> wrote: >>> >>> I am happy to report that I've succeeded in Pythoncardize >>> the wx.SashLayoutWindow control of wxPython >>> using similar technique to the MDI support I reported previously. Not >>> sure if >>> the screen capture attachment to this email will get stripped or not. If >>> you >>> don't see the screen shot, shout and I'll try to upload that somewhere. >>> >>> ########## mod to model.py ####################### >>> class Background(BackgroundBase, wx.Frame): >>> def __init__(self, aParent, aBgRsrc, init=None): >>> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> frameclass=wx.Frame, init=init) >>> >>> class MDIChildBackground(BackgroundBase, wx.MDIChildFrame): >>> def __init__(self, aParent, aBgRsrc, init=None): >>> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> frameclass=wx.MDIChildFrame, init=init) >>> >>> class MDIParentBackground(BackgroundBase, wx.MDIParentFrame): >>> def __init__(self, aParent, aBgRsrc, init=None): >>> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> frameclass=wx.MDIParentFrame, init=init) >>> >>> class SashWindow(BackgroundBase, wx.SashLayoutWindow): >>> def __init__(self, aParent, aBgRsrc, init=None): >>> rsrc = resource.Resource(aBgRsrc).application.backgrounds[0] >>> return BackgroundBase.__init__(self, aParent, rsrc, >>> frameclass=wx.SashLayoutWindow, init=init) >>> # Dummy routine >>> def SetMenuBar(self, child): >>> return >>> # Dummy routine >>> def GetStatusBar(self): >>> return >>> ########## end of mod to model.py #######################-- >>> John Henry >>> >>> >>> >>> ----- Original Message ---- >>> > From: John Henry <ec...@ya...> >>> > To: pyt...@li... >>> > Sent: Wed, March 9, 2011 10:08:39 AM >>> > Subject: Added MDI support to Pythoncard (was MDI - childwindows within >>> > a >>> >window) >>> > >>> > I am happy to let you know that I succeeded in adding MDI support to >>> > Pythoncard >>> > >>> > with only a few lines of modifications to the Background class in >>> > model.py >>> > >>> > I made the Background class into a BackgroundBase class, and have the >>> >Background >>> > >>> > class subclass from the BackgroundBase class. >>> > >>> > Then I added a MDIParentBackground and MDIChildBackground which simply >>> > force >>> > Background to subclass from wxMDIParentFrame and wxMDIChildFrame >>> > respectively, >>> > >>> > instead of the wx.Frame class. Once I've done that, wxPython does >>> > the rest >>> >of >>> > >>> > the work. >>> > >>> > ################ mod to model.py ###################### >>> > >>> > from wxPython.wx import wxMDIParentFrame, wxMDIChildFrame >>> > >>> > # Used to say: >>> > # class BackgroundBase(Scriptable, wx.Frame, event.EventSource): >>> > class BackgroundBase(Scriptable, event.EventSource): >>> > """ >>> > A window that contains Widgets. >>> > """ >>> > def __init__(self, aParent, aBgRsrc, frameclass=wx.Frame): >>> > ...<original code>... >>> > #Changed original code from invoking wx.Frame here to a method passed >>> > down >>> > # First, call the base class' __init__ method to create the >>> > frame >>> > frameclass.__init__(self, aParent, >>> > self.id, >>> > #self.name, >>> > aBgRsrc.title, >>> > position, >>> > aBgRsrc.size, >>> > style | wx.NO_FULL_REPAINT_ON_RESIZE, >>> > aBgRsrc.name) >>> > ...<rest of original code>... >>> > >>> > >>> > class Background(BackgroundBase, wx.Frame): >>> > def __init__(self, aParent, aBgRsrc): >>> > return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> > frameclass=wx.Frame) >>> > >>> > class MDIParentBackground(BackgroundBase, wxMDIParentFrame): >>> > def __init__(self, aParent, aBgRsrc): >>> > return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> > frameclass=wxMDIParentFrame) >>> > >>> > class MDIChildBackground(BackgroundBase, wxMDIChildFrame): >>> > def __init__(self, aParent, aBgRsrc): >>> > return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> > frameclass=wxMDIChildFrame) >>> > >>> > ############## end of mod to model.py ######################### >>> > >>> > To use these two new classes, the code is remarkably unremarkable. >>> > The parent >>> > >>> > code: >>> > >>> > ############# Parent ###################### >>> > #!/usr/bin/python >>> > >>> > """ >>> > __version__ = "$Revision: 1.5 $" >>> > __date__ = "$Date: 2004/04/30 16:26:12 $" >>> > """ >>> > >>> > from PythonCard import model >>> > >>> > MDI_rsrc=\ >>> > {'application':{'type':'Application', >>> > 'name':'Template', >>> > 'backgrounds': [ >>> > {'type':'Background', >>> > 'name':'bgTemplate', >>> > 'title':'Testing MDI Controls', >>> > 'size':(400, 300), >>> > 'style':['resizeable'], >>> > >>> > 'menubar': {'type':'MenuBar', >>> > 'menus': [ >>> > {'type':'Menu', >>> > 'name':'menuFile', >>> > 'label':'&File', >>> > 'items': [ >>> > {'type':'MenuItem', >>> > 'name':'menuFileExit', >>> > 'label':'E&xit', >>> > 'command':'exit', >>> > }, >>> > ] >>> > }, >>> > {'type':'Menu', >>> > 'name':'menuOptions', >>> > 'label':'Options', >>> > 'items': [ >>> > {'type':'MenuItem', >>> > 'name':'menuOptionsOpenNew', >>> > 'label':'Open New\tAlt+N', >>> > 'command':'openNew', >>> > }, >>> > ] >>> > }, >>> > ] >>> > }, >>> > 'components': [ >>> > >>> > ] # end components >>> > } # end background >>> > ] # end backgrounds >>> > } } >>> > >>> > MyCW_rsrc=\ >>> > {'application':{'type':'Application', >>> > 'name':'Template', >>> > 'backgrounds': [ >>> > {'type':'Background', >>> > 'name':'bgTemplate', >>> > 'title':'Standard Template with File->Exit menu', >>> > 'size':(698, 517), >>> > 'style':['resizeable'], >>> > >>> > 'menubar': {'type':'MenuBar', >>> > 'menus': [ >>> > {'type':'Menu', >>> > 'name':'menuFile', >>> > 'label':'&File', >>> > 'items': [ >>> > {'type':'MenuItem', >>> > 'name':'menuFileExit', >>> > 'label':'E&xit', >>> > 'command':'exit', >>> > }, >>> > ] >>> > }, >>> > {'type':'Menu', >>> > 'name':'menuOptions', >>> > 'label':'Options', >>> > 'items': [ >>> > {'type':'MenuItem', >>> > 'name':'menuOptionsOpenNew', >>> > 'label':'Open New\tAlt+N', >>> > 'command':'openNew', >>> > }, >>> > ] >>> > }, >>> > ] >>> > }, >>> > 'components': [ >>> > >>> > {'type':'TextArea', >>> > 'name':'TextArea1', >>> > 'position':(20, 20), >>> > 'size':(651, 333), >>> > }, >>> > >>> > {'type':'Button', >>> > 'name':'Button1', >>> > 'position':(559, 376), >>> > 'label':'Button1', >>> > }, >>> > >>> > ] # end components >>> > } # end background >>> > ] # end backgrounds >>> > } } >>> > >>> > class MyBackground(model.MDIParentBackground): >>> > >>> > def on_initialize(self, event): >>> > # if you have any initialization >>> > # including sizer setup, do it here >>> > #MDI.on_initialize(self, event) >>> > pass >>> > def on_openNew_command ( self, event ): >>> > # Create a child window >>> > child = model.childWindow(self, MyCW, rsrc=MyCW_rsrc) >>> > >>> > if __name__ == '__main__': >>> > app = model.Application(MyBackground, None, MDI_rsrc) >>> > app.MainLoop() >>> > ############# End of Parent ###################### >>> > >>> > ############# Child ###################### >>> > class MyCW(model.MDIChildBackground): >>> > >>> > def on_initialize(self, event): >>> > self.parent = self.getParent() >>> > self.components.TextArea1.text='I am only a child.' >>> > def on_openNew_command ( self, event ): >>> > return self.parent.on_openNew_command ( event ) >>> > ############# End of Child ###################### >>> > >>> > That's it!!! >>> > >>> > Now I have to play around with resizer to see how that would work >>> > here. >>> > >>> > -- >>> > John Henry >>> > >>> >>> ------------------------------------------------------------------------------ >>> Create and publish websites with WebMatrix >>> Use the most popular FREE web apps or write code yourself; >>> WebMatrix provides all the features you need to develop and >>> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >>> >>> _______________________________________________ >>> Pythoncard-users mailing list >>> Pyt...@li... >>> https://lists.sourceforge.net/lists/listinfo/pythoncard-users >>> >> >> >> >> -- >> Mark Carter, OCT >> markcarter.tel >> >> >> >> -- >> Mark Carter, OCT >> markcarter.tel >> >> >> ------------------------------------------------------------------------------ >> Create and publish websites with WebMatrix >> Use the most popular FREE web apps or write code yourself; >> WebMatrix provides all the features you need to develop and >> publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >> >> _______________________________________________ >> Pythoncard-users mailing list >> Pyt...@li... >> https://lists.sourceforge.net/lists/listinfo/pythoncard-users >> > > > ------------------------------------------------------------------------------ > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/ms-webmatrix-sf > > _______________________________________________ > Pythoncard-users mailing list > Pyt...@li... > https://lists.sourceforge.net/lists/listinfo/pythoncard-users > > |