Как сохранить виджет всегда в центре холста tkinter?Я имею в виду, что я сделал приведенный ниже код, который позволяет мне перемещать вид холста и центрировать его на указанной точке (x,y)
, но проблема в том, что когда я изменяю размер холста с помощью <Escape>
, я не знаю, как вернуться свид центрировал эту точку (x,y)
, где я переместился на
from tkinter import *
CURRENT_CANVAS_WIDTH = 500
CURRENT_CANVAS_HEIGHT = 500
CANVAS_WIDTH_SCREEN = 500
CANVAS_HEIGHT_SCREEN = 500
CANVAS_WIDTH = 6000
CANVAS_HEIGHT = 1000
FULL_SCREEN_STATUS = False
def create_point(event):
x1 = event.x
y1 = event.y
x2 = x1 + (CURRENT_CANVAS_WIDTH - CANVAS_WIDTH_SCREEN)
y2 = y1 + (CURRENT_CANVAS_HEIGHT - CANVAS_HEIGHT_SCREEN)
print(x2, y2)
canvas.create_oval(x2, y2, x2 + 3, y2 + 3, fill="red")
def scroll_start(event):
canvas.scan_mark(event.x, event.y)
def scroll_move(event):
canvas.scan_dragto(event.x, event.y, gain=1)
def screen_move_to_coords(x, y):
global CURRENT_CANVAS_WIDTH, CURRENT_CANVAS_HEIGHT
if not FULL_SCREEN_STATUS:
end_x = CURRENT_CANVAS_WIDTH
firs_x = (CURRENT_CANVAS_WIDTH - CANVAS_WIDTH_SCREEN)
half_x_screen = (end_x + firs_x)//2
scrolls_x = x - (half_x_screen)
print(scrolls_x)
canvas.xview_scroll(scrolls_x, UNITS)
end_y = CURRENT_CANVAS_HEIGHT
firs_y = (CURRENT_CANVAS_HEIGHT - CANVAS_HEIGHT_SCREEN)
half_y_screen = (end_y + firs_y)//2
scrolls_y = y - (half_y_screen)
canvas.yview_scroll(scrolls_y, UNITS)
CURRENT_CANVAS_WIDTH += scrolls_x
CURRENT_CANVAS_HEIGHT += scrolls_y
def resize_screen(event):
global FULL_SCREEN_STATUS, CAN_RESIZE, CURRENT_CANVAS_WIDTH, CURRENT_CANVAS_HEIGHT, CANVAS_WIDTH_SCREEN, CANVAS_HEIGHT_SCREEN
if FULL_SCREEN_STATUS:
FULL_SCREEN_STATUS = False
CANVAS_WIDTH_SCREEN = KEEP_CANVAS_WIDTH_SCREEN
CANVAS_HEIGHT_SCREEN = KEEP_CANVAS_HEIGHT_SCREEN
master.geometry('%dx%d+%d+%d' % (CANVAS_WIDTH_SCREEN + 4, CANVAS_HEIGHT_SCREEN + 4, xs, ys))
canvas.config(width=CANVAS_WIDTH_SCREEN, height=CANVAS_HEIGHT_SCREEN)
print(CURRENT_CANVAS_WIDTH, CURRENT_CANVAS_HEIGHT)
elif not FULL_SCREEN_STATUS:
FULL_SCREEN_STATUS = True
master.geometry('%dx%d+%d+%d' % (ws + 10, hs + 4, -10, -33))
canvas.config(width=ws, height=hs)
CURRENT_CANVAS_WIDTH = CURRENT_CANVAS_WIDTH + (ws - CANVAS_WIDTH_SCREEN)
CURRENT_CANVAS_HEIGHT = CURRENT_CANVAS_HEIGHT + (hs - CANVAS_HEIGHT_SCREEN)
CANVAS_WIDTH_SCREEN = ws
CANVAS_HEIGHT_SCREEN = hs
print(CURRENT_CANVAS_WIDTH, CURRENT_CANVAS_HEIGHT)
master = Tk()
ws = master.winfo_screenwidth()
hs = master.winfo_screenheight()
xs = (ws / 2) - (CANVAS_WIDTH_SCREEN / 2)
ys = (hs / 2) - (CANVAS_WIDTH_SCREEN / 2)
master.geometry('%dx%d+%d+%d' % (CANVAS_WIDTH_SCREEN + 4, CANVAS_HEIGHT_SCREEN + 4, xs, ys))
master.title("...")
master.resizable(False, False)
canvas = Canvas(master, width=CANVAS_WIDTH_SCREEN, height=CANVAS_HEIGHT_SCREEN, bg="white")
canvas.configure(scrollregion=(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT), yscrollincrement='1', xscrollincrement='1')
canvas.focus('character')
canvas.grid(row=0)
canvas.bind("<Button-3>", create_point)
canvas.bind("<ButtonPress-1>", scroll_start)
canvas.bind("<B1-Motion>", scroll_move)
canvas.bind("<Button-2>", lambda event, a=500, b=500: screen_move_to_coords(a, b))
master.bind("<Escape>", resize_screen)
master.mainloop()
Я сделал это, но я не знаю, как сделать так, чтобы он всегда находился в центре, когда я изменяю его размер в полноэкранном режиме