Python tkinter第一行没有绘制正确的y位置

时间:2014-01-06 19:23:34

标签: python tkinter

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)

1 个答案:

答案 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))