tkinter canvas create_window

Posted 记录——去繁就简

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tkinter canvas create_window相关的知识,希望对你有一定的参考价值。

 

您可以使用画布窗口对象将任何 Tkinter 小部件放置在画布上。窗口是一个可以容纳一个 Tkinter 小部件的矩形区域。

这小组件必须是与相同的顶级窗口的子窗口画布,或位于相同的顶级窗口。

如果要将复杂的多控件对象放在 canvas,您可以使用此方法在画布上放置一个小部件,然后放置其他该框架内的小部件。

 

要在画布上创建新的画布窗口对象

id = Canvas.create_window(x, y, option, ...)

 

 

这将返回对象 窗口对象的 ID。选项包括:


表 15.画布窗口选项

anchor 默认值为 , 表示窗口以 (, ) 位置为中心。 请参见第 5.5 节 “锚点”以了解可能的 值。例如,如果指定 ,则将定位窗口 所以点 (, ) 在 其右(东)边缘的中点。anchor=tk.CENTER anchor=tk.E 。值必须 n, ne, e, se, s, sw, w, nw, or center;东:e,南:s;西:w;北:n。
height 为窗口保留的区域的高度。 如果省略,窗口的大小将适合 所包含微件的高度。有关可能的值,请参见第 5.1 节 “尺寸”。
state 默认情况下,窗口项处于该状态。将此选项设置为 使窗口无响应 到鼠标输入,或到 使其隐形。tk.NORMALtk.DISABLEDtk.HIDDEN
tags 如果是单个字符串,则窗口标记为 那个字符串。使用字符串元组标记 具有多个标签的窗口。请参见第 8.4 节 “画布标签”。
width 为窗口保留的区域的宽度。 如果省略,窗口的大小将适合 所包含微件的宽度。
window 使用要放置在画布上的小部件的位置。 如果最初省略了它,您可以稍后调用以将小部件放置在画布上,其中是窗口的对象 ID。window=wwC.itemconfigure (id, window=w)wid

参考来源:tkinter官方文档:8.15. 画布窗口对象 (tkdocs.com)

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()


以上是关于tkinter canvas create_window的主要内容,如果未能解决你的问题,请参考以下文章

同时移动多个 tkinter.canvas 图形

Python tkinter canvas实现图片裁剪

Tkinter编程应知应会(23)-活用Canvas的对象tag

了解 Tkinter Canvas 的性能限制

与 tkinter-canvas 交互球

尝试使用键绑定时出现 Tkinter/Canvas 类型错误