tkinter: Canvas+event bind

Draw a plot

在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import random

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkMessageBox as tk_messagebox
    import tkFont as tk_font
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.messagebox as tk_messagebox
    import tkinter.font as tk_font


class App(tk.Frame):

	def __init__(self, master=None):

		tk.Frame.__init__(self, master)

		self.master.title("Canvas")

		self.lastx = 0
		self.lasty = 0

		self.active = False

		self.font = tk_font.Font(family='Helvetica', size=24, weight='bold')

		self.setScreenSize()

		self.createWidgets()

	def setScreenSize(self):
		ratio = 0.8
		screen_h = self.master.winfo_screenheight()
		screen_w = self.master.winfo_screenwidth()

		# print(screen_h, screen_w)
		self.app_h = round(screen_h * ratio)
		self.app_w = round(screen_w * ratio)

		y = round(screen_h * (1 - ratio) / 2.0)
		x = round(screen_w * (1 - ratio) / 2.0)

		geometry = '' + str(self.app_w) + 'x' + str(self.app_h) + '+' + str(x) + '+' + str(y)
		# print(geometry)
		self.master.geometry(geometry)

		self.config(width=self.app_w, height=self.app_h)

	def createWidgets(self):

		self.canvas = tk.Canvas(self, width=self.app_w, height=self.app_h, bg="white")

		dot_size = 20
		x0 = 100
		y0 = 100
		self.canvas.create_text(100, 50, text='A plot', font=self.font)
		for x in range(10):
			for y in range(10):
				x1 = x0 + dot_size * x
				y1 = y0 + dot_size * y
				x2 = x1 + dot_size
				y2 = y1 + dot_size

				self.canvas.create_rectangle(x1, y1, x2, y2, fill=self.getRandColor(), width=2)

		self.draw()

	def getRandColor(self):
		return '#' + self.getRandRGB() + self.getRandRGB() + self.getRandRGB()

	def getRandRGB(self):
		return '{:02X}'.format(random.randint(0, 255))

	def draw(self):

		self.pack()
		self.pack_propagate(0)
		self.canvas.pack()

		self.mainloop()

if __name__ == '__main__':

	App()


A simple palette

在这里插入图片描述

bind CMD
event type
Using Events With Tkinter Canvas Elements In Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import random

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkMessageBox as tk_messagebox
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.messagebox as tk_messagebox


class App(tk.Frame):

	def __init__(self, master=None):

		tk.Frame.__init__(self, master)

		self.master.title("Canvas")

		self.lastx = 0
		self.lasty = 0

		self.active = False

		self.setScreenSize()

		self.createWidgets()

	def setScreenSize(self):
		ratio = 0.8
		screen_h = self.master.winfo_screenheight()
		screen_w = self.master.winfo_screenwidth()

		# print(screen_h, screen_w)
		self.app_h = round(screen_h * ratio)
		self.app_w = round(screen_w * ratio)

		y = round(screen_h * (1 - ratio) / 2.0)
		x = round(screen_w * (1 - ratio) / 2.0)

		geometry = '' + str(self.app_w) + 'x' + str(self.app_h) + '+' + str(x) + '+' + str(y)
		# print(geometry)
		self.master.geometry(geometry)

		self.config(width=self.app_w, height=self.app_h)

	def createWidgets(self):

		self.canvas = tk.Canvas(self, width=self.app_w, height=self.app_h, bg="white")
		self.canvas.bind('<Button-1>', self.canvasClick)
		self.canvas.bind('<ButtonRelease-1>', self.canvasRelease)
		self.canvas.bind('<Motion>', self.canvasMotion)
		self.draw()

	def canvasClick(self, event):
		self.active = True
		self.lastx = event.x
		self.lasty = event.y

	def canvasRelease(self, event):
		self.active = False

	def canvasMotion(self, event):

		if(self.active):
			self.canvas.create_line(self.lastx, self.lasty, event.x, event.y, width=4, fill="red")
			self.lastx = event.x
			self.lasty = event.y

	def draw(self):

		self.pack()
		self.pack_propagate(0)
		self.canvas.pack()

		self.mainloop()

if __name__ == '__main__':

	App()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tkinter中的Canvas控件是用于绘图的控件,类似于HTML5中的Canvas。它可以用来绘制直线、圆形、弧形、矩形、字符串、图片等。创建Canvas控件的方式是调用tkinter.Canvas函数,并指定其属性,如背景色、宽度、高度、状态等。常用的属性有background(bg)、width、height、state、relief、borderwidth(bd)等。\[2\] 例如,下面的代码演示了创建一个包含空白Canvas控件的窗口,并设置了Canvas的背景色、宽度和高度: ```python import tkinter as tk window = tk.Tk() window.title('Canvas测试') window.geometry('400x300') tk.Label(window, text='Canvas示例').grid(row=0, column=0) cv = tk.Canvas(window, bg="lightblue", width=200, height=200) cv.grid(row=1, column=1) window.mainloop() ``` 在Canvas控件上绘制图形可以使用create_oval、create_line、create_rectangle等方法。例如,下面的代码演示了在Canvas上绘制一个小圆点,并通过绑定鼠标左键事件实现随鼠标移动绘制圆点的功能: ```python from tkinter import * root = Tk() w = Canvas(root, width=500, height=400) w.pack() def paint(event): x1, y1 = (event.x - 1), (event.y - 1) x2, y2 = (event.x + 1), (event.y + 1) w.create_oval(x1, y1, x2, y2, fill='red') # 绑定鼠标左键事件 w.bind('<B1-Motion>', paint) # 创建一个按钮清除画板 Button(root, text='CLEAR', command=lambda x=ALL:w.delete(x)).pack(side=BOTTOM) Label(root, text='Please hold the mouse button and move!').pack(side=BOTTOM) mainloop() ``` 以上是关于TkinterCanvas控件的简单介绍和示例代码。希望对你有帮助! #### 引用[.reference_title] - *1* *2* [PythonTkinter模块的Canvas控件使用学习(1:基本用法)](https://blog.csdn.net/gc_2299/article/details/126532878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [tkinter-Canvas详解](https://blog.csdn.net/peanutfish/article/details/123226871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值