Re: making a clock face
"'Chris Barker' via wxPython-users" <[email protected]> Sat, 5 Dec 2020 10:49:40 -0800
| Newsgroups | gmane.comp.python.wxpython |
|---|---|
| Message-ID | <CALGmxE+f59O3UoY+xQONM4C4+RujSxk8TecnrDAvcSwr05e0dg@mail.gmail.com> |
Adding another note or two: 1) take a look at the wxPython wiki, specifically the pages on drawing. 2) if you want your clock to resize itself with the window automatically, you can use a wx.lib.float_canvas to handle all the scaling for you. And the Paint events, etc :-) The demo provides a toolbar that lets you pan and zoom around, but if you simply don't use that part, you get a auto-scaling static drawing. tHere are lots of demos for ut here: https://github.com/PythonCHB/wxPythonDemos That being said, if you like the provided analog clock, you're probably best off simply adapting that. -CHB On Fri, Nov 27, 2020 at 11:40 AM Tim Roberts <[email protected]> wrote: > On Nov 27, 2020, at 3:32 AM, Nathan smith <[email protected]> wrote: > > > I have a follow up question though regarding the drawing of a clock. > > Unfortunately, the time being displayed may not always be the time of the > system itself, and from what I have read the wx.AnalogClock does not > support time being passed to it? > > > Correct. Remember, you have the complete source code. As published, it > pulls the current time at the beginning of the “draw” function that handles > painting. However, because Python is such a magical language, you are > free to derive your own class from it that pulls the time from a member > variable, which you can supply. > > > On the subject of drawing though I wanted to ask, I've had limited > exposure to the wx.PaintDC and only been drawing to a frame rather than a > panel. > > So drawing to a panel should work as well? > > > You can draw to any window. Neither a frame nor a panel has any content > of its own, so you don’t have to worry about sharing the space. > > > Finally if I did something like: > > self.dc = wx.PaintDC(panel) > > > No. You only do this inside the EVT_PAINT handler. You can’t cache it. > One of the responsibilities of a “paint” handler is to tell the system “OK, > I’ve finished”, so the system knows that any dirty regions have been > repainted. The PaintDC handles that little bit of overhead on your behalf > in its destructor. If you don’t do that, when your paint handler returns, > the system thinks there are still dirty regions that need to be repainted, > and it will trigger another EVT_PAINT. > > If you need to draw on your panel outside of a paint handler, you’d use > wx.ClientDC. > > > hbox1 = wx.BoxSizer(wx.HORIZONTAL) > hbox1.Add(self.dc, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5) > > > No. A DC is not a window. A DC merely stores the current set of things > you can draw with: fonts, colors, brushes, pens, bitmaps, and so on. The > only things you can add to a sizer are windows. You’d add the panel to the > sizer. Or, if the panel is the only thing in the frame, you don’t need the > sizer — the panel will automatically expand to fill the frame. > > > Later if I did self.dc.Clear() And drew something else using that same > self.dc instance, it woudl draw it in the space given to it by the sizer > hbox1, is that right? > > > Nope. A sizer is not a window — you cannot draw on a sizer. You can draw > on a panel, using a DC, and the sizer merely manages the size of the panel. > > > I realise to you these questions probably seem obvious and you're > wondering why I ask such simple things, but I'm trying to get the theory > straight in my mind before I put pen to paper or, in this case, brush to > panel :) > > > Have you read through the wxWidgets documentation on windows, sizers, and > DCs? You’re confusing some pretty fundamental topics here. Those guys > went to all the trouble of writing it, hoping people would read it. There > are some great wxPython tutorials explaining the basics, and there’s also > Robin’s excellent book on wxPython. > > > In my application for drawing that I have been working on I am using size > calculations to work out where the middle of the screen is for my central > point and just working around that. > Would that still work with inclusion of the sizers? > > > When you say “screen”, do you mean “window”? All you have to do is keep > track of which window you’re drawing into. If you want to find the center > of your panel, then that’s what you do: > size = sell.clockPanel.GetClientSize() > # Center is at size.x // 2 and size.y // 2 > And if you’re using a DC for the panel, then the upper left is at (0,0) > and you just start drawing. > — > Tim Roberts, [email protected] > Providenza & Boekelheide, Inc. > > -- > You received this message because you are subscribed to the Google Groups > "wxPython-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/wxpython-users/DB8DBDBC-E3FB-4266-AC2D-8DC773F475CB%40probo.com > <https://groups.google.com/d/msgid/wxpython-users/DB8DBDBC-E3FB-4266-AC2D-8DC773F475CB%40probo.com?utm_medium=email&utm_source=footer> > . > -- Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/OR&R (206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception [email protected] -- You received this message because you are subscribed to the Google Groups "wxPython-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/CALGmxE%2Bf59O3UoY%2BxQONM4C4%2BRujSxk8TecnrDAvcSwr05e0dg%40mail.gmail.com.