Я пытаюсь заставить ScrollBar применяться только к левому кадру. Когда я использую настройку Canvas, ScrollBar применяется ко всему окну.

Есть ли лучший способ настроить таблицу длинных списков по выбору? Должен ли я использовать список вместо этого?

import tkinter as tk

root = tk.Tk()
root.geometry("1000x600")
# root.resizable(width=False, height=False)

def printname(event, i):
    print ("my name is", i)
    namelabel.configure(text="test" + str(i))

def onFrameConfigure(canvas):
    '''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))


canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
leftFrame = tk.Frame(canvas, background="#ffffff", width=700, height=500)

vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="left", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((1,1), window=leftFrame, anchor="ne")

rightFrame = tk.Frame(root, background="#ffffff", width=300)
# vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
# canvas.configure(yscrollcommand=vsb.set)
# vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((1,2), window=rightFrame, anchor="nw")

# rightFrame = tk.Frame(root, width=400)
# rightFrame.pack()

leftFrame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))

textlabel = tk.Label(leftFrame, text="Player List")
textlabel.grid(row=0)
for i in range(50):
    if (i % 2):
        w = tk.Text(leftFrame, height=1, fg="white", bg="black")
    else:
        w = tk.Text(leftFrame, height=1, fg="black", bg="white")
    w.insert(1.0, "test" + str(i))
    w.configure(relief="flat")
    w.configure(state="disabled")
    w.bind("<Button-1>", lambda event, a=i: printname(event, a))
    w.grid(row=7+i)

namelabel = tk.Label(rightFrame, text="Test", fg="white", bg="black")
namelabel.grid(row=1)

root.mainloop()

0
Ash Belur 21 Ноя 2019 в 17:04
С кодом Listbox было бы проще и короче.
 – 
furas
21 Ноя 2019 в 17:07
1
Если вы хотите прокрутить только leftFrame, не помещайте rightFrame на Canvas. Scrollbar прокручивает Canvas - если у вас есть rightFrame (и любые другие элементы) на холсте, он также прокручивает его.
 – 
furas
21 Ноя 2019 в 17:09

1 ответ

Короткий ответ: если вы не хотите что-то прокручивать, не помещайте это в канву. Прокрутка холста означает, что каждый элемент, добавленный на холст, будет прокручиваться. Нет способа избежать этого. Вы не можете прокрутить половину виджета.

Есть ли лучший способ настроить таблицу длинных списков по выбору?

Возможно, хотя это зависит от данных, которые вы хотите показать. Если это список коротких строк, то Listbox, вероятно, является лучшим выбором. Если это блоки текста, один текстовый виджет с некоторыми тегами и пользовательскими привязками может быть лучше, чем несколько виджетов.

0
Bryan Oakley 22 Ноя 2019 в 00:00