在开始之前请先弄清楚这一点。
我有与以下问题相同的问题:Tkinter: creating an arbitrary number of buttons/widgets
但是接受的答案对我不起作用。
这是我的代码:
import os
try:
from tkinter import *
except ImportError:
from Tkinter import *
from subprocess import call
root = Tk()
root.wm_attributes("-fullscreen", "true")
root.config(background = "#FFFFFF")
backIMG = PhotoImage(file="b.gif")
usbIMG = PhotoImage(file="u.gif")
usbAuswahlIMG = PhotoImage(file="ua.gif")
downloadsIMG = PhotoImage(file="d.gif")
downloadsAuswahlIMG =
PhotoImage(file="da.gif")
menuFrame = Frame(root, width=200, height=600, bg="#FFFF00")
menuFrame.grid(row=0, column=0, padx=10, pady=3)
def goBack():
#os.system('python gui.py')
root.destroy()
def selectUSB():
downloadsButton.config(image=downloadsIMG)
usbButton.config(image=usbAuswahlIMG)
def selectDownloads():
usbButton.config(image=usbIMG)
downloadsButton.config(image=downloadsAuswahlIMG)
i = 0
buttons = dict()
for file in os.listdir('/home/pi/Downloads'):
if file.endswith(".mp3") or file.endswith(".wav"):
buttons[i] = Button(contentFrame, text=file, width=60, font=("Sans", 15), command=lambda a=i: playDL(a).grid(row=i, column=0))
i = i + 1
print()
def playDL(index):
print (index)
usbButton = Button(menuFrame, image=usbIMG,
command=selectUSB)
usbButton.pack()
downloadsButton = Button(menuFrame, image=downloadsIMG,
command=selectDownloads)
downloadsButton.pack()
stopButton = Button(menuFrame, image=backIMG,
command=goBack)
stopButton.pack()
contentFrame = Frame(root, width=760, height=594, bg='#FFFFFF')
contentFrame.grid(row=0, column=1, padx=13, pady=3)
root.mainloop()
在另一篇文章中,有人建议在此处添加此代码:
buttons = dict()
for k in range(len(info)):
buttons[k] = Button(top, text=info[k], command=lambda a=k: my_function(buttons[a]))
我已经完成并将其更改为适合我的代码的地方。
问题在于,现在按钮根本没有显示在内容框架上。它仍然通过循环运行,但没有按钮可见。刚开始我有这个:
for file in os.listdir('/home/pi/Downloads'):
if file.endswith(".mp3") or file.endswith(".wav"):
Button(contentFrame, text=file, width=60, font=("Sans", 15), command=lambda: playDL(i).grid(row=i, column=0))
i = i + 1
所有按钮都没什么作用,但可见。
我昨天开始使用python进行编程,但是我对Java和Visual C#非常熟悉,所以我对自己正在做的事情有一个基本的了解
答案 0 :(得分:1)
更改此:
0,35
对此:
for file in os.listdir('/home/pi/Downloads'):
if file.endswith(".mp3") or file.endswith(".wav"):
Button(contentFrame, text=file, width=60, font=("Sans", 15),
command=lambda: playDL(i).grid(row=i, column=0))
i = i + 1
您将网格管理放置在lambda函数内部,而不是按钮小部件外部。
tobias在注释中指出,您需要在lambda中使用for file in os.listdir('/home/pi/Downloads'):
if file.endswith(".mp3") or file.endswith(".wav"):
Button(contentFrame, text=file, width=60, font=("Sans", 15),
command=lambda i=i: playDL(i)).grid(row=i, column=0)
i = i + 1
才能使每个按钮的值都准确,否则所有值在循环中都将是最后一个值。