尝试在 tkinter 中为列表中的项目创建按钮行

Trying to create rows of buttons in tkinter for items in a list

提问人:user83975 提问时间:12/5/2021 最后编辑:Vojin Purićuser83975 更新时间:12/5/2021 访问量:692

问:

我想为列表中的每个项目创建按钮,但需要了解如何将它们全部放在同一个框架中。理想情况下,我想将 4 或 5 个按钮排成一排,然后直接显示接下来的 4-5 个按钮。这是我现在所拥有的:

from tkinter import ttk
from restaurantSoftware import restaurantInfo


class menuFrame:
    def __init__(self, frame):
        self.frame = frame

        availableItems = restaurantInfo.readRestaurantInfo('availableItems.csv')
        itemList = availableItems[0]
        priceList = availableItems[1]
        categoryList = availableItems[2]

        for item in itemList:
            button = ttk.Button(text=item)
            button.pack(side='left', ipadx=25, ipady=25)

这是我运行程序时我的 tkinter 布局的屏幕截图。

layout preview

python tkinter tkinter-layout

评论

2赞 Sylvester Kruin - try Codidact 12/5/2021
欢迎来到 Stack Overflow!请提供一个最小的可重复示例,以便我们为您提供帮助。你试过使用这种方法吗?grid()

答:

0赞 figbeam 12/5/2021 #1

最简单的方法是使用 instead 而不是 for 循环将按钮放在网格上。下面是一个如何做到这一点的示例:gridpack

import tkinter as tk

root = tk.Tk()

item_list = ['Cheesburger','BLT','Cheese Pizza','Chicken Filet',
             'Hotdog','Caesar Salad','Chicken Salad']
row_length = 4

for row in range(1000):  # Any number bigger than anticipated number of rows
    if row_length*row >= len(item_list):
        break
    for col in range(row_length):
        if row_length*row + col >= len(item_list):
            break
        b = tk.Button(root, width=15, text=item_list[row_length*row + col])
        b.grid(row=row, column=col)

root.mainloop()

由于我将打破循环,因此第一个循环中的范围有多大并不重要。现在,这个解决方案可能会得到肯定的改进,但这只是一个开始。

2赞 Matiiss 12/5/2021 #2

您可以使用返回乘数和余数的内置函数,以便 => 可以计算应放置小部件的行和列:divmoda, b = divmod(c, d)a * d + b = c

import tkinter as tk


COLUMNS = 3

item_list = ['Cheese burger', 'BLT', 'Cheese Pizza', 'Chicken Fillet',
             'Hot dog', 'Caesar Salad', 'Chicken Salad']

root = tk.Tk()

for i, item in enumerate(item_list):
    lbl = tk.Button(root, text=item)
    row, column = divmod(i, COLUMNS)
    lbl.grid(row=row, column=column, sticky='news')

root.mainloop()