Tkinter: создать произвольное количество кнопок - PullRequest
0 голосов
/ 13 ноября 2018

Просто чтобы прояснить это, прежде чем я начну.

У меня та же проблема, что изложена в этом вопросе: Tkinter: создание произвольного количества кнопок / виджетов

но принятый ответ не работает для меня.

Это мой код:

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 голосов
/ 13 ноября 2018

Измените это:

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

На это:

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

Вы поместили управление сеткой в ​​свою функцию лямбда-функции вместо внешнего виджета кнопки.

Как указал Тобиас в комментариях, вам нужно использовать i=i в вашей лямбде, чтобы ваши значения были точными для каждой кнопки, или все они будут иметь последнее значение в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...