Я использую 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()
Я хочу, чтобы кнопка (ы) находилась в «рамке2» и центрирована по вертикали относительно окна приложения. Я попытался использовать 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)
Это позволяет фиксированное положение относительно применения, но окно изменяет размер относительно родителя кнопки, а не frame1. Другим недостатком является то, что горизонтальная полоса прокрутки находится только относительно кадра1.
Найдите среднюю точку полосы прокрутки и обновите положение кнопок относительно этих координат, используя место (возможно?), Не знаете, как это сделать, и, видя SO-решения в целом, я думаю, что это может быть неэффективным способом делая это.
EDIT: Несмотря на то, что это не совсем то, что я имел в виду, следующий код работает согласно предложению 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()
Как насчет поставить кнопку из ScrolledWindow? – falsetru
@falsetru Я всегда поражен тем, насколько простым является решение, когда вы это знаете. Вы хотите получить официальный ответ, чтобы я мог принять его? Я отредактирую рабочий код в вопросе или что-то еще. Я избегал этого маршрута после того, как решение 1 не вышло. Спасибо! –