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 windowroot = 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 canvascanvas = 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


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

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

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

调整了canvas的高度页面变化后还原_Python GUI编程入门(25)-移动Canvas对象相关推荐

  1. 调整了canvas的高度页面变化后还原_Web 页面录屏实现

    (给前端树加星标,提升前端技能) 作者:frontdoghttps://juejin.im/post/5c601e2f51882562d029d583 写在前面的话 在看到评论后,突然意识到自己没有提 ...

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

    Canvas对象生成之后,有时会希望调整对象的位置.例如前面文章中提到的时钟小程序,我们稍加改造可以另外实现一个指针式时钟: 在这个小程序中增加的功能就是根据具体时间计算每个指针的坐标信息,这部分功能 ...

  3. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题

    问题描述: bootstrap官方模板中上方导航栏当缩小到一定程度后会发生格式的变化,但我想取消这种变化 页面缩小前: 页面缩小后: 解决方法: 经过阅读bootstrap的css代码后发现了这么一行 ...

  4. class h5 点击后样式变化_【php】JQuery怎么实现页面刷新后保留鼠标点击addclass的样式?...

    刚开始是这个效果 鼠标点击之后变成了这个效果 要保证实现 a 标签点击链接一个新的网址 同时也要保证效果达到 我目前写的网站代码 可以下载 http://115.com/file/c2zlhblv 看 ...

  5. 4行代码搞定iframe高度自动变化,完美兼容(转)

    为什么80%的码农都做不了架构师?>>>    本帖转自: http://www.iteye.com/topic/839143 跨域问题 :http://ued.alimama.co ...

  6. 当页面放大后, 背景会消失

    当页面放大后, 深蓝色的背景没有撑满全屏, 出现的原因可能是子元素设置了高度height: 100%, 高度应该由子元素的内容撑开, 高度不应该写死, 只需要把子元素的height: 100% 删掉就 ...

  7. 谈论C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通)

    3月4日 谈论C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通) 引用 C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通) 问题是这样的,打印机使用的是卷筒的连续纸,要打印 ...

  8. 用canvas生成图片为页面添加水印

    做政府行业的项目经常会遇到需要为页面添加用户登陆信息水印的功能. 有几个需要注意的点 需要平铺整个页面 水印需要盖在内容上,但是不能影响操作 需要自适应窗口大小 考虑到以上需求有两种方案: 方案一:利 ...

  9. 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题

    [vue]使用localStorage解决vuex在页面刷新后数据被清除的问题 参考文章: (1)[vue]使用localStorage解决vuex在页面刷新后数据被清除的问题 (2)https:// ...

最新文章

  1. 从零打造在线网盘系统之Hibernate框架起步
  2. craigslist_Craigslist,Wikipedia和丰富经济
  3. SVN之文件同步更新
  4. layui登录页面写入数据_layui 页面保存数据
  5. jQuery事件3——trigger触发事件
  6. Android开发过程中的部分经验总结
  7. 《Ext详解与实践》节选:自定义单元格的显示格式
  8. python 函数的调用的时候参数的传递_Python Unittest;如何获取调用函数时传递的参数?...
  9. php连接mysql数据,php连接mysql数据库
  10. python importlib_importlib --- import 的实现 — Python 3.10.0a2 文档
  11. android 手写签批_Android手写签批功能实现(适配Android6
  12. java读取excel数据的方法是_java怎么读取excel文件里的数据
  13. vc6可编译的 linux 源码,winpcap+vc6编译环境配置,以及获取网络设备列表的源代码...
  14. 字典树实现_leetcode之820. 单词的压缩编码 | python极简实现字典树
  15. 判断画布是否是图元格式画布
  16. 该填志愿了,国内大学计算机专业哪家强?
  17. 计算机 无法进入睡眠模式,Win10无法进入睡眠模式怎么办?电脑不能进入睡眠模式的解决方法...
  18. 文献关联分析图谱——connected papers网站
  19. 【SpringBoot】Error creating bean with name ‘methodValidationPostProcessor‘ defined in class path reso
  20. [论文解析] Diffusion Models Beat GANs on Image Synthesis

热门文章

  1. 2015-4-20 BAV推广页面修改前后对比-安全网购
  2. 关于Jstree节点显示无法收缩的解决办法
  3. java 设计模式学习笔记十 bridge桥模式
  4. c中volatile用法
  5. python程序入门设计_程序设计入门—Python
  6. harmonyos2.0如何申请,华为鸿蒙HarmonyOS2.0手机开发者Beta版公测申请地址方法_专题_53货源网...
  7. python运行的原理_Python运行机制(转)
  8. python实现排序算法_python实现各种排序算法
  9. 把执行结果转成json对象报错_JSONObject获取值后为一个对象,将对象转为JSONObject时报错...
  10. .net环境iis执行php,十步!轻松搞定IIS+PHP环境