0

我试图通过使用不同的按钮将我的应用程序的起始页面链接到不同的框架 - 每个按钮都将链接到不同的框架。

当我使用 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() 函数将我的小部件放置在屏幕上时,试图将小部件放置在特定位置 - 我无法在它们之间建立链接不同的框架,我的打开页面是空白的 - 小部件没有出现:

  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() 功能?(我无法将我的小部件放在特定位置)

谢谢你!

4

1 回答 1

0

...当我使用 Widget.Place(x,y) 和 widget.pack() 功能时...

您只能使用其中一种。您使用的最后一个是可以控制的。当你这样做时x.pack(...); x.place(...),它与你刚才所做x.place(...)的完全一样 - 调用pack()绝对没有影响。

是否可以选择使用 widget.place(x,y) 函数将小部件放置在框架上?

是的,当然,您始终可以选择使用place. 然而,根据我的经验,它实际上从来都不是正确的解决方案。您的代码很好地说明了为什么它最终需要您做更多的工作。

您首先创建一个父框架 -f1并且f2- 并且不给它们一个大小。默认大小只有一个像素。您grid在根窗口中使用,但您没有给这些框架所在的单元格赋予权重,因此行和列保持一个像素的高和宽。

的特点之一place是它不会影响父级的大小。当您使用place向框架添加小部件时,框架保持单个像素。因此,框架实际上是存在的,并且按钮被放置在框架内的特定坐标处,但是框架实际上是不可见的,因为它只有一个像素宽和高。

您可以通过将框架强制为特定宽度(例如:)f1 = Frame(root, background="red", width=300, height=300),或通过使用适当的place, 或grid选项来强制框架填充窗口(例如:使用rowconfigureandcolumnconfigure将所有额外空间分配给第 0 行和零列)。

于 2020-02-04T15:24:42.287 回答