Как заставить полосу прокрутки работать внутри холста, заполненного текстом, размер которого превышает размеры холста - PullRequest
0 голосов
/ 04 августа 2020

Итак, у меня есть небольшая программа, которую я пишу. Я сделаю все возможное, чтобы включить только соответствующие фрагменты кода. Идея состоит в том, что в родительском фрейме есть три фрейма. На левой стороне есть список с полосой прокрутки, с которой я работаю точно так, как задумано. В средней рамке есть холст, заполненный текстом / информацией, который диктуется щелчком по элементу в списке слева, а также отображает фотографию справа. Дело в том, что информация в середине обычно намного превышает размер центральной рамки, поэтому мне нужна полоса прокрутки. Я попытался просто изменить свою работающую полосу прокрутки из списка, но безрезультатно, а также примеры других людей с этого веб-сайта и других, но все равно безрезультатно. Приветствуется любое понимание того, почему моя полоса прокрутки холста не работает.

Код, который я предоставил, не будет работать, но включение всего соответствующего кода для его запуска сделало бы код очень длинным, и я У меня сложилось впечатление, что нам не нравится просеивать здесь сверхдлинные фрагменты кода, и что любой, кто хоть немного знает tkinter, должен увидеть здесь вопиющую проблему, не пытаясь запустить код. Пожалуйста, поправьте меня, если я ошибаюсь. Я все еще новичок в использовании SO, и я хочу делать все правильно, при этом не расстраивая потенциальных [временных] наставников.

Как выглядит программа - обратите внимание на мертвую полосу прокрутки в центре

from tkinter import *
root = Tk()
root.configure(bg="gray50")
root.geometry("1650x800")

# *** Function related to info_canvas scrollbar ***
def on_configure(event):  #commenting out "event" changes nothing...why?
    # update scrollregion after starting 'mainloop'
    # when all widgets are in canvas
    info_canvas.configure(scrollregion=info_canvas.bbox('all'))  #doesn't seem to do anything...

# *** Create all Frames/Containers/Canvas ***
mainWindowFrame = Frame(root, bg="gray63", width=1200, height=650)
mainWindowLeftFrame = Frame(mainWindowFrame, bg="gray63", width=400, height=650, padx=10)
mainWindowCenterFrame = Frame(mainWindowFrame, bg="gray63", width=700, height=650)
mainWindowRightFrame = Frame(mainWindowFrame, bg="gray63", width=400, height=650)
info_canvas = Canvas(mainWindowCenterFrame, bg="gray63", bd=0, highlightthickness=0)

# *** Place Canvas ***
info_canvas.grid(row=0, column=0, sticky=NSEW)
info_canvas.create_window((0,0), window=mainWindowCenterFrame, anchor='nw')  #commenting this out changes nothing

# *** Layout parameters of the main containers ***
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(0, weight=1)

mainWindowLeftFrame.grid_rowconfigure(1, weight=1)
mainWindowLeftFrame.grid_columnconfigure(0, weight=1)

mainWindowCenterFrame.grid_rowconfigure(1, weight=1)
mainWindowCenterFrame.grid_columnconfigure(0, weight=1)

mainWindowRightFrame.grid_rowconfigure(1, weight=1)
mainWindowRightFrame.grid_columnconfigure(0, weight=1)


# *** Create & Place Scrollbars ***  <---this one works
rocket_scrollbar = Scrollbar(mainWindowLeftFrame, orient=VERTICAL)
lb.configure(yscrollcommand=rocket_scrollbar.set)
lb.grid(row=2, column=0, sticky=N+E+S+W)
lb.columnconfigure(0, weight=1)
rocket_scrollbar.configure(command=lb.yview)
rocket_scrollbar.grid(row=2, column=1, rowspan=40, sticky=N+S+W)

info_scrollbar = Scrollbar(mainWindowCenterFrame, command=info_canvas.yview, orient=VERTICAL)  # <-- this one doesn't
info_scrollbar.grid(row=0, column=1, rowspan=60, sticky=N+S)  
info_canvas.configure(yscrollcommand = info_scrollbar.set)
info_canvas.columnconfigure(0, weight=1)

# *** Bind List Box ***
lb.bind('<<ListboxSelect>>', onselect)

# *** Bind Canvas ***
info_canvas.bind('<Configure>', on_configure) #commenting this out changes nothing...do I need it?

# *** Create all buttons/Labels ***  The labels below are what populate the canvas with text
rocketName = Label(info_canvas, font="-weight bold", bg="gray63", fg="white", pady=0)
rocketName.config(font=("Arial", 20))

infoLabel = Label(info_canvas, bg="gray63", fg="white")
infoLabel.config(font=("Arial", 11))

# *** Placement & Layout of all Buttons ***
rocketName.grid(row=0, column=0)
infoLabel.grid(row=1, column=0, padx=25)
imgLabel = Label(mainWindowRightFrame, bg="gray63", border=0)

root.mainloop()
...