我正在学习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()
答案 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
计算col
和i
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)
像其他人一样使用两个嵌套循环,您只需通过以下方式计算row
和column
中的文字:
(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()