Как использовать функцию widget.place (x, y) для упаковки виджета во фрейм - при попытке переключения между парой фреймов? (ткинтер python) - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь связать начальную страницу моего приложения с разными фреймами, используя разные кнопки - каждая из них будет ссылаться на свой фрейм.

, когда я использовал функцию widget.pack () для разместить свои виджеты на экране - я смог успешно соединить эти кадры:

 from Tkinter import *


def raise_frame(frame):
    frame.tkraise()

root = Tk()
root.geometry("800x500+250+110")

f1 = Frame(root)
f2 = Frame(root)

for frame in (f1, f2):
    frame.grid(row=0, column=0, sticky='news')

b1 = Button(f1, text='Go to frame 2', command=lambda:raise_frame(f2))
b1.pack()

l1 = Label(f1, text='FRAME 1')
l1.pack()


l2 = Label(f2, text='FRAME 2')
l2.pack()


b2 = Button(f2, text='Go to frame 1', command=lambda:raise_frame(f1))
b2.pack()



raise_frame(f1)
root.mainloop()

Но, когда я использовал функцию Widget.Place (x, y) в дополнение к widget.pack () функция для размещения моих виджетов на экране, пытаясь разместить виджеты в указанных c точках - я не смог связать разные кадры, и моя начальная страница была пустой - виджеты не появлялись:

  from Tkinter import *


def raise_frame(frame):
    frame.tkraise()

root = Tk()
root.geometry("800x500+250+110")

f1 = Frame(root)
f2 = Frame(root)

for frame in (f1, f2):
    frame.grid(row=0, column=0, sticky='news')

b1 = Button(f1, text='Go to frame 2', command=lambda:raise_frame(f2))
b1.pack()
b1.place(x=100,y=200)

l1 = Label(f1, text='FRAME 1')
l1.pack()
l1.place(x=200, y=300)


l2 = Label(f2, text='FRAME 2')
l2.pack()
l2.place(x=200, y=300)


b2 = Button(f2, text='Go to frame 3', command=lambda:raise_frame(f3))
b2.pack()
b2.place(x=100,y=200)



raise_frame(f1)
root.mainloop()

мой вопрос - есть ли возможность использовать функцию widget.place (x, y) для размещения виджетов на рамке? или я должен использовать функцию widget.pack ()? (где я не могу разместить свой виджет в определенном c месте)

спасибо!

1 Ответ

0 голосов
/ 04 февраля 2020

... когда я использовал функцию Widget.Place (x, y) в дополнение к функции widget.pack () ...

Вы можете использовать только один или другой. Последний, который вы используете, тот, который находится под контролем. Когда вы делаете x.pack(...); x.place(...), это точно так же, как если бы вы только что сделали x.place(...) - вызов pack() абсолютно не влияет.

есть возможность использовать widget.place (x, y) функция для размещения виджетов на рамке?

Да, конечно, у вас всегда есть возможность использовать place. Однако, по моему опыту, это практически никогда не является правильным решением. Ваш код является хорошим примером того, почему он требует от вас гораздо большей работы.

Вы начинаете с создания родительского фрейма - f1 и f2 - и не даете им размер. Размер по умолчанию составляет всего один пиксель. Вы используете grid в окне root, но не присваиваете вес ячейке, в которой находятся эти кадры, поэтому строка и столбец остаются на один пиксель в высоту и ширину.

Один из Особенности place в том, что он не влияет на размер родительского элемента. Когда вы используете place для добавления виджета в рамку, рамка остается в одном пикселе. Таким образом, рамка на самом деле есть, и кнопка помещается в рамку по заданной c координате, но рамка фактически невидима, так как она имеет ширину всего один пиксель и высоту.

Вы можете увидеть это для Вы сами устанавливаете рамку шириной c (например, f1 = Frame(root, background="red", width=300, height=300)), либо используете надлежащие опции place или grid, чтобы заставить рамки заполнить окно (например: rowconfigure и columnconfigure, чтобы дать все дополнительное пространство для нулевой строки и нулевого столбца).

...