在another post中,Brian Oakley提供了一些代码,99%的代码解决了我遇到的问题。当我去运行代码时,除了一个小例外,一切运行得更好。图表不在正确的y位置。我尝试的任何东西都没有用。我很难过。最后,今天早上我偶然发现问题的答案,我不确定这是否是一个问题,很可能与Frame,或者交易是什么。如果他们是问题的另一个解决方案,而不是先在屏幕上放置一个虚拟点,我就会徘徊。
在下面的代码中,如果删除def graph_data(self):
第一行中的#,一切正常。如果您拥有#in并且最初没有在屏幕上绘制虚拟点,那么线条将不会显示在屏幕上的正确位置。他们是另一种处理这种问题的方式,因为它似乎总是在发生。我在linux上运行它,所以甚至可能是问题的一部分......谁知道。奇怪的是,当我在我的程序中首先进行比例打印时,它总是正确放置,但是当我去绘制数据时,除非我先添加一个虚拟点,否则在屏幕上运行的水平线永远不会打印在正确的位置。
import tkinter as tk
class Example(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.DrawArea = tk.Canvas(self, width=1300, height=600, background="black",
borderwidth=0, highlightthickness=0)
self.scale = tk.Canvas(self, width=30, height=600, background="black",
borderwidth=0, highlightthickness=0)
self.hsb = tk.Scrollbar(self, orient="horizontal", command=self.DrawArea.xview)
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.DrawArea.yview)
self.DrawArea.configure(yscrollcommand=self.vsb.set, xscrollcommand=self.hsb.set)
self.DrawArea.grid(row=0, column=0, sticky="nsew")
self.scale.grid(row=0, column=1, sticky="nsew")
self.vsb.grid(row=0, column=2, sticky="ns")
self.hsb.grid(row=1, column=0, columnspan=2,sticky="ew")
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.graph_data()
def graph_data(self):
#self.DrawArea.create_line((0,0), (0,0), fill = "black")
self.DrawArea.create_line((0,250), (1000,250), fill = "white")
self.DrawArea.create_line((0,300), (2000,300), fill = "white")
self.DrawArea.configure(scrollregion = self.DrawArea.bbox("all"))
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
答案 0 :(得分:0)
原因是因为这句话:
self.DrawArea.configure(scrollregion=self.DrawArea.bbox("all"))
scrollregion定义了较大虚拟画布的哪些部分可见,或者可以通过将其滚动到视图中使其可见。它给出了一个矩形的边界,它不一定必须以0,0为根。
上面的代码行将获得画布上所有项目的边界框(“bbox”)。边界框以最左上角的项目开始,在您的情况下为0,250。创建“虚拟点”时,边界框从0,0 *开始。
您可以在设置scrollregion后立即添加以下行:
print("the scrollregion is", self.DrawArea.cget("scrollregion"))
*您可能会注意到滚动区域已关闭了一两个像素。在我的机器上,它显示为-2 248 2002 302.这是因为bbox
方法不是100%精确。为了表现,它有时会略微捏造一下。官方文件只是说明:
返回值可能会高估实际的边界框 像素。
如果您知道您的积分将始终在0,0到3000,3000的范围内,则可以直接将滚动区域设置为该值。使用bbox的结果只是一个方便的快捷方式,意思是“当前在画布上的所有东西”。
在您的情况下,您可以将configure语句更改为:
self.DrawArea.configure(scrollregion=(0,0,3000,3000))