【问题标题】:Positioning widgets on frames with Tkinter使用 Tkinter 在框架上定位小部件
【发布时间】:2016-12-03 19:52:17
【问题描述】:

所以,我对 Python 和 Tkinter 还很陌生。 我正在创建战舰游戏。到目前为止,我已经成功创建了一个按钮网格。我现在正试图在这个游戏手柄的右侧创建一种菜单。我试图通过在我的窗口中有两个不同的框架来做到这一点——一个在我的游戏手柄所在的位置,一个在我有菜单的位置(位于标签下方)。 无论我在 cheat_button.grid() 里面放什么,我似乎都无法改变这个按钮的位置。它只是停留在 menu_frame 框架的左上角。我还想在此按钮下方添加另一个按钮,以及在同一框架上再往下添加一个消息框。有什么建议么?我已经链接了我认为相关的代码部分。

谢谢。

col_tot = 10
row_tot = 10

self.grid_frame = tk.Frame(self)
self.grid_frame.grid(row=0, column=0, rowspan=row_tot, columnspan=col_tot, sticky = "WENS")

self.menu_frame = tk.Frame(self, bg="grey", bd=1, relief="ridge")
self.menu_frame.grid(row=1, column=col_tot, rowspan=row_tot-1, columnspan=4, sticky = "WENS")


button_no = 0


self.button_list = []   
for x in range(row_tot):            
  self.button_list.append([""] * col_tot)


for i in range(row_tot):

  for j in range(col_tot):

    self.button_list[i][j] = (tk.Button(self.grid_frame, height = 3, width = 6, text = str(button_no + 1),
      activebackground = "yellow", relief = "groove"))
    self.button_list[i][j]["command"] = lambda i=i, j=j:self.update_colour(i, j)
    self.button_list[i][j].grid(row = i, column = j, sticky = "NW")

    button_no += 1

self.welcome = tk.Label(self, text = "Welcome to Battleship!",
  fg = "red", bg = "grey", font = ("Helvetica", 12), relief="ridge")
self.welcome.grid(row = 0, column = col_tot, columnspan = 4, sticky = "WENS")


self.cheat_button = tk.Button(self.menu_frame, text = "Cheat")
self.cheat_button.grid()
self.cheat_button.config(bg = "grey")

【问题讨论】:

  • 这很正常,因为它是 menu_frame 的唯一子代,因此所有其他行/列的高度/宽度为 0。
  • @j_4321,好的,如果是这样,我不知道如何解决它...关于如何以更好的方式做到这一点的建议?
  • 你看过地方几何管理器了吗? effbot.org/tkinterbook/place.htm
  • @ArcoBast 是的,但是我想用 .grid() 来做到这一点。这是我喜欢的那个。
  • 如果不是在左上角,您希望按钮在哪里?

标签: python button tkinter frame


【解决方案1】:

如果行和列为空且未配置为具有最小大小,则它们的大小为零。同样重要的是要知道每个框架都有自己的“网格”,所以即使左边的框架有 10 行和 10 列,右边的框架开始时完全是空的。

如果您希望按钮在框架中居中,一种解决方案是在其上方和下方保留一个空行,并将这些行配置为留有任何额外空间。例如:

self.welcome.grid(row = 0, column = 0, sticky = "WENS")
# notice we've put nothing in rows 1 or 3
self.cheat_button.grid(row=2, column=0)

self.menu_frame.grid_rowconfigure(1, weight=1)
self.menu_frame.grid_rowconfigure(3, weight=1)

【讨论】:

  • 感谢您的回复。这帮助了我的一部分!但是,我仍然觉得这很令人困惑。例如,如果我让 menu_frame 框架跨越 5 列,这是否意味着它包含 5 列供我放置小部件?如果我然后做类似的事情:`(对于范围内的c(4):self.menu_frame.grid_columnconfigure(c,weight = 1))`对于我在那个框架中的行同样的事情,我不应该能够将小部件准确放置在我想要的位置?到目前为止,它并没有像我预期的那样工作......如果我为一个按钮设置 column=3,它不应该在这个框架的列中间结束吗?
  • @Bryan Oakley:我不认为上面和下面的空行是必要的。只需执行self.cheat_button.grid(row=0, column=0)self.menu_frame.grid_rowconfigure(0, weight=1) 就足以使按钮垂直居中。
  • @j_4321:你是对的,空行并不是绝对必要的。我可以想到六种不同的方法来使按钮居中。对我来说,这是最简单的。
  • @CalleFreme: “如果我让 menu_frame 框架跨越 5 列,这是否意味着它包含 5 列供我放置小部件?” - 不,这不是它的意思。如果您使框架跨越五列,则仅意味着它跨越其父级中的五列。在它里面,你仍然可以说是从一张白纸开始。框架内的行和列完全独立于父级的行和列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多