переместить холст, вид tkinter и отцентрировать его в определенной точке - PullRequest
0 голосов
/ 28 февраля 2019

Как сохранить виджет всегда в центре холста 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()

Я сделал это, но я не знаю, как сделать так, чтобы он всегда находился в центре, когда я изменяю его размер в полноэкранном режиме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...