Как я могу запретить виджетам выходить за пределы Window в Tkinter? - PullRequest
0 голосов
/ 15 мая 2019

Я выполняю задачи, и у меня снова и снова возникает одна проблема. Мои виджеты (в основном кнопки) не могут покинуть окно, и они уходят. Для примера у меня есть задача, где мне нужно переместить кнопку над окном с помощью клавиш со стрелками. Моя кнопка не должна выходить из окна, но она появляется. Как я могу этому помешать?

Я попытался установить границу пикселя следующим образом:

x = int(button.place_info()['x'])
    if x < 236:
        if event:
            button.place(x=x + 5)

Но когда вы увеличиваете окно (увеличивая его), оно не достигает края, а должно.

import tkinter as tk


def exit(event):
    if event:
        window.destroy()


def up(event):
    y = int(button.place_info()['y'])
    if event:
        button.place(y=y - 1)


def down(event):
    y = int(button.place_info()['y'])
    if event:
        button.place(y=y + 1)


def left(event):
    x = int(button.place_info()['x'])
    if event:
        button.place(x=x - 1)
        print(x)


def right(event):
    x = int(button.place_info()['x'])
    if x < 236:
        if event:
            button.place(x=x + 1)




window = tk.Tk()
window.geometry("500x500")
button = tk.Button(master=window, bitmap="questhead")
button.place(relx=0.5, rely=0.5, anchor="center", )
button.focus_set()
button.bind("<Up>", up)
button.bind("<Down>", down)
button.bind("<Left>", left)
button.bind("<Right>", right)


window.bind("<Escape>", exit)

window.mainloop()

Есть ли какая-либо функция по умолчанию или что-то, что я могу использовать, чтобы окно имело границы, которые виджет не может пересекать и просто исчезает.

1 Ответ

1 голос
/ 15 мая 2019

Вы можете использовать методы winfo_width и winfo_height, чтобы получить текущую высоту / ширину окна. Если у вас есть эти значения, вы можете использовать эти значения для bind перемещения виджета внутри окна.

Я также использовал эти методы для центрирования виджета на экране при его открытии, а не rely и relx, которые вы использовали.

Обратите внимание, что для каждого метода нажатия кнопки я выполняю проверку, чтобы увидеть, находится ли виджет внутри окна с> 0 или

import tkinter as tk


def exit(event):
    if event:
        window.destroy()


def up(event):
    y = int(button.place_info()['y'])
    if y > 0:
        if event:
            button.place(y=y - 5)


def down(event):
    widget_h = event.widget.master.winfo_height()
    y = int(button.place_info()['y'])
    if y < widget_h:
        if event:
            button.place(y=y + 5)


def left(event):
    x = int(button.place_info()['x'])
    if x > 0:
        if event:
            button.place(x=x - 5)
            print(x)


def right(event):
    widget_w = event.widget.master.winfo_width()
    x = int(button.place_info()['x'])
    if x < widget_w:
        if event:
            button.place(x=x + 5)




window = tk.Tk()
window.geometry("500x500")
window.update()
x_mid = window.winfo_width()//2
y_mid = window.winfo_height()//2
print(x_mid,y_mid)
button = tk.Button(master=window, bitmap="questhead")
button.place(x=x_mid, y=y_mid, anchor="center", )
button.focus_set()
button.bind("<Up>", up)
button.bind("<Down>", down)
button.bind("<Left>", left)
button.bind("<Right>", right)


window.bind("<Escape>", exit)

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