Tkinter: запись записей, динамически создаваемых кнопками - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь разрешить пользователю вводить столько строк, сколько он хочет, нажимая какую-то кнопку «+», и сохранять строки в списке. (Он вводит первую строку, нажимает «+», появляется другое поле ввода и т. Д.)

На данный момент вот что у меня есть:

def addEntry(window, r, e):
    if r < 9:
        global entries
        entries.append(e.get())
        r += 1
        e = tk.Entry(window)
        e.grid(column=1, row=r)
        add = tk.Button(window, text=' + ', command=lambda:addEntry(window, r, e))
        add.grid(column=2, row=r, sticky=tk.W)
    else:
        errmsg = 'Max. 10 items'
        tk.Label(window, text=errmsg).grid(column=1, row=r+1)


import tkinter as tk

global entries # the main list of strings
entries = []
r = 0 # index for rows ; will not be 0 in the final code as there will be other widgets

win = tk.Tk()

e = tk.Entry(win)
e.grid(column=1, row=r)
add = tk.Button(win, text=' + ', command=lambda:addEntry(win, r, e))
add.grid(column=2, row=r, sticky=tk.W)

win.mainloop()

Это не элегантно, и последняя запись не записана.

Я пытался создать entries список элементов Entry () (не e.get ()), но тогда я не могу получить доступ к строкам (TclError: invalid command name ".!entry4"). Я попытался эмулировать this , что заставило меня сделать entries глобальной переменной; Я пытался использовать this , но я не до конца понимаю первый ответ, и, насколько я могу судить, строки не записываются; Я попытался адаптировать класс, определенный во втором ответе, но не смог добавить кнопки динамически. (Хотя мне нравится идея сделать урок.) Я чувствую, что должен быть в состоянии это сделать, но, потратив на это целый день, я мог бы также попросить о помощи.

1 Ответ

0 голосов
/ 29 июня 2018

Не помещайте значение в список, поместите фактический виджет. Вы должны вызывать метод get только тогда, когда вам действительно нужны значения.

Кроме того, я настоятельно рекомендую поместить записи в выделенную рамку. Таким образом, вам не нужно беспокоиться о том, какие другие виджеты могут находиться в окне, и вам не нужно жонглировать номерами строк и столбцов. Поместите их в рамку и используйте pack, поскольку они расположены сверху вниз и имеют одинаковый размер.

Пример:

import tkinter as tk

def addEntry(window):
    global entries
    if len(entries) > 10:
        error_message.configure(text="Max. 10 items")
    else:
        error_message.configure(text="")
        entry = tk.Entry(window)
        entry.pack(side="top", fill="x")
        entries.append(entry)

def show():
    for entry in entries:
        print("=>", entry.get())


entries = []

win = tk.Tk()

entry_frame = tk.Frame(win)
error_message = tk.Label(win)
error_message.grid(row=1, column=0, sticky="nsew")

add = tk.Button(win, text=' + ', command=lambda: addEntry(entry_frame))
show = tk.Button(win, text="Show values", command=show)

add.grid(row=0, column=1, sticky=tk.NW)
show.grid(row=0, column=2, sticky=tk.NW)
entry_frame.grid(row=0, column=0, sticky="nsew")

# create the first entry automatically
addEntry(entry_frame)

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