python-3.x - 创建带有循环的按钮不会创建单独的标签
问题描述
在我的保存菜单中,我添加了根据玩家需要创建尽可能多的保存文件的选项,并且指示每个保存的按钮应该在启动时出现,并带有相应的数字,但是我用来创建单个按钮的功能, 不能按预期工作。
假设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)”。我认为这是因为循环正在创建一大组按钮,但我不确定。如何使按钮显示正确的数字。
如果我需要添加更多代码,请告诉我,谢谢!
解决方案
问题是您正在创建一个单一的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}'
推荐阅读
- python - 让 size() 或 groupby & count 跨所有列工作
- elf - 在 elf 文件的注释部分修改 build-id
- azure - Azure AD - 在令牌 SPA 应用程序中返回角色和组
- java - 使用xml配置将依赖项注入Spring-Boot中的@RestController
- python - 从文件中获取不同的字符串并写入 .txt
- java - 将 TDD 重构为一系列测试
- python - 如何在函数中分离熊猫数据框中的文本数据
- javascript - 如何让多个 css 动画在 javascript 中播放?
- c++ - 在 OSX (XCode) 和 Windows (Visual Studio) 上存储 Unicode 字符串的区别
- ios - 是否有机会确定是否在 UITextView 中点击了空白空间?