| | |
Starting wxPython (GUI code)
![]() |
To draw simple shapes like lines, circles, rectangles you have to use the wx.PaintDC surface as the canvas. Here are some basic examples:
You can get a little more playful, using just about the same frame work:
Let's finish this off with the circle method:
Now it's up to you to do some fancy random art.
python Syntax (Toggle Plain Text)
# the wx.PaintDC surface is wxPython's canvas # draw a line on this canvas # use help(wx.PaintDC) to get more info import wx class DrawPanel(wx.Panel): """draw a line on a panel's wx.PaintDC surface/canvas""" def __init__(self, parent): wx.Panel.__init__(self, parent, -1) # bind the panel to the paint event wx.EVT_PAINT(self, self.onPaint) def onPaint(self, event=None): # this is the wx drawing surface/canvas dc = wx.PaintDC(self) dc.Clear() # sets pen color and width dc.SetPen(wx.Pen("blue", 1)) x1 = 20 y1 = 10 x2 = 500 y2 = 300 # draw a line from coordinates (x1,y1) to (x2,y2) dc.DrawLine(x1, y1, x2, y2) app = wx.App() frame = wx.Frame(None, -1, "Draw a line", size=(550, 350)) dp = DrawPanel(frame) frame.Show(True) app.MainLoop()
python Syntax (Toggle Plain Text)
# the wx.PaintDC surface is wxPython's canvas # draw a series of lines on this canvas # DC stands for Device Context import wx class DrawPanel(wx.Panel): """draw lines on a panel's wx.PaintDC surface/canvas""" def __init__(self, parent): wx.Panel.__init__(self, parent, -1) # bind the panel to the paint event wx.EVT_PAINT(self, self.onPaint) def onPaint(self, event=None): # this is the wx drawing surface/canvas dc = wx.PaintDC(self) dc.Clear() # sets pen color and width dc.SetPen(wx.Pen("red", 1)) # set the starting point coordinates to (0,0) x1 = y1 = 0 # use a loop to set the endpoint coordinates (x2,y2) # and draw a series of lines for y2 in range(100, 400, 20): x2 = 500 dc.DrawLine(x1, y1, x2, y2) app = wx.App() frame = wx.Frame(None, -1, "Draw lines", size=(550, 420)) dp = DrawPanel(frame) frame.Show(True) app.MainLoop()
python Syntax (Toggle Plain Text)
# the wx.PaintDC surface is wxPython's canvas # draw 2 circles on this canvas # DC stands for Device Context import wx class DrawPanel(wx.Panel): """draw circles on a panel's wx.PaintDC surface/canvas""" def __init__(self, parent): wx.Panel.__init__(self, parent, -1) # bind the panel to the paint event wx.EVT_PAINT(self, self.onPaint) def onPaint(self, event=None): # this is the wx drawing surface/canvas dc = wx.PaintDC(self) dc.Clear() # sets pen color and width dc.SetPen(wx.Pen("black", 2)) # sets the fill color (default is background) dc.SetBrush(wx.Brush('yellow')) x = 200 y = 200 r = 150 # draw a circle with center coordinates (x,y) and radius r dc.DrawCircle(x, y, r) # change the fill color dc.SetBrush(wx.Brush('red')) # draw a smaller circle r = 20 dc.DrawCircle(x, y, r) app = wx.App() frame = wx.Frame(None, -1, "Draw circles", size=(420, 420)) dp = DrawPanel(frame) frame.Show(True) app.MainLoop()
drink her pretty
Nice stuff there Fuse and Ene!
Here is my contribution, showing you how easy it is to have wxPython display an image from image file:
Here is my contribution, showing you how easy it is to have wxPython display an image from image file:
python Syntax (Toggle Plain Text)
# show .jpg .png .bmp or .gif image on wx.Panel import wx class ImagePanel(wx.Panel): """ create the panel and put image on it """ def __init__(self, parent, id): # create the panel, this will be self wx.Panel.__init__(self, parent, id) try: # pick your image file you have in the working folder # or use the full file path image_file = 'strawberry.jpg' bmp = wx.Bitmap(image_file) # show the bitmap, image's upper left corner anchors # at panel coordinates (5, 5), default is center wx.StaticBitmap(self, -1, bmp, (5, 5)) # show some image information info = "%s %dx%d" % (image_file, bmp.GetWidth(), bmp.GetHeight()) # the parent is the frame parent.SetTitle(info) except IOError: print "Image file %s not found" % imageFile raise SystemExit # redirect=False sends stdout/stderr to the console window # redirect=True sends stdout/stderr to a wx popup window (default) app = wx.App(redirect=False) # create window/frame, no parent, -1 is the default ID # also increase the size of the frame for larger images frame = wx.Frame(None, -1, size = (480, 320)) # create the panel instance imp = ImagePanel(frame, -1) # show the frame frame.Show(True) # start the GUI event loop app.MainLoop()
Last edited by bumsfeld; Jun 10th, 2008 at 6:27 pm.
Should you find Irony, you can keep her!
Well, if you do web-page designing, you will be familiar with the repeating image tile wallpaper. You can do something similar to give your wxPython frame or panel very sexy backgrounds. I leaned on one of vegaseat's snippets to come up with this example:
python Syntax (Toggle Plain Text)
# wallpaper wxPython panel using one image as repeating tile # (image is obtained from base 64 encoded png image string) import wx import cStringIO import base64 class MyPanel(wx.Panel): """ class creates panel for the tile image contained in data_stream """ def __init__(self, parent, id, frame_w, frame_h, data_stream): # create the panel wx.Panel.__init__(self, parent, id) # frame/panel width and height self.frame_w = frame_w self.frame_h = frame_h # convert to bitmap self.bmp = wx.BitmapFromImage(wx.ImageFromStream(data_stream)) # do the wall papering on the PaintDC canvas... wx.EVT_PAINT(self, self.on_paint) # now put some widgets on top of the panel's wallpaper self.button1 = wx.Button(self, -1, label='Button1', pos=(15, 10)) self.button2 = wx.Button(self, -1, label='Button2', pos=(15, 45)) def on_paint(self, event=None): # create the paint canvas dc = wx.PaintDC(self) dc.Clear() # get image width and height image_w = self.bmp.GetWidth() image_h = self.bmp.GetHeight() # use repeating image tiles to wallpaper the canvas for x in range(0, self.frame_w, image_w): for y in range(0, self.frame_h, image_h): dc.DrawBitmap(self.bmp, x, y, True) # the base64 encoded png image string png_b64='''\ iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAMFBMVEUEAgQEAoYEAkgEAsYEAicE AqgEAmkEAucEAhgEApgEAlkEAtYEAjgEArkEAnsEAvxjNQuZAAAFBUlEQVR4nNWXT2gcVRjAv91O l+kyjd02kSSFYY21CtpUGIKHMGTBFkIpgVAeMpFtNlZi20MEc5jDHrKtRXOQ4LYGHA/rKuhBNB4W CXQM2QY9GEWEdSgxPLsvhNBoO6Gp6dI/OH5vN7U97XsDXvwOe3o/vj/z5pvfQsDjHoC2UoTm0d0O Px+4sP8lqCN3EdkrQpRk/GrNDoJHyBdJAQLJM1f54UfI5ykBoabUrqcfR2LdoiQYGmw8RG4hclYC UWHXQ2QiBVOvSyA4g+Ft5OtfYCEphUCkgdzf8QCuyxEAz9eRy3FLLcoB/bk3OXI/p1jxnBQReyMb wN8f47wUS7YsPrG/duENU3+XRaKI3IHDD0A5KYtAXwD3YNcmKAVpZCdHIndBGZRG4Bosws4tUPLy iAar8OMQKE/KIwBVGGmF+I0wSA4u7IGWqjwQ5T97IJILk6UeB0IT/79QDp79VOpgLoersdeseGsn iGclxcAAmeBvaq02u2yYnjX9vpD4LGjErDteqqQ9kv9QiJAGUatlXaPiEcv5QKKw+Tpju6USTRMn v1eMQPQaX4azbsmkHnEKKxIIf7+Del003TGoy2TB7RbU7Oy4QQlxOhJy74U2UbN5Em+JJArtUghs 2Fm316RpyymwVTlkN9aF3VtOXtd9OeTIMk9CrOk8W2Pl5mcvHDl+cHRthLUtG5UKIdY6W2XN+59h jfD1cyV8KFYizzLdfzRFcsd8fl5PsLhpEJLHVsrvjOWaVzaA5y8ZprOPUs+ZdhgrxkTNKL6+v0Rd 1zCXPGeQsZlUfKbYHME0jK3PlswKdayOgv4CaGsiBMawtOWSQa02PuKihKlAC07sxBylQ5F8gnVi qXszzYGFL/nE/jQqZEjFuvCZaKuCj7WawOfNPjFMMgTnEqwVkfY9grpG/MwVVk5TRLCtKiLXRcgU q6oMzhHyEcAVfo219qoAUf3rMJCCm/Sb0cVX7G95LyIE4hn1VE9jlwXBHYmJYSRPbZ/fdruVpBAp K6PDjyNig1RBPa/NbyNbuG+EBslDgbe3kVuSBokRnfi3sNhrcgi83EDmkzAgZ5DYUV8dOfwiHChL Io1ubu9+S9YgY22J+sx+jRIlKZljB1/+wW1QnGhOEokFweZGKIMEZT54EAs2w+ggPIvG+W4ogwQF kUgogwQ4ehkiW2F6weiCHSidehikHb66CFpnCELNwMxqOIPUkEKDzIQpDCMDkZAExnPhkf80lP7J EKfXRs8eP4Nyl5IFxsDmX3jPskS7Gmfe1UYIma9B1p0zqIzc1Z2LixpkswbP4gjt5uE2tGHcNWja cfIXRcjk/oZB2mCbRg/KXUJC7r6vJ8lCCY0o7VgFGbk72iis1Gv2YCtMSiGHsS4XXEqnl5y8nNy1 BDYW5lbQu5w8k1uKfXYWezHpkoVGJPf6PWFnS1Cpe5eus5QMos26Lsw16lrxTwtOq+8tLCyOXsIs tIeQjnU9M9J0ysfGfJ/roK4fcoGml3iW5MBYM+SnGb0ejCkGmEvTToL5mdhYuWldnOlwHHaIArXw tugj5bhfbIpEdf3mRNY2zAp4noOeehA0kQ8+pbcl1rlBQsNTUe46BYjm+/q6W5qjMPSDc1LvzEn4 4BR28+pchcJvmqPz/yjKjeav8mR/Nw55n2l6MATdut4q1q7zdUm/iX9qEIkyVuVyJ7jLjJ0eYd/h JQZpubvCqnE99Uya/APf6sMx1/lYCAAAAABJRU5ErkJggg== ''' # convert to png image bytes png_bytes = base64.b64decode(png_b64) # convert png bytes to data stream data_stream = cStringIO.StringIO(png_bytes) app = wx.App() # create window/frame instance, no parent, -1 is default ID frame_w = 500 frame_h = 400 frame = wx.Frame(None, -1, "tiling the wx.PaintDC canvas", size=(frame_w, frame_h)) # create panel class instance mp = MyPanel(frame, -1, frame_w, frame_h, data_stream) frame.Show(True) # start the event loop app.MainLoop()
Should you find Irony, you can keep her!
paulthom had an idea of adding help text to a texbox when the programme loads. The help text just explains what to type in the box and needs to disappear once the user types anything or clicks in the box. If you're interested in doing similar, or want to know how to use mouse events, go here:
http://www.daniweb.com/forums/thread128788.html
Aside from being example code that shows you how to implement such a feature, it demonstrates how funny things happen if you don't return focus to the calling widget by typing event.Skip() at the end of the mouse event's handler method.
The wxPython documentation on mouse events is a decent reference: http://www.wxpython.org/docs/api/wx....ent-class.html
http://www.daniweb.com/forums/thread128788.html
Aside from being example code that shows you how to implement such a feature, it demonstrates how funny things happen if you don't return focus to the calling widget by typing event.Skip() at the end of the mouse event's handler method.
The wxPython documentation on mouse events is a decent reference: http://www.wxpython.org/docs/api/wx....ent-class.html
Last edited by Fuse; Jun 11th, 2008 at 6:01 am.
Mir's Fuselage
Because what's not to like about being killed by a toilet seat from Mir's atmospheric re-entry?
Because what's not to like about being killed by a toilet seat from Mir's atmospheric re-entry?
To get used to wxPython, I took vegaseat's mortgage calculator snippet written in Csharp and converted it to Python. I was surprised how easy it was:
python Syntax (Toggle Plain Text)
# a simple mortgage calulator using wxPython # checked it out with the online mortgage calculator at: # http://www.mortgage-calc.com/mortgage/simple.php import wx import math class MyFrame(wx.Frame): """frame and widgets to handle input and output of mortgage calc""" def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title) # add panel, labels, text and sizer widgets panel = wx.Panel(self, -1) panel.SetBackgroundColour('green') label1 = wx.StaticText(panel, -1, "Enter total loan amount:") label2 = wx.StaticText(panel, -1, "Enter annual interest (%):") label3 = wx.StaticText(panel, -1, "Enter years to pay:") self.loan = wx.TextCtrl(panel, -1, "100000") self.interest = wx.TextCtrl(panel, -1, "6.5") self.years = wx.TextCtrl(panel, -1, "30") self.calc_btn = wx.Button(panel, -1, ' Perform Mortgage Calculation ') self.calc_btn.SetBackgroundColour('light blue') self.calc_btn.Bind(wx.EVT_BUTTON, self.onCalc) info = "Modify the above data to your needs!" self.result = wx.TextCtrl(panel, -1, info, size=(290, 100), style=wx.TE_MULTILINE) # use gridbagsizer for layout of widgets sizer = wx.GridBagSizer(vgap=5, hgap=10) sizer.Add(label1, pos=(0, 0)) sizer.Add(self.loan, pos=(0, 1)) # row 0, column 1 sizer.Add(label2, pos=(1, 0)) sizer.Add(self.interest, pos=(1, 1)) sizer.Add(label3, pos=(2, 0)) sizer.Add(self.years, pos=(2, 1)) sizer.Add(self.calc_btn, pos=(3, 0), span=(1, 2)) # span=(1, 2) --> allow to span over 2 columns sizer.Add(self.result, pos=(4, 0), span=(1, 2)) # use boxsizer to add border around sizer border = wx.BoxSizer() border.Add(sizer, 0, wx.ALL, 20) panel.SetSizerAndFit(border) self.Fit() def onCalc(self, event): """do the mortgage calcuations""" # get the values from the input widgets principal = float(self.loan.GetValue()) interest = float(self.interest.GetValue()) years = float(self.years.GetValue()) # calculate interestRate = interest/(100 * 12) paymentNum = years * 12 paymentVal = principal * \ (interestRate/(1-math.pow((1+interestRate), (-paymentNum)))) # show the result resultStr1 = "Your monthly payment will be $%.2f for\n" % paymentVal resultStr2 = "a %.1f year $%.2f loan at %.2f%s interest" % \ (years, principal, interest, '%') self.result.SetValue(resultStr1 + resultStr2) app = wx.App() frame = MyFrame(None, -1, "Mortgage Calculator") frame.Show() app.MainLoop()
I upped my sanitary measures, up yours!
I took Lardmeister's code and made a generic wxPython templet that you can then flesh out for cases when you need the user to enter data, press a button to process the data, and then show the result in an output area:
Note how we take care of an "Optional instructive message" without much fanfare.
python Syntax (Toggle Plain Text)
# basic wx.Frame with panel (needed for sizers), label, # edit, button, display, sizer, and border sizer import wx class MyFrame(wx.Frame): """ frame and panel panel is neded for any sizer widgets """ def __init__(self, parent, id, title): # this will be self wx.Frame.__init__(self, parent, id, title) # add panel panel = wx.Panel(self, -1) panel.SetBackgroundColour('green') # now add the needed widgets self.label1 = wx.StaticText(panel, -1, 'Enter ... :') self.entry1 = wx.TextCtrl(panel, -1, '...') self.button1 = wx.Button(panel, -1, 'Do ... ') self.button1.SetBackgroundColour('yellow') self.button1.Bind(wx.EVT_BUTTON, self.onCmd) info = "Optional instructive message!" self.display = wx.TextCtrl(panel, -1, info, size=(250, 100), style=wx.TE_MULTILINE) # use gridbagsizer for layout of widgets # set optional vertical and horizontal gaps sizer = wx.GridBagSizer(vgap=5, hgap=10) sizer.Add(self.label1, pos=(0, 0)) # pos(row,column) sizer.Add(self.entry1, pos=(0, 1)) # row 0, column 1 # span=(1, 2) --> allow to span over 2 columns sizer.Add(self.button1, pos=(1, 0), span=(1, 2)) sizer.Add(self.display, pos=(2, 0), span=(1, 2)) # use boxsizer to add border around sizer border = wx.BoxSizer() border.Add(sizer, 0, wx.ALL, 20) panel.SetSizerAndFit(border) self.Fit() def onCmd(self, event): """process data and show result""" # get the data from the input widget string1 = self.entry1.GetValue() # do the processing ... proc_data = string1 * 3 # show the result ... self.display.SetValue(proc_data) app = wx.App(redirect=False) frame = MyFrame(None, -1, "Title ...") frame.Show() app.MainLoop()
Last edited by ZZucker; Jun 13th, 2008 at 2:42 pm.
Never argue with idiots, they'll just bring you down to their level and beat you with their experience.
I took the above wxPython templet and added a background or splash image. So now you have a templet that shows you how to create a frame, a panel, a label, an entry (input), a button, sizers, a multiline display and show an image. Could be the backbone of many wxPython GUI applications:
python Syntax (Toggle Plain Text)
# basic wx.Frame with splash image panel (panel needed for sizers) # label, edit, button, display, sizer, and border sizer import wx class MyFrame(wx.Frame): """ frame and panel panel is neded for any sizer widgets """ def __init__(self, parent, id, title): # this will be self wx.Frame.__init__(self, parent, id, title) # add panel panel = wx.Panel(self, -1) # pick a splash image file you have in the working folder image_file = 'HIVirus1.jpg' bmp = wx.Bitmap(image_file) # allow for alternative if splash image file not found if bmp: splash = wx.StaticBitmap(panel, -1, bmp) else: panel.SetBackgroundColour('green') splash = panel # now add the needed widgets self.label1 = wx.StaticText(splash, -1, 'Enter ... :') self.entry1 = wx.TextCtrl(splash, -1, '...') self.button1 = wx.Button(splash, -1, 'Do ... ') self.button1.SetBackgroundColour('yellow') self.button1.Bind(wx.EVT_BUTTON, self.onCmd) info = "Optional instructive message!" self.display = wx.TextCtrl(splash, -1, info, size=(250, 100), style=wx.TE_MULTILINE) # use gridbagsizer for layout of widgets # set optional vertical and horizontal gaps sizer = wx.GridBagSizer(vgap=5, hgap=10) sizer.Add(self.label1, pos=(0, 0)) # pos(row,column) sizer.Add(self.entry1, pos=(0, 1)) # row 0, column 1 # span=(1, 2) --> allow to span over 2 columns sizer.Add(self.button1, pos=(1, 0), span=(1, 2)) sizer.Add(self.display, pos=(2, 0), span=(1, 2)) # use boxsizer to add border around sizer border = wx.BoxSizer() border.Add(sizer, 0, wx.ALL, 30) panel.SetSizerAndFit(border) self.Fit() def onCmd(self, event): """process data and show result""" # get the data from the input widget string1 = self.entry1.GetValue() # do the processing ... proc_data = string1 * 3 # show the result ... self.display.SetValue(proc_data) app = wx.App(redirect=False) # stdout/stderr to console frame = MyFrame(None, -1, "Title ...") # optional info, size seems to adjust to sizers demand print frame.GetSize() # (336, 250) frame.Show() app.MainLoop()
Last edited by ZZucker; Jun 13th, 2008 at 7:11 pm.
Never argue with idiots, they'll just bring you down to their level and beat you with their experience.
The wxPython GUI toolkit has some interesting widgets, one of them is a complete analog clock widget. Here is an example:
python Syntax (Toggle Plain Text)
# looking at the wxPython analog clock widget import wx from wx.lib import analogclock as ac class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title) clock = ac.AnalogClockWindow(self) clock.SetBackgroundColour('gray') clock.SetHandColours('black') clock.SetTickColours('WHITE') # set hour and minute ticks clock.SetTickSizes(h=15, m=5) # set hour style clock.SetTickStyles(ac.TICKS_ROMAN) self.SetSize((400,350)) app = wx.App() frame = MyFrame(None, wx.ID_ANY, "analogclock") frame.Show() app.MainLoop()
No one died when Clinton lied.
This code sample shows you how to add an about message box to your wxPython program:
python Syntax (Toggle Plain Text)
# wxPython Frame with menu, statusbar, and about dialog import wx class MyFrame(wx.Frame): """ create a frame, with menu, statusbar and about dialog inherits wx.Frame """ def __init__(self): # create a frame/window, no parent, default to wxID_ANY wx.Frame.__init__(self, None, wx.ID_ANY, 'About (click File)', pos=(300, 150), size=(300, 350)) # create a status bar at the bottom self.CreateStatusBar() self.SetStatusText("This is the statusbar") menu = wx.Menu() # the optional & allows you to use alt/a # the last string argument shows in the status bar on mouse_over menu_about = menu.Append(wx.ID_ANY, "&About", "About message") menu.AppendSeparator() # the optional & allows you to use alt/x menu_exit = menu.Append(wx.ID_ANY, "E&xit", "Quit the program") # create a menu bar at the top menuBar = wx.MenuBar() # the & allows you to use alt/f menuBar.Append(menu, "&File") self.SetMenuBar(menuBar) # bind the menu events to an action/function/method self.Bind(wx.EVT_MENU, self.onMenuAbout, menu_about) self.Bind(wx.EVT_MENU, self.onMenuExit, menu_exit) def onMenuAbout(self, event): dlg = wx.MessageDialog(self, "a simple application using wxFrame, wxMenu\n" "a statusbar, and this about message. snee", "About", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def onMenuExit(self, event): # via wx.EVT_CLOSE event self.Close(True) app = wx.App(0) # create class instance window = MyFrame() window.Show(True) # start the event loop app.MainLoop()
Last edited by sneekula; Jun 29th, 2008 at 11:56 am.
No one died when Clinton lied.
The wxPython GUI toolkit has a number of ways to specify colors, or should I say colours. Here is a simple example:
python Syntax (Toggle Plain Text)
# show different ways to specify colours with wxPython import wx class ColourTest(wx.Dialog): def __init__(self, parent, id, title): """use a dialog box as a simple window/frame""" wx.Dialog.__init__(self, parent, id, title, size=(300, 300)) self.pnl1 = wx.Panel(self, -1) self.pnl2 = wx.Panel(self, -1) self.pnl3 = wx.Panel(self, -1) self.pnl4 = wx.Panel(self, -1) self.pnl5 = wx.Panel(self, -1) self.pnl6 = wx.Panel(self, -1) self.pnl7 = wx.Panel(self, -1) self.pnl8 = wx.Panel(self, -1) # use a wx.GridSizer(rows, cols, vgap, hgap) for layout gs = wx.GridSizer(4,2,3,3) # for this dialog window wx.EXPAND is not needed gs.AddMany([ (self.pnl1, 0 ,wx.EXPAND), (self.pnl2, 0, wx.EXPAND), (self.pnl3, 0, wx.EXPAND), (self.pnl4, 0, wx.EXPAND), (self.pnl5, 0, wx.EXPAND), (self.pnl6, 0, wx.EXPAND), (self.pnl7, 0, wx.EXPAND), (self.pnl8, 0, wx.EXPAND) ]) self.SetSizer(gs) self.SetColors() self.Centre() self.ShowModal() self.Destroy() def SetColors(self): # create a number of colorful panels # using different ways to specify colours self.pnl1.SetBackgroundColour(wx.BLACK) # wx.Colour() uses a (r, g, b) tuple self.pnl2.SetBackgroundColour(wx.Colour(139,105,20)) self.pnl3.SetBackgroundColour(wx.RED) # specify as #RRGGBB hex string self.pnl4.SetBackgroundColour('#0000FF') self.pnl5.SetBackgroundColour('dark green') self.pnl6.SetBackgroundColour('midnight blue') self.pnl7.SetBackgroundColour(wx.LIGHT_GREY) self.pnl8.SetBackgroundColour('plum') app = wx.App() ColourTest(None, wx.ID_ANY, 'wxPython colours') app.MainLoop()
Last edited by Ene Uran; Jun 30th, 2008 at 11:00 am.
drink her pretty
![]() |
Similar Threads
- Starting Python (Python)
- Autoupdater in wxPython (Python)
- what is python (Python)
Other Threads in the Python Forum
- Previous Thread: sudoku solver problem
- Next Thread: Password Generator
| Thread Tools | Search this Thread |
abrupt ansi anti apache approximation array assignment avogadro backend beginner binary bluetooth builtin calculator character cmd converter countpasswordentry curved customdialog dan08 decimals dictionaries dictionary dynamic error exe file float format function gnu graphics heads homework http ideas import inches input java leftmouse library line lines linux list lists loop module mouse mysqlquery number numbers numeric output parsing path phonebook plugin pointer prime programming progressbar py2exe pygame python random recursion redirect schedule scrolledtext software sqlite statictext statistics string strings sudokusolver sum table terminal text thread threading time tlapse trick tuple tutorial twoup ubuntu unicode urllib urllib2 variable wordgame write wxpython xlib






