Tkinter:创建任意数量的按钮/小部件

时间:2014-02-24 14:32:07

标签: python-3.x tkinter

所以,我有一个列表,其中的条目如下所示:

Option1  Placeholder1    2   Placeholder2    0      
Option2  Placeholder1    4              
Option3  Placeholder1    2   Placeholder2    -2   Placeholder3    6

我有一个选项列表框和一个按钮,用于创建一个包含所选选项值的新窗口。我想要做的是在创建这个新窗口时创建n个按钮,其中n是所选选项的值的数量(即选项1到3的2,1和3) , 分别)。我希望它看起来像这样:

Option1
Placeholder1    [button1 containing value=2]
Placeholder2    [button2 containing value=0]

...如果我只为我知道的最大n分配一个按钮,这当然很简单,但我想知道是否有办法更随意地做。显然,同样的问题也适用于我需要用于值名称的任意数量的标签('PlaceholderX')。

我一直试图对这类事物,变量变量等进行一些阅读,看起来这是一个非常大的NO-NO(如果不是全部的话)。有些人主张使用dictionaries,但我并没有真正了解它应该如何工作(即从dict中的条目/值命名变量)。

这是否可以(并且应该)完成,或者我最好只是手动创建所有按钮?

[编辑:添加代码]

from tkinter import *
import csv

root = Tk()
root.wm_title("RP")

listFrame = Frame(root, bd=5)
listFrame.grid(row=1, column=2)

listbox1 = Listbox(listFrame)
listbox1.insert(1, "Option1")
listbox1.insert(2, "Option2")
listbox1.insert(3, "Option3")
listbox1.pack()

infoFrame = Frame(root, bd=5)
infoFrame.grid(row=1, column=3)

info_message = Message(infoFrame, width=300)
info_message.pack()

# Read stats from file
stat_file = open('DiceTest.csv', 'rU')
all_stats = list(csv.reader(stat_file, delimiter=';'))


def list_selection(event):
    # gets selection and info/stats for info_message
    index = int(listbox1.curselection()[0])
    stats = all_stats[index]

    infotext = str(stats[0])  # just the name
    for n in range(int((len(stats)-2)/2)):  # rest of the stats
        infotext += ('\n' + str(stats[n*2 + 2]) + '\t' + str(stats[n*2 + 3]))

    info_message.config(text=infotext)

listbox1.bind('<ButtonRelease-1>', list_selection)

def load():
    top = Toplevel()
    top.geometry('300x100')

    index = int(listbox1.curselection()[0])
    stats = all_stats[index]

    # some way to create arbitrary buttons/labels here (?)

load_button = Button(root, text='Load', command=load)
load_button.grid(row=2, column=2)

root.mainloop()

哦,每个按钮应该具有相同的命令/功能,这会将按钮中当前的值减少2。

2 个答案:

答案 0 :(得分:2)

想出来!使用字典动态创建窗口小部件工作得很好,但是在各种按钮上调用正确的窗口小部件更加困难。这就是我所拥有的:

buttons = dict()
for k in range(len(info)):
    buttons[k] = Button(top, text=info[k], command=lambda: my_function(buttons[k]))

...哪个会起作用,但所有按下按钮都会调用最后创建的按钮作为目标的函数。所需要的只是按钮的command部分中的一些额外字符:

buttons = dict()
for k in range(len(info)):
    buttons[k] = Button(top, text=info[k], command=lambda a=k: my_function(buttons[a]))

...我假设它有效,因为它以某种方式将k的值存储在a内,而不是取最后已知的k值,即相当于最后创建的按钮。这是对的吗?

答案 1 :(得分:0)

您可以将按钮存储在列表中:

from tkinter import *
master = Tk()
buttons = []
n = 10
for i in range(n):
    button = Button(master, text = str(i))
    button.pack()
    buttons.append(button)
master.mainloop()