matplotlib 着色器画布(图画布TkAgg)b框给出“无”

v09wglhw  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(143)

遇到了奇怪的问题:canvas.bbox('ALL')得到None
所以主题说canvas只有在代码中有一些.create_xxx()方法时才给予。问题是类FigureCanvasTkAgg在它的__init__方法中使用create_image方法,我认为在我的小代码段中,当我创建thic类的示例时,它应该在调用instance.bbox命令时给我一些坐标框。但它没有...

self.Frame = Frame(root, bg = 'white')

self.Frame.place (relx = 0.37 , rely = 0.05 , relheight = 0.85 , relwidth = 0.51)

self.canvas = FigureCanvasTkAgg ( fig , master = self.Frame)  # A tk.DrawingArea.

self.canvas.get_tk_widget ().place ( relx = 0 , rely = 0)

self.canvas.get_tk_widget ().config ( yscrollcommand = self.vbar.set ,
                                      scrollregion = (0,0,w,639*h/10 ))

self.canvas.get_tk_widget ().update_idletasks ()

print(self.canvas.get_tk_widget ().winfo_width(),self.canvas.get_tk_widget ().winfo_height() )
self.Frame.update_idletasks ()

print(self.canvas.get_tk_widget ().bbox('ALL'))
self.toolbar = NavigationToolbar2Tk ( self.canvas , self.Frame )

self.vbar.pack ( side = RIGHT , fill = Y)
h7appiyu

h7appiyu1#

遇到了奇怪的问题:bbox('ALL ')给出"无"。
当您使用'ALL'时,它将查找所有带有标记'ALL'的画布对象,但未找到任何对象。
如果您想要所有对象的边界框,bbox的正确参数是'all',而不是'ALL'。文字字符串"all"被画布视为特殊情况,以表示画布上的所有对象。

x3naxklr

x3naxklr2#

@BryanOakley的回答确实是一个重要的澄清。
不幸的是,已故的约翰·希普曼的excellent documentation对于现在的tkinter确实有一个错误。它指出:

.bbox(tagOrId=None)

Returns a tuple (x1, y1, x2, y2) describing a rectangle that encloses all the objects 
specified by tagOrId. If the argument is omitted, returns a rectangle enclosing all objects
on the canvas. The top left corner of the rectangle is (x1, y1) and the bottom right corner
is (x2, y2).

目前,如果使用canvas.bbox(),则tkinter返回_tkinter.TclError: wrong # args: should be ".!xxxxxxx bbox tagOrId ?tagOrId ...?"
有一些在线tkinter文档提倡使用ALLone就是一个例子。然而,大多数读者可能会忘记,from tkinter import *语句已经被用于导入所有tkinter对象,这也不符合PEP 8关于import语句的指导方针。导入tkinter的一个好的实践是使用import tkinter as tk。按照这个方法,你的陈述应该是:

print(self.canvas.get_tk_widget().bbox(tk.ALL))

print(self.canvas.get_tk_widget().bbox('all'))

**总结:**在tk.Canvas对象/示例上使用.bbox(tk.ALL).bbox('all')

相关问题