【问题标题】:How to change location of the buttons on tkinter pack如何更改 tkinter pack 上按钮的位置
【发布时间】:2021-11-21 13:33:32
【问题描述】:

我的按钮在左侧按“上一张”和“下一张”的顺序显示,在右侧按“退出”和“下一组”的顺序显示。我希望下一个设置按钮总体上仍位于右侧,但位于退出按钮的左侧。所以我想要“下一组”和“退出”按钮来切换位置。

我还想知道是否可以在屏幕右下角显示退出按钮。我提供的第二张图片显示了每当我使用 .pack(side=tk.BOTTOM) 时会发生什么,因为退出按钮并没有真正位于整个图片下方。

fram = tk.Frame(self)
tk.Button(fram, text="Previous Image", bg="green", command=self.prev).pack(side=tk.LEFT)
tk.Button(fram, text="  Next Image  ", command=self.next).pack(side=tk.LEFT)
tk.Button(fram, text="            Next set              ", command=self._load_dataset).pack(side=tk.RIGHT)
tk.Button(fram, text="  Exit  ", command=self.destroy, fg = "grey").pack(side=tk.RIGHT)
tk.Label(fram, textvariable=self.clickStatus, font='Helvetica 18 bold').pack(side=tk.RIGHT)
# inside or outside
fram.pack(side=tk.TOP, fill=tk.BOTH)

enter image description here

【问题讨论】:

  • 如果您想要右下角的Exit 按钮,请尝试将其设置为self 而不是fram 的子元素并使用.pack(side=tk.BOTTOM, anchor='e')。也使用width 选项,而不是在这些按钮的文本周围填充空格。
  • 您好,欢迎来到 Stack Overflow。我看到你尽力解释你想要什么。但是,如果您在图像描述中写下图像的内容,那就太好了(例如,“这就是现在的样子”和“这就是我想要的”)。只需点击编辑并更改“在此处输入图片描述”。

标签: python tkinter button


【解决方案1】:

所以我想要“下一组”和“退出”按钮来切换位置。

打包器通过将小部件放置在主小部件中未分配空间的一侧来工作。顺序很重要,因为每个小部件都会导致未分配空间发生变化。例如,如果您想在框架的最右侧放置一个小部件,则应在打包任何其他小部件之前将其打包在右侧。

在您的情况下,解决方案就像更改调用 pack 的顺序一样简单。

tk.Button(fram, text="  Exit  ", command=self.destroy, fg = "grey").pack(side=tk.RIGHT)
tk.Button(fram, text="            Next set              ", command=self._load_dataset).pack(side=tk.RIGHT)

我也想知道是否可以在屏幕右下角显示退出按钮。

是的,这是可能的。最简单的解决方案是将窗口分成三个区域:顶部按钮组、底部按钮组和图像区域。

例如下面的代码为这三个区域创建了三个框架,并使用pack来排列它们。完成这些操作后,以任何您想要的顺序将按钮添加到顶部和底部框架变得很简单。

top_frame = tk.Frame(self)
bottom_frame = tk.Frame(self)
image_frame = tk.Frame(self)

top_frame.pack(side="top", fill="x")
bottom_frame.pack(side="bottom", fill="x")
image_frame.pack(side="top", fill="both", expand=True)

exit_button = tk.Button(bottom_frame, text="Exit", ...)
exit_button.pack(side="right")

previous_button = tk.Button(top_frame, text="Previous Image", ...)
next_button = tk.Button(top_frame, text="Next Image", ...)
next_set_button = tk.Button(top_frame, text="Next Set", ...)

previous_button.pack(side="left")
next_button.pack(side="left")
next_set_button.pack(side="right")

另一种方法是让所有按钮成为self 的子按钮,这样可以很容易地在同一代码块中定义它们,并使用in_ 参数指定它们的去向。

exit_button = tk.Button(self, text="Exit", ...)
previous_button = tk.Button(self, text="Previous Image", ...)
next_button = tk.Button(self, text="Next Image", ...)
next_set_button = tk.Button(self, text="Next Set", ...)

exit_button.pack(in_=bottom_frame, side="right")
previous_button.pack(in_=top_frame, side="left")
next_button.pack(in_=top_frame, side="left")
next_set_button.pack(in_=top_frame, side="right")

有关打包程序如何工作的详细说明,请参阅官方 tk 文档中的Packer Algorithm

【讨论】:

  • 您好,感谢您的帮助!我收到一条错误消息,提示 'NoneType' 对象对于 'exit_button.pack(side="right")' 行没有属性 'pack'。我将我的代码图像添加到原始帖子中
  • 谢谢,已修复!
  • 嗨,我想知道是否有办法改变文本或按钮的大小以使它们变大?
  • @newtocoding:是的。现有文档和几个在线教程都涵盖了这些内容。
【解决方案2】:

pack 的替代方法是使用按钮的网格属性将它们放置在框架中。

我使用单独的框架在我的应用中放置按钮:

frame_buttons = ttk.Frame(tab_details)
frame_buttons.grid(column = 0, row = 3, sticky = tk.EW)
frame_buttons.columnconfigure(0, weight = 1)
frame_buttons.columnconfigure(1, weight = 1)
button_process = ttk.Button(frame_buttons, text = 'Process', command = text_to_xml)
button_process.grid(column = 0, row = 0) # in the centre of the left column
button_clear = ttk.Button(frame_buttons,text = 'Clear', command = clear_entries)
button_clear.grid(column = 1, row = 0) # in the centre of the right column

网格在 TkDocs 站点中进行了描述: TkDocs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多