美文网首页简友广场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防止窗体重画棋子消失的机制

    可以画图的类中wx.ClientDC不必依赖窗体绘画事件,可以随时实例化,随时画图。但是窗体最小化之后再恢复,重画...

  • 5.wxPython响应鼠标点击画出棋子

    今天我们为wxPython窗体设置鼠标点击事件,并在事件响应函数里画出黑白棋子。这里我们为窗体绑定wx.EVT_L...

  • 彩色棋子

    彩色棋子是一个原声开发的小游戏,首先会出来两个彩色的棋子,一段时间后棋子消失,然后你去点击棋子出现的位置,等级越高...

  • GUI之窗体监听机制

    GUI:Graphical User Interface(图形用户接口/界面) 事件监听小练习:创建一个窗体,然后...

  • 防止重放机制

    一、API重放攻击 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击。重放攻击是什么呢?就是把你的请求原封...

  • 子窗体、主窗体传参

    在主窗体里面操纵子窗体的控件 子窗体 主窗体 主窗体点击事件操作 直接在主窗体里面操纵子窗体的控件,进行一系列操作...

  • QT的GUI设计基础(002)

    1,UI文件设计与运行机制。(以新建一个Widget Application项目为例,选择QWidget作为窗体基...

  • 防止死锁的加锁机制

    防止死锁的加锁机制 问题 你正在写一个多线程程序,其中线程需要一次获取多个锁,此时如何避免死锁问题。 解决方案 在...

  • c# 结业考机试宝典

    窗体属性 设置窗体名称:选中窗体文件>右键>重命名 设置窗体标题:title = 标题内容 设置为MDI父窗体:I...

  • C#窗体 2019-02-14

    一、窗体常用属性 窗体标题:Test 窗体名:Name 窗体图标:Icon 北京颜色:BackgroundC...

网友评论

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

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