python – 如何在滚动时将小部件保持在视图中?

我正在使用Tix在内容更改时自动创建滚动条.我想在用户视图中滚动浏览应用程序的内容时保留一两个按钮.

我还没有看到Tkinter / Tix的这个问题,所以我想我会问.

下面的代码将创建一个问题示例,其中按钮位于窗口中的固定点,并且可以滚动.

from Tkinter import *
import Tix
class some_GUI:
    def __init__(self, root):
        sw= Tix.ScrolledWindow(root, scrollbar=Tix.AUTO)
        sw.pack(fill=Tix.BOTH, expand=1)
        frame1 = Frame(sw.window) 
        frame1.grid(row = 0, column = 1)
        frame2 = Frame(sw.window) 
        frame2.grid(row = 0, column = 2)
        def quit():
            root.quit()
        for i in range(0,300):
            label1 = Label(frame1, text = "foo")
            label1.grid(row = i, column = 0)
        button = Button(frame2, text  = "Quit", command = quit)
        button.pack()

root = Tix.Tk()
display = some_GUI(root)
root.mainloop()

我希望按钮位于“frame2”中并相对于应用程序窗口垂直居中.我尝试使用winfo_height / winfo_width来查找框架的高度/宽度以使用更新,但这些值并没有随着标签和按钮的添加而改变.

尝试/可能的解决方案:

>我通过执行以下操作将frame2放在sw.subwidgets_all [1]中:

frame1.pack(side = LEFT)
frame2 = Frame(sw.subwidgets_all()[1]) 
frame2.pack(side = RIGHT)
button = Button(frame2, text  = "Quit", command = quit)
button.pack(side = RIGHT)

这允许相对于应用程序的固定位置,但窗口相对于按钮的父级而不是帧1调整大小.另一个缺点是水平滚动条仅相对于frame1.
>找到滚动条的中点并使用位置更新按钮相对于那些坐标的位置(可能?)不确定如何实现这一点,并且总体上看到SO解决方案我认为这可能是一种低效的方法.

编辑:虽然这不是我的想法,下面的代码按照评论中的falsetru的建议工作:

from Tkinter import *
import Tix
class some_GUI:
    def __init__(self, root):
        def quit():
            root.quit()
        frame2 = Frame(root) 
        frame2.pack(side = RIGHT)
        button = Button(frame2, text  = "Quit", command = quit)
        button.pack()
        frame1 = Frame(root) 
        frame1.pack(side = LEFT)
        sw= Tix.ScrolledWindow(frame1, scrollbar=Tix.AUTO)
        sw.pack(fill=Tix.BOTH, expand=1)
        for widget in sw.subwidgets_all():
            print widget
        for i in range(0,300):
            label1 = Label(sw.window, text = "foo")
            label1.grid(row = i, column = i)
        print root.winfo_toplevel()
        for widget in sw.subwidgets_all():
            print widget



root = Tix.Tk()
display = some_GUI(root)
root.mainloop()

最佳答案 您可以将按钮放在ScrollWindows之外:

import Tix
from Tkinter import *


def build_ui(root):
    sw = Tix.ScrolledWindow(root, scrollbar=Tix.AUTO)
    sw.pack(side=LEFT, fill=Tix.BOTH, expand=1)
    for i in range(300):
        label1 = Label(sw.window, text="foo")
        label1.grid(row=i, column=0)
    button = Button(root, text="Quit", command=root.quit)
    button.pack(side=RIGHT)


root = Tix.Tk()
build_ui(root)
root.mainloop()
点赞