Jun 11, 2010

wxpython 笔记

Good Tutorial

  • wxBufferedDC
  • wxBufferedPaintDC
  • wxPostScriptDC
  • wxMemoryDC
  • wxPrinterDC
  • wxScreenDC
  • wxClientDC
  • wxPaintDC
  • wxWindowDC
EVT_PAINT: 当 window 创建时,会 paint; 当窗口 放大重新出现时(缩小时不会),会 repaint;当 window 调用 Refresh 时,会进行 repaint。这些情况下,会出现 EVT_PAINT 时间,在相应的 OnPaint 函数中,必须使用且只能只用 wxPaintDC 或者 wxBufferedPaintDC,否则会不断调用 OnPaint 或出现其他错误。
EVT_PAINT 和屏幕更新频率并无关系。

ClientDC 是最常用的,指 window 的 client 部分,也就是不带边框菜单工具栏状态栏的那部分。Window 则对应整个 window,screen 对应整个屏幕。

Buffered 版本指先缓冲到一个wx.Bitmap 中,所有画图操作都在这个缓冲中进行。当该 DC 销毁时,再一次性 repaint,这样就避免了闪烁。

如果不给 wxBufferedPaintDC 提供 Bitmap,则会自动创建一个临时 Bitmap,这时它是纯黑的背景,和client 是不一样的,client 有自己的前景和背景色。

事件:
wx.CloseEvent
wx.CommandEvent  各种控件触发的事件(按钮,菜单等)
wx.KeyEvent 键盘
wx.MouseEvent 鼠标
wx.PaintEvent
wx.SizeEvent 放大缩小窗口(会调整各种控件的位置)
wx.TimerEvent


EVT_CLOSE 点击关闭,Alt+F4,菜单关闭,或者 Close() 函数

EVT_PAINT
EVT_TIMER 定时器
EVT_KEY_DOWN 按键
EVT_BUTTON 按钮

Bind 时可以指定 source, 如果不指定 source,则对所有的源都有效。

Destory() 函数可以彻底关掉 window,可以在 OnClose 中调用

Timer: timer 事件发生的频率只和 timer 的频率有关,和处理该事件的函数所发费的时间没有关系。在下面的例子中,OnTimer 等待了1秒,但是显示的时间还是以2秒为间隔,也就是 timer 的频率。
import wx
import time

class ClockWindow(wx.Window):
    def __init__(self, parent):
        wx.Window.__init__(self, parent)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(2000)

    def Draw(self, dc):
        t = time.localtime(time.time())
        st = time.strftime("%I:%M:%S", t)
        w, h = self.GetClientSize()
        dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
        dc.Clear()
        dc.SetFont(wx.Font(30, wx.SWISS, wx.NORMAL, wx.NORMAL))
        tw, th = dc.GetTextExtent(st)
        dc.DrawText(st, (w-tw)/2, (h)/2 - th/2)
        
    def OnTimer(self, evt):
        dc = wx.BufferedDC(wx.ClientDC(self))
        self.Draw(dc)
        time.sleep(1)
        print 'OnTimer'

    def OnPaint(self, evt):
        dc = wx.BufferedPaintDC(self)
        self.Draw(dc)
        print 'OnPaint'

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="wx.Timer")
        ClockWindow(self)
        

app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()

1 comments:

Unknown said...

這是一項有全球化事業的商機,
而且潛力無窮,任何人都可以去從事。
現在只要在家工作,越早加入就能越早贏得改變人生的機會。
請先免費 註冊體驗12周:
網址登入:
http://joe80411.weebly.com/
祝~天天都是有美好的一天˙快樂與您同在