Заставьте окно Tkinter изменять размер и динамически настраивать содержимое окна - PullRequest
0 голосов
/ 07 августа 2020

Можно ли настроить содержимое окна tkinter под размер экрана? Например, если бы я создал окно в соответствии с разрешением экрана 1366x768, а затем я запускаю тот же код в системе с разрешением 1024x768 и динамически изменяю размер его содержимого? Я знаю, что могу использовать структуру сетки как , как описано здесь , и соответствующим образом установить вес ячеек. Но возможно ли это с геометрической структурой пакета, а не с сеткой? Я спрашиваю об этом, потому что половина проекта, над которым я работаю, была сделана моим коллегой, и он вообще не использовал сетку. Поэтому вместо того, чтобы переделывать весь код в сетке, я ищу способ обойти это. Вот пример кода, который мне нужно изменить -

def container(self):
    frame_number_panel = tk.Frame(self.parent, width=round(Dimension.SCREEN_WIDTH*0.8), height=Dimension.SCREEN_HEIGHT, bg="#eeeeee")
    frame_number_panel.pack(side="left", anchor=W)
    frame_number_panel.pack_propagate(False)
    self.main_container(frame_number_panel)
    
    # right side pannel
    frame_right_side_panel = tk.Frame(self.parent, bg="#101115", width=round(Dimension.SCREEN_WIDTH*0.2), height=Dimension.SCREEN_HEIGHT)
    frame_right_side_panel.pack(side="right", anchor=NE)
    frame_right_side_panel.pack_propagate(False)
    frame_first_row = tk.Frame(frame_right_side_panel, bg="#101115")
    frame_first_row.pack()

    winning_claim_image = PhotoImage(file=ResourcePath.resource_path('images/icon_win_claim.png'))
    label_winning_claim = tk.Label(frame_first_row, bg="#fcd116", text="WINNING\nCLAIM", image=winning_claim_image,
                                   compound="left", fg="#231f20", font=("Roboto-Bold", 10, "bold"),
                                   width=Dimension.label_winning_claim_width,
                                   height=Dimension.label_winning_claim_height)
    label_winning_claim.image = winning_claim_image
    label_winning_claim.pack(side="left", padx=Dimension.label_winning_claim_padx)

    reprint_image = PhotoImage(file=ResourcePath.resource_path('images/reprint_2.png'))
    label_reprint = tk.Label(frame_first_row, bg="#8ac539", text="REPRINT", image=reprint_image,
                             compound="left", fg="#231f20", font=("Roboto-Bold", 10, "bold"),
                             width=Dimension.label_winning_claim_width, height=Dimension.label_winning_claim_height)
    label_reprint.image = reprint_image
    label_reprint.pack(side="left", padx=Dimension.label_winning_claim_padding)

, как вы можете видеть, все виджеты размещаются с помощью диспетчера геометрии пакетов.

1 Ответ

2 голосов
/ 07 августа 2020

Вы можете получить почти то же самое с pack, чем с grid. На самом деле, я обычно предпочитаю упаковку, так как она дает мне больше свободы.

Например, возьмите следующий пример:

from tkinter import Tk, Label, X, Frame, Y, LEFT, BOTH

root = Tk()

# Initialize frames
f1 = Frame(root, bg="grey")
f2 = Frame(root, bg="pink")

# Initialize labels
w1 = Label(f1, text="Red", bg="red", fg="white")
w2 = Label(f1, text="Green", bg="green", fg="white")
w3 = Label(f1, text="Blue", bg="blue", fg="white")
w1b = Label(f2, text="Red", bg="red", fg="white")
w2b = Label(f2, text="Green", bg="green", fg="white")
w3b = Label(f2, text="Blue", bg="blue", fg="white")

# Packing level 1
f1.pack(fill=X)
f2.pack(fill=BOTH, expand=True)

# Packing level 2
w1.pack(fill=X)
w2.pack(fill=X)
w3.pack(fill=X)
w1b.pack(side=LEFT, fill=BOTH, expand=True)
w2b.pack(side=LEFT, fill=BOTH, expand=True)
w3b.pack(side=LEFT, fill=BOTH, expand=True)

root.mainloop()

enter image description here

As you can see, by using the parameters fill and expand in the correct way, I have set the second frame to be expandable with the windows on both sides (X and Y), while the first frame is only expandable in X. All the labels inside the frames are also equally distributed.

See all the options of pack in the documentation: https://effbot.org/tkinterbook/pack.htm .

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