首页 > 解决方案 > 创建带有循环的按钮不会创建单独的标签

问题描述

在我的保存菜单中,我添加了根据玩家需要创建尽可能多的保存文件的选项,并且指示每个保存的按钮应该在启动时出现,并带有相应的数字,但是我用来创建单个按钮的功能, 不能按预期工作。

假设saveamount = 9

from tkinter import *
from tkinter import ttk

def newsave():
    global saveamount #this is 0 by default
    saveamount = saveamount + 1
    savecountdoc = open("saves/savecount.txt", "w+")
    savecountdoc.write(str(saveamount))
    Button(scrollable_frame, text="Save " + str(saveamount), width="53", height="5").pack()

def savespack():
    savelabelcount = 0
    savebuttontext = StringVar()
    for i in range(saveamount):
        savelabelcount = savelabelcount + 1
        print(savelabelcount) #prints 1-9
        savebuttontext.set("Save " + str(savelabelcount))
        Button(scrollable_frame, textvariable=savebuttontext, width="53", height="5").pack()

def savefiles():
    global backbutton
    global scrollable_frame
    playbutton.place_forget()
    backbutton = Button(main, text="Back", width ="56", command=startscreenback)
    backbutton.grid(row="0", column="0")
    savesframe = ttk.Frame(main)
    savesframecanvas = Canvas(savesframe)
    scrollbar = ttk.Scrollbar(savesframe, orient="vertical", command=savesframecanvas.yview)
    scrollable_frame = ttk.Frame(savesframecanvas)
    scrollable_frame.bind(
        "<Configure>",
        lambda e: savesframecanvas.configure(
            scrollregion=savesframecanvas.bbox("all")
            )
        )
    savespack()
    newsavebutton = Button(scrollable_frame, text="New Save", width="53", height="5", command=newsave).pack()
    savesframecanvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
    savesframecanvas.configure(yscrollcommand=scrollbar.set)
    savesframe.place(x="0", y="50")
    savesframecanvas.pack(side="left", fill="both", expand=True)
    scrollbar.pack(side="right", fill="y")

main = Tk()
main.title("Fruit Clicker")
main.geometry("400x350+300+100")
playbutton = Button(main, text="Play", width="40", height="3", command=savefiles)
playbutton.place(x="60", y="100")
main.mainloop()

这会创建正确数量的按钮,但它们都说“保存 9”而不是“保存 (1-9)”。我认为这是因为循环正在创建一大组按钮,但我不确定。如何使按钮显示正确的数字。

如果我需要添加更多代码,请告诉我,谢谢!

标签: python-3.xtkinter

解决方案


问题是您正在创建一个单一的StringVar并将其用于所有按钮,这意味着所有按钮都将具有相同的文本。您必须StringVar为每个按钮创建新按钮,因此将其移动到循环内。

for i in range(saveamount):
    savebuttontext = StringVar() # Create a variable each time
    savelabelcount = savelabelcount + 1
    print(savelabelcount) #prints 1-9
    savebuttontext.set("Save " + str(savelabelcount)) # Change it
    Button(scrollable_frame, textvariable=savebuttontext, width=53, height=5).pack() # Use it 

虽然我不推荐这种方法,因为它更容易使用text选项,这将摆脱必须存储StringVar某处(或者它只是没有意义使用一个),例如:

for i in range(saveamount):
    savelabelcount = savelabelcount + 1
    print(savelabelcount) #prints 1-9
    text = "Save " + str(savelabelcount)
    Button(scrollable_frame, text=text, width=53, height=5).pack()

一种更 Pythonic 的方法可能是更改text为:

text = f'Save {savelabelcount}'

推荐阅读