python canvas画移动物体_Python GUI编程入门(25)-移动Canvas对象

Canvas对象生成之后,有时会希望调整对象的位置。例如前面文章中提到的时钟小程序,我们稍加改造可以另外实现一个指针式时钟:

在这个小程序中增加的功能就是根据具体时间计算每个指针的坐标信息,这部分功能在时钟类Clock中实现。这个Clock类修改自前一篇文章中的DitialClock类:

class Clock:

def __init__(self, canvas, width, height):

self.canvas = canvas

self.width = width

self.height = height

self.digital = True

self.type = None

# create font for date.

ftDate = Font(family='Times', size=32)

self.canvas.create_text(width / 2, height / 4,

text='',

font=ftDate,

tag='date')

# create font for time.

self.ftTime = Font(family='Times', size=64)

self.set_type('Digital')

到14行为止的内容都和DitgitalClock相同,第15行调用set_type方法来选择时钟的类型:

def set_type(self, type):

if type=='Digital':

self.canvas.create_text(self.width / 2, self.height / 2,

text='',

font=self.ftTime,

tag='time')

self.canvas.delete('hour')

self.canvas.delete('minute')

self.canvas.delete('second')

self.canvas.delete('center')

else:

self.canvas.delete('time')

self.canvas.create_line(self.width / 2, self.height / 2,

self.width / 2, self.height / 2,

width=15,

fill='red',

arrow=LAST,

arrowshape=(self.width / 20, self.width / 10, self.width / 40),

tag='hour')

self.canvas.create_line(self.width / 2, self.height / 2,

self.width / 2, self.height / 2,

width=10,

fill='green',

capstyle=ROUND,

tag='minute')

self.canvas.create_line(self.width / 2, self.height / 2,

self.width / 2, self.height / 2,

width=3,

fill='blue',

capstyle=ROUND,

tag='second')

center_r = 10

self.canvas.create_oval(self.width / 2 - center_r,

self.height / 2 - center_r,

self.width / 2 + center_r,

self.height / 2 + center_r,

fill='white',

tag='center')

self.type = type

self.update()

代码的内容虽长,内容却很简单:构建需要的对象,消除不需要的对象。更新时钟的内容则是根据类型对不同的对象进行更新:

def update(self): now = time.localtime() time_str = time.strftime('%Y.%m.%d %a %p', now) self.canvas.itemconfigure('date', text=time_str) if type=='Digital': time_str = time.strftime('%I:%M:%S', now) self.canvas.itemconfigure('time', text=time_str) else: self.draw_hour(now.tm_hour) self.draw_minute(now.tm_min) self.draw_second(now.tm_sec)

描画指针的部分是指针式时钟特有的部分,其内容是根据小时,分,秒分别计算每个指针的坐标并更新到相应的对象。在Canvas中可以使用coords方法为对象设置新坐标。Tkinter中更新坐标信息之后并不需要另外调用一个画面更新之类的方法,更新结果会直接反映到画面上。

def update(self):

now = time.localtime()

time_str = time.strftime('%Y.%m.%d %a %p', now)

self.canvas.itemconfigure('date', text=time_str)

if self.type=='Digital':

time_str = time.strftime('%I:%M:%S', now)

self.canvas.itemconfigure('time', text=time_str)

else:

self.draw_hour(now.tm_hour)

self.draw_minute(now.tm_min)

self.draw_second(now.tm_sec)

def draw_second(self, second):

self.__draw_hand('second', self.width * 0.4, second, 60)

def draw_minute(self, minute):

self.__draw_hand('minute', self.width * 0.3, minute, 60)

def draw_hour(self, hour):

self.__draw_hand('hour', self.width * 0.25, hour % 12, 12)

def __draw_hand(self, hand, radius, value, system):

radians = value / system * 2 * math.pi - math.pi / 2

self.canvas.coords(hand,

self.width / 2, self.height / 2,

self.width / 2 + radius * math.cos(radians),

self.height / 2 + radius * math.sin(radians))

接下来是主程序,首先是构建主窗口。和之前的代码稍有不同,代码禁止了主窗口的大小调整功能并为之设置了标题。

# create the main window

root = Tk()

root.resizable(False, False)

root.title('Tkinter Clock V1.0')

增加一个OptionMenu控件用于切换数字式时钟和指针式时钟。

clock_type = StringVar()

clock_type.set('Digital')

enable_menu = OptionMenu(root, clock_type, 'Digital', 'Analog ')

enable_menu.grid(row = 0, column = 0, sticky=W)

构建Canvas和时钟对象。

# create canvas

canvas = Canvas(root, height= 400, width= 400, relief=SUNKEN)

canvas.grid(row=1, column=0)

clock = Clock(canvas, 400, 400)

监视变量的变化并进行时钟类型切换:

def var_changed(*args):

clock.set_type(clock_type.get())

# set variable observer.

clock_type.trace_variable('w', var_changed)

构建并启动定时器:

timer = Timer(root, 1000, clock.update)

timer.start()

启动主窗口,并在mainloop结束后关闭定时器:

root.mainloop()

timer.stop()

完整代码可以从以下地址下载:

https://github.com/xueweiguo/TkinterPrimer/blob/master/Sample/25%20AnalogClock.py

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

面向对象设计,面向对象编程,面向对象思考!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】ABP源码分析四十二:ZERO的身份认证

ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展。同时重写了ABP核心模块中的permission功能,以实现授权。注意:ABP仅仅使用了Asp.Net Identity的身份认证功能,但没有使用Asp.Net Identi…

ASP.NET 安全认证(二)——灵活运用deny与allow 及保护.htm等文件

第二部分 Form 认证的实战运用 话说上回,简单地说了一下 Form 表单认证的用法。或许大家觉得太简单,对那些大内高手来说应该是“洒洒水啦”“小 Kiss 啦(小意思)”。今天咱们来点的花样吧:古有六扇门,拒收…

python nodemcu_python开发nodemcu(一)

nodemcu模块准备工作软件配置:1:查看python版本号,切换到Script目录下2:安装esptool使用命令pip install esptool安装成功标志曾经出现的错误错误提示不知道为什么?我2017/1/8号的时候安装一直提示这个错误&#xff0c…

搜索计算机硬盘的索引恢复,可以做到秒搜的神器everything,你可知对硬盘到底有多大伤害...

相比较Windows系统自带的搜索功能,everything堪称搜索界的神器,尤其在电脑里文件多达数万数十万的恐怖数量,但everything仍可做到秒搜,所以这款软件为大部分办公人员所喜爱。说到everything对硬盘的伤害程度,我们先看看…

【转】ABP源码分析四十四:ZERO的配置

ABP Zero模块中需要配置的地方主要集中在三块:1.配置静态的role;2.配置外部认证源;3.配置本地化语言和资源。 UserManagementConfig/IUserManagementConfig:定义了一个配置项,用于配置外部认证源。默认情况下,ABP Zero…

在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)

项目涉及到多个数据库的查询更新操作,也就必然需要分布式事务的支持,查了MSDN知道 .net 2.0 中利用新增的 System.Transactions 命名空间可以简单的实现分布式事务: System.Transactions 基础结构通过支持在 SQL Server、ADO.NET、MSMQ 和 Mi…

广州计算机自考独立办学,广东省06年自学考试独立办班广州考点办学计划的通知...

独立办班是广东省承担主考任务的普通高等院校中独立举办的自学考试辅导班(简称独立办班),在省考委的领导下,接受省考办的指导与管理。根据广东省考试中心《关于印发2006年广东省自学考试独立办班办学计划的通知》(粤考试中心[2006]164号)文件精神&#x…

android 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果

背景在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容。但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加一个回弹的动画效果,会让界面交互更加舒服,提升用…

【转】OData的初步认识

What – OData是什么? OData - Open Data Protocol,是一个设计和使用RESTful API的标准。REST本身只是一个构建web服务的思想和理念,其没有规定一个统一的标准来限制开发人员该如何设计RESTful API。其实我们实际开发中的确也没有遵循某个统…

选择Windows CE wince嵌入式操作系统 的十大理由

Windows CE是什么? Windows CE是一个具有战略意义的操作系统。它拥有windows操作系统的特点,支持32位虚拟内存机制、按需分配内存和内存映射文件;他也是抢先式多任务并具有强大通信能力的Win32嵌入式操作系统,是微软专门为信息设…

三元运算符 在数据绑定中的使用

在使用 datalist 等控件绑定前台数据的时候&#xff0c;有时希望一行只显示定长字符&#xff0c;多出来的部分以省略号代替&#xff0c;我使用三元运算符来做&#xff1a;<asp:DataList id"DataList1"runat"server"RepeatColumns"5"Width&quo…

软件测试中软,软件测试报告 - 中软模板.docx

Webplug platform测试报告TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc259473567" 1. 引言 PAGEREF _Toc259473567 \h 1 HYPERLINK \l "_Toc259473568" 1.1 目的 PAGEREF _Toc259473568 \h 1 HYPERLINK \l "_Toc259473569" 1.2 术语 PAG…

【转】ABP源码分析四十三:ZERO的本地化

ABP Zero模块扩展了ABP基础框架中的本地化功能&#xff0c;实现了通过数据库对本地化功能进行管理。其通过数据库保存本地化语言及其资源。 ApplicationLanguage&#xff1a;代表本地化语言的实体类。一种语言就是一个ApplicationLanguage实例。 ApplicationLanguageProvider&a…

WinCE流设备驱动简介及GPIO驱动的实现

作者&#xff1a;ARM-WinCE 流设备驱动实际上就是导出标准的流接口函数的驱动&#xff0c;这是文档上面的定义。在WinCE中&#xff0c;所有的流设备都导出流设备接口&#xff0c;这样WinCE中的Device Manager可以加载和管理这些流设备驱动。 流设备驱动的架构如图&#xff1a;…

GridView数据导入Excel/Excel数据读入GridView

1 protectedvoidButton1_Click(objectsender, EventArgs e)2 {3 Export("application/ms-excel", "学生成绩报表.xls");4 }5 6 privatevoidExport(stringFileType, stringFileName)7 {8 Response.Charset "GB2312";9 Response.ContentEncodi…

计算机出现蓝屏怎么解决,电脑出现蓝屏故障0x00000019怎么办?

原标题&#xff1a;电脑出现蓝屏故障0x00000019怎么办&#xff1f;电脑开机出现蓝屏故障0x00000019怎么处理&#xff1f;电脑出现蓝屏&#xff0c;一般都会有提示错误代码或者出错的文件名等&#xff0c;最近就有用户跟小编反映&#xff0c;开机出现了蓝屏故障&#xff0c;提示…

画世界怎么用光影_怎么绘制光影?插画人物光感的塑造教程

怎么绘制光影&#xff1f;在角色氛围图里面他们的主要构成是&#xff1a;角色环境&#xff1b;打光色彩组成&#xff0c;有同学理解为角色场景结合起来&#xff0c;大概就是人和景组合构成。但我们过去都是的画都是只画角色&#xff0c;那么现在想营造氛围感&#xff0c;在画的…

【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块

AbpZeroDbContext&#xff1a;配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitivePropertyConfiguration添加了扩展方法用于创建Index。 AbpZeroDbModelBuilderExtensions&#xff1a;给DbModelBuilder添加了扩展方法用于表的重命名。 AbpZ…

Enterprise Library系列文章回顾与总结

http://www.readygo.com.cn/NETFW/070216/Enterprise-Library-JiLiWenZhangHuiGuYuLongJi.htm 转载于:https://www.cnblogs.com/encounter/archive/2007/04/24/2188877.html

机载计算机结构,机载计算机

摘要 针对目前自动测试设备的通用性设计&#xff0c;提出了一种基于PXI总线的测试平台。文中对PXI测试系统、接口适配器和开关网络进行了说明&#xff1b;介绍了测试软件和故障诊断系统的设计&#xff1b;分析了该系统设计过程中面临的通用性、故障诊断与定位等问题。其设计思想…