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

2024-09-27 07:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

another post中,brianoakley提供了一些代码,99%的代码解决了我遇到的问题。当我运行代码时,除了一个小的异常,一切都运行得更好。图形不在正确的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)

Tags: 代码selfdata屏幕defcolumnfilltk
1条回答
网友
1楼 · 发布于 2024-09-27 07:35:18

原因是这句话:

self.DrawArea.configure(scrollregion=self.DrawArea.bbox("all"))

scrollregion定义了更大的虚拟画布的哪个部分可见,或者可以通过将其滚动到视图中而使其可见。它给出了一个矩形的边界,不一定要以0,0为根。在

上面的代码行将获得画布上所有项的边界框(“bbox”)。边界框从最左上角的项开始,在您的示例中是0250。创建“虚拟点”时,边界框从0,0*开始。在

您可以通过在设置scrollregion后添加以下行来查看:

^{pr2}$

*您可能会注意到滚动区域被关闭了一两个像素。在我的机器上显示为-2 248 2002 302。这是因为bbox方法不是100%精确。有时为了表现,它会有一点矫揉造作。官方文件简单地说:

The return value may overestimate the actual bounding box by a few pixels.

如果你知道你的点数总是在0,0到300030000的范围内,你可以直接将scrollregion设置为这个值。使用bbox的结果只是表示“当前画布上的所有内容”的便捷快捷方式。在

在您的情况下,可以将configure语句更改为如下所示:

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

相关问题 更多 >

    热门问题