Почему (Python) объекты tkinter Canvas и Frame расширяются до бесконечности, делая Scrollbar бесполезным? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь заставить кадр и холст tkinter перестать расширяться до бесконечности и быть прокручиваемым. Они оба выходят за пределы длины корневого виджета, хотя я вручную установил оба их значения высоты намного меньше, чем размер экрана. Блок полосы прокрутки всегда занимает всю область полосы прокрутки, что делает его бесполезным. Можете ли вы сказать, что я делаю здесь не так?

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

Вот минимальный воспроизводимый пример:

import tkinter as tk

global rownum
rownum = 1

def sub_frame(root, f):
    global rownum
    f2 = tk.Frame(f)
    f2.grid(row=rownum+1, sticky='nw')
    tk.Label(f2, text='sub-frame'+str(rownum)).grid()
    print('Label', rownum, 'created')
    rownum += 1
    root.update()

root = tk.Tk()
root_width = str(int(root.winfo_screenwidth()))
root_height = str(int(root.winfo_screenheight()))
root.geometry(root_width + 'x' + root_height)
c = tk.Canvas(root, height=500)
f = tk.Frame(c, height=500)
b = tk.Button(f, command=(lambda x=sub_frame: x(root, f)), text='subframe')
c.create_window(0, 0, window=f, anchor='nw')
s = tk.Scrollbar(c, orient='vertical', command=c.yview)
c.grid(row=1, column=1)
f.grid(row=1, column=1)
b.grid(row=1)
s.grid(row=1, column=2, sticky='ns')
root.update()
c.config(scrollregion=c.bbox('all'), yscrollcommand=s.set)

root.mainloop()

Here is an image of how the problem appears on my machine

Сообщения об ошибках не появляются. Я хочу, чтобы холст перестал расширяться от нижней части экрана и чтобы полоса прокрутки была полезной, а не просто расширялась прямо вместе с холстом.

...