6.wxPython防止窗体重画棋子消失的机制
时间:2022-07-22
本文章向大家介绍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
- [编程经验] Pandas中比较好用的几个方法
- [编程经验] Elasticsearch 初识
- 2017.10.26水题大作战部分题解
- 2017.10.27涩会题大乱斗部分题解
- 【 关关的刷题日记50】 Leetcode 345. Reverse Vowels of a String
- Day1上午解题报告
- 【 关关的刷题日记51】 Leetcode 67. Add Binary
- 【 关关的刷题日记53】 Leetcode 100. Same Tree
- Day1下午解题报告
- 【关关的刷题日记54】Leetcode 226. Invert Binary Tree
- Day2上午解题报告
- 【关关的刷题日记55】Leetcode 404. Sum of Left Leaves
- CSS选择器详解
- 前端开发必备之Emmet
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 怒爬某破Hub站资源,简单4步撸个鉴黄平台!
- 审阅“史上”最烂的代码
- BeanUtils 是用 Spring 的还是 Apache 的好?
- 一看就会的mysql索引优化(真实案例)
- 【015期】JavaSE面试题(十五):网络IO流
- 算法篇:二分查找基础篇
- 算法篇:双指针之接雨水
- 因用了Insert into select语句,美女同事被开除了!
- 【原创】Java并发编程系列33 | 深入理解线程池(上)
- 算法篇:二分法之k个数之和
- 记一次循环依赖踩坑
- 为什么大家都说 SELECT * 效率低
- 一些恶心的代码片段,吐了....
- 大数据入门:Spark+Kudu的广告业务项目实战笔记(二)
- 给女同事讲完代理后,女同事说:你好棒哦