2014-01-06 118 views
1

another post Brian Oakley提供了一些代码,99%解决了我遇到的问题。当我去运行代码时,只有一个小例外,一切都运行得更好。该图不在正确的y位置。我正在尝试的任何东西都不起作用。我被难倒了。最后,今天早上我偶然发现了问题的答案,我不确定这是否是一个问题,很可能与Frame或者交易有关。如果他们是另一个解决问题的办法,而不是首先在屏幕上放置一个虚拟点,我就会徘徊。Python tkinter第一行没有绘制正确的y位置

在下面的代码中,如果您删除def graph_data(self):的第一行中的#,一切正常。如果您有#入口,并且最初不在屏幕上绘制虚拟点,则线条将不会显示在屏幕上的正确位置。这是他们处理这个问题的另一种方式,因为它似乎总是在发生。我在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

的原因是因为这句话的:

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

*您可能会注意到,scrollregion是关闭的一两个像素。在我的机器上它显示为-2 248 2002 302.这是因为bbox方法不是100%精确的。为了表现的缘故,它有时会变得有点勉强。官方文档简单地陈述:

返回值可能会高估实际的边界框几个 像素。

如果您知道您的积分总是在0,0到3000,3000的范围内,那么您可以直接将scrollregion设置为该值。使用bbox的结果只是一个方便的捷径,意思是“目前在画布上的所有内容”。

在你的情况,你可以更改配置语句是这样的:

self.DrawArea.configure(scrollregion=(0,0,3000,3000))