【问题标题】:Python Tkinter: Attach scrollbar to listbox as opposed to windowPython Tkinter:将滚动条附加到列表框而不是窗口
【发布时间】:2026-01-04 08:00:01
【问题描述】:

这是我目前窗口的截图:

我的问题是我根本无法让滚动条出现在列表框的右侧而不是主窗口的右侧。代码在这里:

from Tkinter import *

def onselect(event):
    w = event.widget
    index = int(w.curselection()[0])
    value = w.get(index)
    info = find_info(value)
    listSelection.delete(0, END)
    listSelection.insert(END, "Node ID: " + info[0])
    listSelection.insert(END, "Owner/Description: " + info[1])
    listSelection.insert(END, "Last Latitude: " + info[2])
    listSelection.insert(END, "Last Longitude: " + info[3])



mapNodes = "http://ukhas.net/api/mapNodes"
nodeData = "http://ukhas.net/api/nodeData"
current_id = 0

window = Tk() # create window
window.configure(bg='lightgrey')
window.title("UKHASnet Node Manager")
window.geometry("680x400")

lbl1 = Label(window, text="Node List:", fg='black', font=("Helvetica", 16, "bold"))
lbl2 = Label(window, text="Node Information:", fg='black', font=("Helvetica", 16,"bold"))
lbl1.place(x=0, y=0)
lbl2.place(x=200, y=0)

scrollbar = Scrollbar(window, orient="vertical")
listNodes = Listbox(window, width=20, height=20, yscrollcommand=scrollbar.set, font=("Helvetica", 12))
scrollbar.config(command=listNodes.yview)
scrollbar.pack(side="right", fill="y")

listSelection = Listbox(window, width=50, height=4, font=("Helvetica", 12))

# pack objects onto window
listNodes.place(x=1, y=40)
listSelection.place(x=200, y=40)

感谢任何帮助,我正在运行 Ubuntu 14.04 和 Python 2.7.5

马特

【问题讨论】:

    标签: python linux listbox tkinter scrollbar


    【解决方案1】:

    您已将滚动条附加到 window

    Scrollbar(window, orient="vertical")
    

    尝试附加到listNodes

    Scrollbar(listNodes, orient="vertical")
    

    或使用Listbox 创建Frame 并将滚动条附加到该框架。


    编辑:Frame的示例

    from Tkinter import *
    
    window = Tk()
    window.geometry("680x500")
    
    Label(window, text="Top label").pack()
    
    frame = Frame(window)
    frame.pack()
    
    listNodes = Listbox(frame, width=20, height=20, font=("Helvetica", 12))
    listNodes.pack(side="left", fill="y")
    
    scrollbar = Scrollbar(frame, orient="vertical")
    scrollbar.config(command=listNodes.yview)
    scrollbar.pack(side="right", fill="y")
    
    listNodes.config(yscrollcommand=scrollbar.set)
    
    for x in range(100):
        listNodes.insert(END, str(x))
    
    Label(window, text="Bottom label").pack()
    
    window.mainloop()
    


    编辑: 代码中的框架 - 我使用 grid/pack,因为我更喜欢它。

    我添加了一些代码,所以现在在窗口调整大小时列出调整大小。

    from Tkinter import *
    
    def onselect(event):
        w = event.widget
        index = int(w.curselection()[0])
        value = w.get(index)
        info = find_info(value)
        listSelection.delete(0, END)
        listSelection.insert(END, "Node ID: " + info[0])
        listSelection.insert(END, "Owner/Description: " + info[1])
        listSelection.insert(END, "Last Latitude: " + info[2])
        listSelection.insert(END, "Last Longitude: " + info[3])
    
    
    
    mapNodes = "http://ukhas.net/api/mapNodes"
    nodeData = "http://ukhas.net/api/nodeData"
    current_id = 0
    
    window = Tk() # create window
    window.configure(bg='lightgrey')
    window.title("UKHASnet Node Manager")
    window.geometry("680x400")
    
    lbl1 = Label(window, text="Node List:", fg='black', font=("Helvetica", 16, "bold"))
    lbl2 = Label(window, text="Node Information:", fg='black', font=("Helvetica", 16,"bold"))
    lbl1.grid(row=0, column=0, sticky=W)
    lbl2.grid(row=0, column=1, sticky=W)
    
    frm = Frame(window)
    frm.grid(row=1, column=0, sticky=N+S)
    window.rowconfigure(1, weight=1)
    window.columnconfigure(1, weight=1)
    
    scrollbar = Scrollbar(frm, orient="vertical")
    scrollbar.pack(side=RIGHT, fill=Y)
    
    listNodes = Listbox(frm, width=20, yscrollcommand=scrollbar.set, font=("Helvetica", 12))
    listNodes.pack(expand=True, fill=Y)
    
    scrollbar.config(command=listNodes.yview)
    
    listSelection = Listbox(window, height=4, font=("Helvetica", 12))
    listSelection.grid(row=1, column=1, sticky=E+W+N)
    
    
    for x in range(100):
        listNodes.insert(END, x)
    
    for x in "ABCD":
    listSelection.insert(END, x + ": ?")
    

    【讨论】:

    • 非常感谢,是的,这是有道理的。这只是找到正确方法的问题。
    • 只有一个问题,如果我想保持原来的布局,即在列表框的原始位置有你定义的新框架,有没有简单的方法来做到这一点?
    • 请注意,如果您使用列表框作为滚动条的父级,滚动条将位于出现在右边距的任何文本之上。如果您的列表框足够宽以始终包含空格,则不会有问题,但是如果您有填充该行的文本,则最后一个或两个字符将位于滚动条下方。如果你使用额外的框架,你不会有这个问题。
    • @user3046180 查看新示例 - 您的代码带有框架和网格/包。
    【解决方案2】:

    由于您使用的是place(我推荐),所以只需做一些数学运算来计算滚动条的位置。

    在这种特定情况下,更好的选择是使用grid,因为您显然希望将事物组织成行和列。标题位于第 0 行,列表框/滚动条组合位于第 1 行。第一个标题位于第 0 列和第 1 列,列表框位于第 0 列,滚动条位于第 1 列。第二个标题位于第 2 列,而另一个列表框进入第 3 列。

    【讨论】:

      最近更新 更多