Python Tkinter: 将滚动条附加到列表框而不是窗口

14

这是我当前窗口的屏幕截图:

screenshot

我的问题是我无法使滚动条出现在列表框的右侧而不是主窗口的右侧。以下是代码:

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。 Matt
2个回答

23

您将滚动条附加到了 window

Scrollbar(window, orient="vertical")
尝试将代码中的listNodes附加到中。

尝试将listNodes附加到中

Scrollbar(listNodes, orient="vertical")

或者创建一个带有 ListboxFrame,并将滚动条附加到该框架。


编辑: 带有 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 + ": ?")

输入图像描述


只有一个问题,Furas,如果我想保持原始布局,即在列表框的原始位置上拥有您定义的新框架,是否有简单的方法可以实现这一点? - user3046180
请注意,如果您将listbox用作滚动条的父级,则滚动条将位于出现在右边距的任何文本之上。如果您的listbox足够宽以始终具有空格,则不会出现问题,但是如果您有填充行的文本,则最后一个或两个字符将位于滚动条下方。如果您使用额外的框架,则不会出现此问题。 - Bryan Oakley
@user3046180 看看新的例子 - 带有框架和网格/包装的代码。 - furas

2

由于您正在使用place(我不建议),因此只需进行一些数学计算即可计算出滚动条的位置。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接