Как разместить объект холста в нижней части окна? - PullRequest
0 голосов
/ 02 мая 2019

Итак, я хочу поместить прямоугольник внизу моего окна.Как мне найти правильную координату Y?Мое окно включено в полноэкранном режиме, поэтому координата y не всегда одинакова.

Поскольку я не очень разбираюсь в использовании математического Python и иногда я нахожу для себя странные решения своих проблем, япробовал использовать целые числа.Конечно, я погуглил мою проблему, но не смог найти рабочее решение.

from tkinter import *
def run(): #I define it, so I can import it and use it in other files.
    w=Tk()
    w.state('zoomed')
    w.title('A title')
    bg=Canvas(w,bg='#808080',borderwidth=0,highlightthickness=0)
    bg.pack(fill='both',expand=True)

    ywindow=w.winfo_screenheight()
    yfooter=ywindow-30
    footer=Canvas(w,bg='#A5A5A5',borderwidth=2,highlightthickness=0)
    footer.place(height=30,width=w.winfo_screenwidth(),x=0,y=yfooter)

run()

Я ожидаю, что tkinter использует координату в 30 пикселей от границы как y, но она не показывает Canvasна все.

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Это потому, что нижний колонтитул находится за пределами области просмотра корневого окна.Если вы сделаете корневое окно полноэкранным (используя w.wm_attributes('-fullscreen', 1) вместо w.state('zoomed'), нижний колонтитул будет показан внизу корневого окна. Но он работает только в полноэкранном режиме.

Вы можете просто использовать footer.pack(fill=X) вместо footer.place(...), например:

bg = Canvas(w, bg='#808080', bd=0, highlightthickness=0)
bg.pack(fill=BOTH, expand=True)

footer = Canvas(w, bg='#A5A5A5', bd=2, highlightthickness=0, height=30)
footer.pack(fill=X)

Однако этот подход не работает, если корневое окно изменено в маленькое окно.

Вы можете использовать grid() для преодоленияэто:

w.rowconfigure(0, weight=1) # allow header expand vertically
w.columnconfigure(0, weight=1) # allow both header and footer expand horizontally

bg = Canvas(w, bg='#808080', bd=0, highlightthickness=0)
bg.grid(sticky='nsew')

footer = Canvas(w, bg='#A5A5A5', bd=2, highlightthickness=0, height=30)
footer.grid(sticky='ew')
0 голосов
/ 03 мая 2019

Хотя я не уверен, что понимаю ваши цели, но предложить кому-то прочитать документацию tkinter , как это сделал @Bryan Oakley в комментарии, является своего рода жестокой шуткой IMO, документы модулятак плохо ...

Во всяком случае, вот предположение, которое показывает, как сделать то, что, я думаю, вы можете захотеть:

from tkinter import *

def run():
    win = Tk()
    win.state('zoomed')
    win.title('A title')

    FH = 30  # Footer height
    header_width = win.winfo_screenwidth()
    footer_width = win.winfo_screenwidth()

    footer_height = FH
    header_height = win.winfo_screenheight() - FH

    split = header_height / win.winfo_screenheight() # How much header occupies.

    header = Canvas(win, bg='#808080', borderwidth=0, highlightthickness=0,
                    width=header_width, height=header_height)
    header.place(rely=0, relheight=split, relwidth=1, anchor=N,
                 width=header_width, height=header_height)

    footer = Canvas(win, bg='#A5A5A5', borderwidth=2, highlightthickness=0,
                    width=footer_width, height=footer_height)

    footer.place(rely=split, relheight=1.0-split, relwidth=1, anchor=N,
                 width=footer_width, height=footer_height)

    if __name__ == '__main__':
        win.mainloop()

run()

Как это работает:

screenshot of display

...