我对tkinter python gui元素有一个小问题

时间:2015-06-06 05:13:09

标签: python user-interface tkinter scrollbar

我正在尝试在列表框旁边放置一个滚动条。注意:我正在使用place()方法,因为某些原因我必须坚持使用它。我知道如何用grid()和pack()来做。但是我无法用place()实现同样的目标。

here is the part of my code:


data = Listbox(root, width=33, height=15,bg='grey',fg='black')
data.place(x=381,y=158)
# create a vertical scrollbar to the right of the data
yscroll = Scrollbar(command=data.yview, orient=VERTICAL)
#......this is causing trouble...........
yscroll.place(x=580,y=158)
#..........................................
data.configure(yscrollcommand=yscroll.set)
#data.bind('<<ListboxSelect>>',openDoc)

#test function for  listbox
def populate():
    for i in range(1,50):
        data.insert('end','number is: '+str(i))

我需要进行哪些修改以便滚动条扩展?

2 个答案:

答案 0 :(得分:2)

使用gridpack几乎总会产生一个更容易维护的GUI,并且在面对变化时更具弹性(不同的字体,不同的分辨率,调整大小的窗口)。最简单的解决方案是使用框架,将右侧的滚动条和左侧的列表框打包,然后您可以将整个框架+列表框+滚动条视为GUI其余部分中的单个窗口小部件。这是一种非常常见的技术。

但是,如果您坚持使用place并且仅使用place,并希望它在列表框旁边,则最佳选择是使用相对和绝对定位的组合。

通过相对定位,您可以告诉“把它放在这个其他小部件旁边”,而不必担心自己的确切坐标。您还可以告诉地点使窗口小部件与其他窗口小部件一样高(或宽),或者恰好是另一个窗口小部件的一小部分。在您的情况下,您希望滚动条与列表框完全一样高。

以下是一个完整的工作示例,它基于您的代码构建:

from Tkinter import *
root = Tk()
root.geometry("800x800")
data = Listbox(root, width=33, height=15,bg='grey',fg='black')
data.place(x=381,y=158)
# create a vertical scrollbar to the right of the data
yscroll = Scrollbar(command=data.yview, orient=VERTICAL)

yscroll.place(relx=1.0, y=0.0, relheight=1.0, 
              bordermode="outside", in_=data)

data.configure(yscrollcommand=yscroll.set)
#data.bind('<<ListboxSelect>>',openDoc)

#test function for  listbox
def populate():
    for i in range(1,50):
        data.insert('end','number is: '+str(i))
populate()

root.mainloop()

答案 1 :(得分:0)

首先,平滑处理调整大小是几何管理器 pack grid 的主要目标之一。建议不要在同一容器中混合使用 pack grid ,但其中一个可以在 place 中工作,并且通常混合不同的几何管理器通过中间框架实现。对于您的确切示例:使用place在根目录中创建Listbox,然后在此框架中,使用包或网格创建Scrollbarheight

如果坚持使用 place place会接受一个可选的参数名称height,强制小部件达到给定的高度。至于要提供的值,您可以等待显示列表框以访问其像素高度(Listbox构造函数中提供的<Configure>在行中)。每次更改窗口小部件显示参数时都会引发def updateYScrollPosition(*event): yscroll.place( x=data.winfo_x() + data.winfo_width(), y=data.winfo_y(), height=data.winfo_height()) data.bind("<Configure>", updateYScrollPosition) 事件,等等也会在第一次绘图时引发。

$sudo port install opencv
$export PYTHONPATH=/Users/swiftguy/anaconda/lib/python2.7/site-packages:$PYTHONPATH