Python tkinter canvas получает видимую область во время запуска

Вопрос:

У меня возникли проблемы с получением tkinters 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()

Лучший ответ:

Это довольно простое решение.

tkinter имеет функцию, называемую .update() которая объясняется здесь:

Обработает все ожидающие события события, вызывает обратные вызовы событий, завершает любое ожидающее управление геометрией, при необходимости перерисовывает виджеты и вызывает все незавершенные задачи бездействия. Этот метод следует использовать с осторожностью, так как он может привести к действительно неприятным условиям гонки, если вызван из-за неправильного места (например, из-за обратного вызова события или из функции, которая может быть вызвана каким-либо образом из обратного вызова события и т.д..). Если вы сомневаетесь, вместо этого используйте update_idletasks.

Короче говоря, вам нужно знать, что добавление self.canvas.update() перед вызовом self.prnt_vis_area() устраняет вашу проблему.

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

Оцените статью
TechArks.Ru
Добавить комментарий