Холст не заполняет доступное пространство ткинтер - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь создать программу обмена сообщениями, используя tkinter в качестве интерфейса gui. Слева от gui есть холст с цифрами 1 - 100. Существует также полоса прокрутки на стороне холста, чтобы прокрутить эти цифры.

Проблема в том, что холст не заполняет все доступное пространство и по какой-то причине ограничивается маленькой рамкой.

Код:

from tkinter import *
# *** Scrollable Frame Class ***

class VerticalScrolledFrame(Frame):

    def __init__(self, parent, *args, **kw):
        Frame.__init__(self, parent, *args, **kw)

        vscrollbar = Scrollbar(self, orient=VERTICAL)
        vscrollbar.pack(fill=Y, side=LEFT, expand=FALSE)
        canvas = Canvas(self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set, bg="black")
        canvas.pack(side=LEFT, fill=BOTH, expand=TRUE)
        vscrollbar.config(command=canvas.yview)

        canvas.xview_moveto(0)
        canvas.yview_moveto(0)

        self.interior = interior = Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior,
                                           anchor=NW)
        def _on_mousewheel(event):
            canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
            self.interior.bind_all("<MouseWheel>", _on_mousewheel)
            canvas.bind_all("<MouseWheel>", _on_mousewheel)

        def _configure_interior(event):
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.config(width=interior.winfo_reqwidth())
        interior.bind('<Configure>', _configure_interior)

        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

        # *** Create Window ***
root = Tk()
root.geometry("800x545")
root.config(bg="#23272A")
#root.resizable(False, False)
root.title("Secure Message")

# *** Set Friends Frame ***
friends_frame = VerticalScrolledFrame(root)
friends_frame.pack(side=LEFT)

for i in range(100):
    friend_frames = []
    friend_frame = Frame(friends_frame.interior, width=100)
    friend_frames.append(friend_frame)
    friend_frames[-1].pack()
    text = Label(friend_frame, text=i)
    text.pack(side=LEFT)

chatSpace_frame = Frame(root)
chatSpace_frame.pack(side=RIGHT)

# *** GUI ***
chatSpace = Listbox(chatSpace_frame, bg="#2C2F33", fg="white", width = 65, height=29)
chatSpace.grid(row=0, column=1, sticky=E, padx=10)

user_input = Entry(chatSpace_frame, highlightbackground="#2C2F33", bg="grey", width = 64, fg="white")
user_input.grid(row=1, column=1, sticky=E, pady=10, padx=9)

user_input.focus()

root.mainloop()

Извините, если это немного сложно понять. Любая помощь будет принята с благодарностью!

Снимки экрана

Broken Gui

Этот холст с номерами слева нуждается заполнить все пустое серое пространство рядом с пространством чата.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Проблема в том, что friends_frame не настроен на заполнение X и Y, а для раскрытия необходимо установить значение true.

Пример

# *** Set frame for friends view ***
friends_frame = VerticalScrolledFrame(root, bg="#23272A")
friends_frame.pack(side=LEFT, fill=BOTH, expand=TRUE)
0 голосов
/ 07 февраля 2020

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

Это строка с проблемой :

friends_frame.pack(side=LEFT)

У вас нет расширения friends_frame, поэтому холст внутри него не может расширяться. Вам необходимо установить параметры expand и / или fill на кадре.

...