Как динамически создавать кнопки tkinter в зависимости от количества записей в CSV-файле - PullRequest
0 голосов
/ 07 ноября 2018

Я делаю приложение, которое будет автоматически добавлять текст в буфер обмена. В попытке сделать его более динамичным, я пытаюсь сделать скопированный текст в файле CSV. До сих пор мне удалось заставить CSV-файл импортировать и извлекать из него данные, однако, когда я пытаюсь добавить тест в буфер обмена, я получаю текст только с последней нажатой кнопки.

вот мой CSV-файл (script.csv)

idnum,name,script
0,testone,This is a test
1,testtwo,I hope it works
2,testthree,This better work
3,testfour,Please work

Тогда вот моя программа на Python

from tkinter import *
import tkinter as tk
import csv
idnum = []
name = []
script = []

for d in csv.DictReader(open('script.csv')):
     idnum.append((d['idnum']))
     name.append((d['name']))
     script.append((d['script']))

 def add_to_clipboard(li):
     r = Tk()
     r.withdraw()
     r.clipboard_clear()
     r.clipboard_append(li)
     r.update() # now it stays on the clipboard after the window is closed
     r.destroy()
     print (li)

 root = tk.Tk()
 frame = tk.Frame(root)
 frame.pack()

 for i in idnum:
     i = int(i)

     Button(frame, text = name[i], command=lambda : add_to_clipboard(script[i])).pack()


 root.mainloop()

1 Ответ

0 голосов
/ 07 ноября 2018

Лямбда-функция будет оценивать выражение script[i], а i будет последним idnum, установленным циклом for, выражение будет оценено как: Please work. Вы должны убедиться, что переменная i передана как константа:

command=lambda i=i: add_to_clipboard(script[i])

i=i - это обычный способ сделать это.

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