2014-01-06 79 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))