什么是pythonic方式显示网格?

时间:2017-07-30 20:44:12

标签: python tkinter

我正在学习Python,我想在网格中显示按钮。下面的代码产生了我想要的,但是通过递增x和y来显示按钮的代码似乎不是Pythonic。 (我来自程序语言背景)有更好的方法吗?谢谢你的帮助。

from tkinter import *
from tkinter import ttk
root = Tk()

numberButtonsFrame = ttk.Frame(root)
numberButtonsFrame.pack()
button=[0]
for i in range(1,10):
    button.append (ttk.Button(numberButtonsFrame, text = i))

x=0
y=0
for i in range(1,10):
    button[i].grid(row=x,column=y)
    y=y+1
    if y>2:
       x=x+1
       y=0    

root.mainloop()

3 个答案:

答案 0 :(得分:2)

当您处理网格时,解决方案通常是使用嵌套循环:

for row in in range(nrows):
  for col in range(ncolumns):
    buttons[row][col].grid(row=row, column=col) # You could also calculate a linear index if that's what you want

单循环

正如我在评论中提到的(以及另一张海报),有一种基于row计算coli umn的方法(反之亦然)。

row, col = divmod(i, ncolumns)

您可以在创建每个按钮的同时执行此操作。您还可以使用列表推导简化按钮创建。

buttons = [ttk.Button(numberButtonsFrame, text = i) for i in range(1,10)]

我假设您在0(s)列表的开头添加了button来转移索引:您不必这样做。只需在计算中将1添加到i即可。

最后,我建议使用名称好的变量而不是文字(例如ncolumns)。而buttons代替button列表。我将以一个示例结束(//是底线分割 - div中的divmod):

for i, button in enumerate(buttons):
   button.grid(row=i//ncolumns, column=i%ncolumns)

答案 1 :(得分:1)

使用divmod()函数计算索引中的每一行和每列。

buttons_per_row = 3
for i in range(9):
    button = ttk.Button(numberButtonsFrame, text = i+1)
    row, col = divmod(i, buttons_per_row)
    button.grid(row=row, column=col)

答案 2 :(得分:1)

另一种方法......

像其他人一样使用两个嵌套循环,您只需通过以下方式计算rowcolumn中的文字:

(r * 3) + c + 1

显然,这将返回int,因此必须应用str() - 导致更简洁的解决方案:

from tkinter import *
from tkinter import ttk
root = Tk()

numberButtonsFrame = ttk.Frame(root)
numberButtonsFrame.pack()

for r in range(3):
    for c in range(3):
        ttk.Button(numberButtonsFrame, text=(r * 3) + c + 1).grid(row=r, column=c)

root.mainloop()