专栏首页用户4381798的专栏6.wxPython防止窗体重画棋子消失的机制

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

可以画图的类中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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 10.带人机对战的五子棋程序

    今天我们带来一个带人机对战功能的五子棋程序。程序基于前面文章中的框架搭建,新增人机对战的策略。程序基于规则进行决策,不考虑禁手,玩家执黑子先行。棋盘规模采用15...

    用户4381798
  • 7.wxPython制作一个桌面精灵

    今天我们通过窗体的SetShape()函数来制作一个桌面精灵。我们制作的桌面精灵本质上还是一个窗体,只不过是一个特殊格式的窗体。我们创建一个style=wx.F...

    用户4381798
  • 11.实现AI对战AI的五子棋程序

    在前文AI人机对战的五子棋程序的基础上,我们加入了AI对战AI的功能。动态图中黑白棋子都是程序通过内置的逻辑控制落子,实现AI与AI之间的对战。这一版程序的AI...

    用户4381798
  • iOS 自定义分段控制器

    最近做项目时遇到一些问题,就是项目里原有分段控制器的适用范围有些局限,虽然网上也有很多分段控制器的demo,但自己写的,可控性和项目适用性自己能很明白,所以我专...

    清墨
  • 基于深度学习和经典方法的文本分类

    文本分类应该是自然语言处理中最普遍的一个应用,例如文章自动分类、邮件自动分类、垃圾邮件识别、用户情感分类等等,在生活中有很多例子,这篇文章主要从传统和深度学习两...

    段石石
  • 手把手教你用Python开发“剪刀石头布”小游戏【附源码】

    最近在学习PyQt5可视化界面,这是一个内容非常丰富的gui库,相对于tkinter库,功能更加强大,界面更加美观,操作也不难。于是我开始小试牛刀,用PyQt...

    python学习教程
  • 10.带人机对战的五子棋程序

    今天我们带来一个带人机对战功能的五子棋程序。程序基于前面文章中的框架搭建,新增人机对战的策略。程序基于规则进行决策,不考虑禁手,玩家执黑子先行。棋盘规模采用15...

    用户4381798
  • Pytorch实现卷积神经网络训练量化(QAT)

    深度学习在移动端的应用越来越广泛,而移动端相对于GPU服务来讲算力较低并且存储空间也相对较小。基于这一点我们需要为移动端定制一些深度学习网络来满足我们的日常续需...

    BBuf
  • 我的小工具,用C和python实现远程读卡器,远程读写消费卡片

    这个远程读卡器就是一普通usb口或串口的读卡器,只不过配合一个电脑软件作为tcp服务器。这样,程序员可以在公司电脑上运行程序连到服务器上。服务器端操作控制现场...

    特立独行的猫a
  • 我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互)

    之前的小工具,远程读卡器web客户端,实现原理是把读写卡服务装在远程(现场)的电脑上,这样有一些缺点,比如现场电脑必须开启端口映射,让客户端能否访问到。只能写好...

    特立独行的猫a

扫码关注云+社区

领取腾讯云代金券