Tkinter: объединение полосы прокрутки с холстом - PullRequest
0 голосов
/ 02 марта 2019

Я знаю, что это не первый раз, когда задают такой вопрос, но даже после примерно 2 часов работы в Интернете я не могу заставить его работать:

Так что я пытаюсьсоздайте Tkinter-Frame, который содержит несколько кнопок (в качестве примера я взял 30).Но поскольку у меня недостаточно места в моей программе, мне нужно добавить рядом с ней полосу прокрутки, чтобы можно было прокручивать кнопки.

Проблемы, которые у меня были, это внутренняя "движущаяся часть"панели была такой же большой, как и вся полоса прокрутки, и ее нельзя было перемещать, что я вроде решил с помощью scollregion=(0,0,1000,1000), но даже тогда перемещение панели никак не влияло на холст.

Вот соответствующий код, который я извлек из моей программы:

import Tkinter as tk

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=50)
root.columnconfigure(1, weight=1)

root.minsize(300,400)
root.maxsize(300,400)

#Buttons
buttonFrame = tk.Canvas(root, bg='#bbb')
buttonFrame.grid(row=0, column=0, sticky=tk.N+tk.E+tk.S+tk.W)
buttonFrame.columnconfigure(0, weight=1)

scroll = tk.Scrollbar(root, command=buttonFrame.yview)
scroll.grid(row=0, column=1, sticky=tk.N+tk.E+tk.S+tk.W)
buttonFrame.configure(yscrollcommand=scroll.set)

for i in range(30):
    tk.Button(buttonFrame, text=str(i+1)).grid(row=i, column=0, sticky=tk.N+tk.E+tk.S+tk.W)

root.mainloop()

Как вы (надеюсь) видите, слайдер даже не может быть перемещен и ничего не меняет на холсте, даже если я нажимаюa scrollregion=(bla) где-то там.

2 Вопросы: a.) Что мне нужно добавить (или удалить), чтобы я мог прокрутить список кнопок b.) Исправлено ли из a.все еще работает, когда я делаю полосу прокрутки дочерним элементом buttonFrame вместо root?

1 Ответ

0 голосов
/ 02 марта 2019

Чтобы добавить виджеты в Canvas, вы должны использовать метод create_window, а не grid().Затем вы должны обновить холст перед настройкой области прокрутки.

for i in range(30):
    btn = tk.Button(buttonFrame, text=str(i+1))
    buttonFrame.create_window((100,i*50), window=btn)
root.update()
buttonFrame.config(scrollregion=buttonFrame.bbox("all"))

Если вы попробуете, я подозреваю, это не то, что вы искали, поскольку метод create_window требует абсолютного позиционирования (вы не можете использовать grid или pack).Вот почему большинство людей помещают рамку в холст и вместо этого добавляют свои виджеты.Многие люди абстрагировали этот фальшивый фрейм, который на самом деле является фреймом холста в другом фрейме, включая меня .

...