Tkinter:创建任意数量的按钮

时间:2018-11-13 13:04:37

标签: python python-3.x tkinter

在开始之前请先弄清楚这一点。

我有与以下问题相同的问题: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#非常熟悉,所以我对自己正在做的事情有一个基本的了解

1 个答案:

答案 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 才能使每个按钮的值都准确,否则所有值在循环中都将是最后一个值。