美文网首页简友广场python GUI开发
6.wxPython防止窗体重画棋子消失的机制

6.wxPython防止窗体重画棋子消失的机制

作者: 赵明嗯 | 来源:发表于2020-06-11 21:46 被阅读0次

    可以画图的类中wx.ClientDC不必依赖窗体绘画事件,可以随时实例化,随时画图。但是窗体最小化之后再恢复,重画的窗体上通过wx.ClientDC绘制的棋子会消失。而wx.PaintDC依赖于窗体绘图事件,需要在事件处理函数中实例化,优点是窗体重画之后绘制的图形不会消失,棋盘就是通过wx.PaintDC画出的。结合两个绘图类的特点,我们可以绘制出不会消失的棋子。
    我们的方法是通过建立一个元组列表self.piecePos,列表包含已经落子的位置坐标组成的元组数据。随着落子,程序通过列表的方法append随时添加到元组列表。同时,在绘图事件处理函数中通过wx.PaintDC的对象将元组列表中的位置再画上棋子,这样即使窗体重画,棋子也不会消失。同时我们还要建立一个既记录位置又记录棋子颜色的元组列表self.piecePosCols,来保证棋子重绘时颜色不会出错。

    #在棋盘上画出窗体重画也不消失的棋子
    import wx
    class myFrame(wx.Frame):
        def __init__(self):
            self.unit = 30
            self.pointNum = 15#每行落棋点数
            self.pieceNum=0
            self.bkCol=(220, 210, 0)
            self.wht=(255,255,255)
            self.blk=(0,0,0)
            self.actColor=self.blk
            self.piecePos=[(self.unit/2,self.unit/2)]
            self.piecePosCols = [(self.unit/2,self.unit/2,self.blk)]
            # 元组列表记录落棋位置和落棋颜色
            super().__init__\
                (parent=None,pos=[100,100],
                 size=[self.unit*self.pointNum
                       +self.unit+20,
                       self.unit*self.pointNum
                       +self.unit+30+20],
                 title="商贾三国")
            self.SetIcon(wx.Icon("WeatherBundle.ico"))
            self.panel = wx.Panel(self)
            self.panel.SetBackgroundColour(self.bkCol)
            self.tip = \
                wx.TextCtrl(self.panel, -1, "",
                            pos=(self.unit*self.pointNum
                                 +self.unit-80, 0),
                            size=(80,25))
            self.tip.SetBackgroundColour(self.bkCol)
            self.panel.Bind(wx.EVT_PAINT,self.draw)
            self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)
            self.Show()
        def draw(self,event):
            mydc=wx.PaintDC(self.panel)
            unit=self.unit
            pointNum=self.pointNum
            x=unit
            y=unit
            for i in range(1,pointNum+1):
                mydc.DrawLine(x,y,x,unit*pointNum)
                x=x+unit
            x=unit
            for i in range(1,pointNum+1):
                mydc.DrawLine(x, y, unit*pointNum, y)
                y=y+unit
            for i in range(0,len(self.piecePos)):
                mydc.SetBrush(wx.Brush(self.piecePosCols[i][2]))
                mydc.DrawCircle(self.piecePos[i][0], self.piecePos[i][1], self.unit / 2.5)
        def OnClick(self,event):
            unit=self.unit
            pos = event.GetPosition()
            mydc=wx.ClientDC(self.panel)
            if self.pieceNum%2==0:
                self.actColor=self.blk
            else:self.actColor=self.wht
            mydc.SetBrush(wx.Brush(self.actColor))
            x=round(pos.x/unit)*unit
            y=round(pos.y/unit)*unit
            piecePo=(x,y)
            piecePoCol=(x,y,self.actColor)
            # print(piecePo)
            if piecePo not in self.piecePos:
                # mydc.DrawCircle(x,y,self.unit/2.5)
                self.piecePos.append(piecePo)
                self.piecePosCols.append(piecePoCol)
                self.pieceNum = self.pieceNum+1
                print(self.pieceNum)
                self.tip.SetValue('%s,%s' % (x,y))
    myapp=wx.App()
    myframe=myFrame()
    myapp.MainLoop()
    
    buxiaoshideqizi.png

    相关文章

      网友评论

        本文标题:6.wxPython防止窗体重画棋子消失的机制

        本文链接:https://www.haomeiwen.com/subject/ftvitktx.html