显示网格的Python方式是什么?
我正在学习Python,我想在网格中显示按钮。下面的代码生成的正是我想要的,但是通过增加x和y来显示按钮的代码看起来并不是很像python。(我有程序语言背景)有更好的方法吗?谢谢你的帮助显示网格的Python方式是什么?,python,tkinter,Python,Tkinter,我正在学习Python,我想在网格中显示按钮。下面的代码生成的正是我想要的,但是通过增加x和y来显示按钮的代码看起来并不是很像python。(我有程序语言背景)有更好的方法吗?谢谢你的帮助 from tkinter import * from tkinter import ttk root = Tk() numberButtonsFrame = ttk.Frame(root) numberButtonsFrame.pack() button=[0] for i in range(1,10):
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()
处理网格时,解决方案通常是使用嵌套循环:
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
单回路
正如我在一篇评论(以及另一张海报)中所指出的,有一种方法可以基于I
计算行
和col
umn(反之亦然)
您可以在创建每个按钮的同时执行此操作。您还可以使用列表简化按钮的创建
buttons = [ttk.Button(numberButtonsFrame, text = i) for i in range(1,10)]
我假设您在按钮
(s)列表的开头添加了0
,以移动索引:您不必这样做。只需在计算中将1
添加到i
最后,我建议使用命名良好的变量而不是文字(例如,ncolumns
)。和按钮
,而不是列表的按钮
。我将以一个例子来结束(/
是楼层划分-在divmod
中的div
):
处理网格时,解决方案通常是使用嵌套循环:
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
单回路
正如我在一篇评论(以及另一张海报)中所指出的,有一种方法可以基于I
计算行
和col
umn(反之亦然)
您可以在创建每个按钮的同时执行此操作。您还可以使用列表简化按钮的创建
buttons = [ttk.Button(numberButtonsFrame, text = i) for i in range(1,10)]
我假设您在按钮
(s)列表的开头添加了0
,以移动索引:您不必这样做。只需在计算中将1
添加到i
最后,我建议使用命名良好的变量而不是文字(例如,ncolumns
)。和按钮
,而不是列表的按钮
。我将以一个例子来结束(/
是楼层划分-在divmod
中的div
):
使用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)
使用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)
另一种方法。。。
与其他方法一样,使用两个嵌套循环,您可以通过以下方法计算行
和列
中的文本:
(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()
另一种方法。。。
与其他方法一样,使用两个嵌套循环,您可以通过以下方法计算行
和列
中的文本:
(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()
您可以通过对按钮中的b执行
来改进第二个for循环:
因为您没有在循环中使用i
…您可以通过对按钮中的b执行来改进第二个for循环:
因为您没有在循环中使用i
…一个人对我的回答评论说str
转换是错误的隐式。是的,很抱歉,我一定错过了,我刚刚用我的例子检查了一下,它在tkinter中是不重要的:)使用计算的问题是,任何阅读此代码的人都可能必须解密计算在做什么,以确保它在做他们认为它在做的事情。当他们意识到你所做的只是数一数小部件的数量时,他们会挠头问你为什么不数一数,或者将小部件附加到列表中,并使用列表的长度。我明白你的观点,它的有效性是,对于不知道你在做什么的人来说,它可能不清楚,但它使用了行和列变量,因此不太难判断。另外,如果OP只是像我[here]()那样为自己编写一个程序,那么它很好,也更简洁……一个人在我的回答中评论说,str
转换是隐式的。是的,很抱歉我一定错过了,我刚刚用我的例子检查了一下,它在tkinter中很重要:)使用计算的问题是,任何阅读这段代码的人都可能必须破译计算在做什么,以确保它在做他们认为它在做的事情。当他们意识到你所做的只是数一数小部件的数量时,他们会挠头问你为什么不数一数,或者将小部件附加到列表中,并使用列表的长度。我明白你的观点,它的有效性是,对于不知道你在做什么的人来说,它可能不清楚,但它使用了行和列变量,因此不太难判断。此外,如果OP只是像我(这里)那样为自己编写一个程序,那么它很好,而且更简洁。。。