Обучение Python. Возникли проблемы с менеджером виджетов tkinter.Grid и добавлением полосы прокрутки в виджет списка - PullRequest
0 голосов
/ 17 февраля 2020

Я получил большую часть этого кода из другого вопроса. Я использую Python 3.8. Казалось бы, менеджер пакетов легко добавит виджет полосы прокрутки к виджету списка. Тем не менее, я использую Grid Manager. Я не могу заставить вертикальную полосу прокрутки работать должным образом.

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

from tkinter import *

master = Tk()

listbox = Listbox(master)

scrollbar = Scrollbar(master, orient=VERTICAL)
scrollbar.grid(row=2, rowspan=50, column=40, sticky=N + S)

for i in range(50):
    listbox.insert(END, str(i))
listbox.grid(sticky="news")

scrollbar.config(command=listbox.yview)

mainloop()

enter image description here

Ответы [ 2 ]

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

Если вы думаете, pack() проще, то вы можете pack Listbox и Scrollbar внутри Frame и затем использовать grid() в кадре:

import tkinter as tk

master = tk.Tk()

frame = tk.Frame(master)
frame.grid(row=0, column=0) # set row and column to the desired position

listbox = tk.Listbox(frame)
listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL, command=listbox.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

listbox.config(yscrollcommand=scrollbar.set)
for i in range(50):
    listbox.insert(tk.END, str(i))

master.mainloop()
0 голосов
/ 17 февраля 2020

Вы должны использовать row= и column= для обоих элементов - чтобы поместить в одну строку и разные столбцы.

Вы забыли tk.Listbox(..., yscrollcommand=scrollbar.set)

Вам не нужно используйте rowspan=50 для Scrollbar - Listbox используется только одна строка, даже если вы вставляете 50 строк текста.

import tkinter as tk # `import *` is not preferred (see PEP8)

master = tk.Tk()

scrollbar = tk.Scrollbar(master, orient='vertical')
scrollbar.grid(row=2, column=1, sticky='ns')

listbox = tk.Listbox(master, yscrollcommand=scrollbar.set)
for i in range(50):
    listbox.insert('end', str(i))
listbox.grid(row=2, column=0, sticky="news")

scrollbar.config(command=listbox.yview)

master.mainloop()

PEP 8 - Руководство по стилю для Python Код

...