.pack()和.place()之间的区别并将它们一起使用?

时间:2013-07-12 12:24:29

标签: python python-3.x tkinter

这两个功能之间的主要区别是什么?

我目前正在开发一个包含画布和标签的程序,后者表现为按钮。现在画布使用.pack()放置,而我使用.place()作为标签。此外,程序会读取并使用鼠标单击的位置来执行某些操作。

目前有一个错误会导致程序在单击标签时触发意外操作,单击标签时我会惊讶地发现鼠标点击的x和y坐标不是对窗口的引用(正如我预期的那样)是),而是标签的左上角坐标。

有没有办法设置它,以便标签不会修改鼠标点击的x和y坐标?

我是python的新手,这是我使用tkinter创建的第一个项目。如果需要,我可以根据要求提供代码。

编辑:可以找到整个程序here。从第87行开始添加标签:

      newgame_Label = Label(parent, anchor=NW, font="Calibri",
           text="New Game")
      newgame_Label.bind("<Button 1>", self.newgame_Click)      
      newgame_Label.place(x=450, y=300)

      reset_Label = Label(parent, anchor=NW, font="Calibri",
           text="Reset Board")
      reset_Label.bind("<Button 1>", self.reset_Click)      
      reset_Label.place(x=450, y=400)  

函数initBoard在画布上调用.pack()方法。该程序是Light's Out的克隆,认为它是学习python和tkinter的好方法。

或者,我可以不使用标签,只使用canvas小部件可用的create_text方法,但这需要一些解决方法来确定是否已单击它。最感兴趣的是找出为什么标签窗口小部件的.place()行为与事件的方式相同,尽管它们共享相同的框架。

2 个答案:

答案 0 :(得分:2)

主要区别在于place允许您指定绝对坐标,pack使用框模型,允许您在框的两侧放置小部件。

通常在现实世界的应用程序中不使用

位置。这对于一小类问题非常有用,但是包和网格更有用。 Place需要您花费更多精力才能正确调整GUI大小。

答案 1 :(得分:0)

您可以将pack()和place()一起使用:

// specialisation for pointer types
template <class T, class... Args>
struct ArgsEstimate<T*, Args...> {
    static const std::size_t size = 32 + ArgsEstimate<Args...>::size;
};

记住! 您必须先放置背包