【问题标题】:Trying to create rows of buttons in tkinter for items in a list尝试在 tkinter 中为列表中的项目创建多行按钮
【发布时间】:2021-12-04 21:55:52
【问题描述】:

我想为列表中的每个项目创建按钮,但需要找出如何将它们全部放在同一个框架中。理想情况下,我想连续放置 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 布局的屏幕截图。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请提供minimal reproducible example,以便我们为您提供帮助。您是否尝试过使用grid() 方法?

标签: python tkinter tkinter-layout


【解决方案1】:

您可以使用内置的divmod 函数返回乘数和余数,这样a, 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()

【讨论】:

    【解决方案2】:

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

    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()
    

    因为我将打破循环,所以第一个循环的范围有多大并不重要。现在这个解决方案可能最终会得到改进,但这只是一个开始。

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2021-01-16
      • 2019-09-29
      • 1970-01-01
      相关资源
      最近更新 更多