如何在滚动时保持小部件在视图中?
How do you keep a widget in view while scrolling?
我正在使用 Tix 在内容更改时自动创建滚动条。我想在用户滚动浏览应用程序内容时在用户视图中保留一两个按钮。
我 Tkinter/Tix 还没有看到这个问题,所以我想问一下。
以下代码将创建一个问题示例,其中按钮位于 window 中的固定点,并且会被滚动。
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" 中并相对于应用程序的 window 垂直居中。我尝试使用 winfo_height/winfo_width 来查找框架的高度/宽度以进行更新,但这些值并没有随着标签和按钮的添加而改变。
Attempted/possible 解决方案:
我通过执行以下操作将 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)
这允许相对于应用程序的固定位置,但 window 相对于按钮的父级而不是 frame1 调整大小。另一个缺点是水平滚动条只相对于frame1。
找到滚动条的中点并使用 place(也许?)更新按钮相对于那些坐标的位置(也许?)不确定如何完成此操作,并且看到一般的 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()
您提到的第二个选项可能会满足您的情况,但是这在计算上很昂贵,因为您需要删除按钮并相对于滚动条一遍又一遍地重新绘制它们 up/down运动。这不仅在设计上很丑陋,而且如果您的应用程序运行一些严重的操作,它可能会成为应用程序进一步可扩展性的障碍,甚至会导致意外错误。
对于您的问题,我看到的唯一现实的解决方案是将按钮固定在 canvas 上方(例如底部)(或您想要设置的任何区域)和可滚动区域之外@falsetru 评论你的区域。
可以把按钮移出Scroll Windows:
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()
我正在使用 Tix 在内容更改时自动创建滚动条。我想在用户滚动浏览应用程序内容时在用户视图中保留一两个按钮。 我 Tkinter/Tix 还没有看到这个问题,所以我想问一下。
以下代码将创建一个问题示例,其中按钮位于 window 中的固定点,并且会被滚动。
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" 中并相对于应用程序的 window 垂直居中。我尝试使用 winfo_height/winfo_width 来查找框架的高度/宽度以进行更新,但这些值并没有随着标签和按钮的添加而改变。
Attempted/possible 解决方案:
我通过执行以下操作将 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)
这允许相对于应用程序的固定位置,但 window 相对于按钮的父级而不是 frame1 调整大小。另一个缺点是水平滚动条只相对于frame1。
找到滚动条的中点并使用 place(也许?)更新按钮相对于那些坐标的位置(也许?)不确定如何完成此操作,并且看到一般的 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()
您提到的第二个选项可能会满足您的情况,但是这在计算上很昂贵,因为您需要删除按钮并相对于滚动条一遍又一遍地重新绘制它们 up/down运动。这不仅在设计上很丑陋,而且如果您的应用程序运行一些严重的操作,它可能会成为应用程序进一步可扩展性的障碍,甚至会导致意外错误。
对于您的问题,我看到的唯一现实的解决方案是将按钮固定在 canvas 上方(例如底部)(或您想要设置的任何区域)和可滚动区域之外@falsetru 评论你的区域。
可以把按钮移出Scroll Windows:
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()