2017-11-03 15 views
2

初期化中に可視領域を与えるためにtkintersキャンバスを取得するのに問題があります。この時間に可視領域を取得する必要がある理由は、作成直後にユーザーを表示します。Python tkinter canvasが起動時に可視領域を取得する

キャンバスは、それがボタンを押すことで__init__した後、正常域の印刷されますが、機能が.grid()

__init__内部
try: 
    import tkinter as tk 
except: 
    import Tkinter as tk 

class app(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.grid_columnconfigure(0,weight=1) 
     self.grid_rowconfigure(1,weight=1) 
     self.vis_area_btn = tk.Button(self,text="Print Visible Area", 
             command=self.prnt_vis_area) 
     self.canvas = tk.Canvas(self,bg="white",highlightthickness=0) 
     self.vis_area_btn.grid(row=0,column=0,sticky="nswe") 
     self.canvas.grid(row=1,column=0,sticky="nswe") 
     self.prnt_vis_area() 

    def prnt_vis_area(self,event=None): 
     #self.canvas.configure(scrollregion=(0,0,1,1)) 
     x1 = self.canvas.canvasx(0) 
     y1 = self.canvas.canvasy(0) 
     x2 = self.canvas.canvasx(self.canvas.winfo_width()) 
     y2 = self.canvas.canvasy(self.canvas.winfo_height()) 
     print (x1,y1,x2,y2) 

root = app() 
root.mainloop() 
+0

[更新Tkinterのウィンドウ](https://stackoverflow.com/questions/35411940/updating-tkinter-window) –

+1

@Rloqvistの可能性の重複この問題は、Tk()ウィンドウのメインループを起動する前に特定のtkinterウィジェットを更新することに関するものですが、tkinterウィジェットの属性を変更することについては全く別の問題です。 –

答えて

3

後に呼び出されたときにこれは非常に簡単な修正ではありません。 、

プロセスのすべての保留中のイベント呼び出すイベントのコールバックを、保留中のジオメトリ管理を完了し、必要に応じてウィジェットを再描画し、保留中のすべてのアイドルタスクを呼び出します:

のTkinterはhereを説明し.update()と呼ばれる機能があります。このメソッドは、間違った場所から呼び出された場合(イベントコールバック内から、またはイベントコールバックなどから何らかの方法で呼び出すことができる関数から)呼び出された場合、本当に不快な競合条件につながる可能性があるため、注意して使用する必要があります。 )。不確かな場合は、代わりにupdate_idletasksを使用してください。

つまり、self.prnt_vis_area()に電話する前にself.canvas.update()を追加するだけで問題を解決できることをすべて知っておく必要があります。私はあなたが提案してきた複製可能が無関係であると主張するだろう

def __init__(self): 
    tk.Tk.__init__(self) 
    self.grid_columnconfigure(0,weight=1) 
    self.grid_rowconfigure(1,weight=1) 
    self.vis_area_btn = tk.Button(self,text="Print Visible Area", 
            command=self.prnt_vis_area) 
    self.canvas = tk.Canvas(self,bg="white",highlightthickness=0) 
    self.vis_area_btn.grid(row=0,column=0,sticky="nswe") 
    self.canvas.grid(row=1,column=0,sticky="nswe") 
    self.canvas.update() #here 
    self.prnt_vis_area() 
関連する問題