如何防止小部件进入Tkinter的Window之外?

时间:2019-05-15 09:42:55

标签: python user-interface tkinter

我正在做任务,一遍又一遍地遇到一个问题。我的小部件(大多数是按钮)无法离开窗口,而是离开了窗口。例如,我在任务中需要使用箭头键在窗口上移动按钮。我的按钮不应该离开窗口,而是可以。我如何防止它这样做?

我试图这样设置像素边界:

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 个答案:

答案 0 :(得分:1)

您可以使用winfo_widthwinfo_height方法来获取窗口的当前高度/宽度。拥有这些属性后,您可以使用这些值bind窗口内的移动小部件。

我还使用了这些方法来使窗口小部件在打开时位于屏幕中央,而不是您曾经使用的relyrelx

请注意,对于每个按钮按下方法,我正在执行检查以查看窗口小部件是否仍在窗口内,并且> 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()