在Tkinter的弹出窗口中动态创建Entry窗口小部件时出现问题

时间:2020-08-13 01:42:42

标签: python tkinter

我的目标是创建一个弹出窗口,该窗口从Entry小部件中获取字符串,小部件的数量由用户在主窗口上确定。因此,如果用户需要输入5个字段,则弹出窗口应具有5个Entry小部件以获取5个不同的字符串,如果用户输入4,则弹出窗口应具有4个小部件,依此类推。使用this question的帮助,我编写了以下代码:

import tkinter as tk

root = tk.Tk()
root.title("Main Window")

class EntryButton(object):
    def __init__(self, rootWin, numberEn):
        self.number = numberEn
        self.entry = tk.Entry(rootWin)
        self.button = tk.Button(rootWin, text="test", command=self.on_click)
        self.entry.grid(row=numberEn, column=0)
        self.button.grid(row=numberEn, column=1)
        self.value = None

    def on_click(self):
        self.value = self.entry.get()

def popup_window(numberOfEntries, storageDict):
    window = tk.Toplevel()
    window.title("Pop-Up Window")

    dictionary = dict()
    for i in range(0, numberOfEntries):
        dictionary[i] = EntryButton(window, i)
    
    storageDict = dictionary

numberVar = tk.IntVar()
tk.Label(root, text='Enter how many markers you are using:', font=('bold', 10)).grid(column= 0, row= 3)
tk.Entry(root, textvariable=numberVar).grid(column= 1, row=3)
number = numberVar.get()

mainStorage = dict()
initialPlotBtn = tk.Button(root, text='Start Labelling')
initialPlotBtn.config(command =lambda:
    popup_window(numberOfEntries=number, storageDict=mainStorage)
)
initialPlotBtn.grid(column = 1, row = 4)

root.mainloop()

for key in mainStorage:
    print(key, mainStorage[key])

我的主窗口如下所示: MainWindowImg。 但是,一旦创建了弹出窗口,它将显示为空,如下所示: Pop-upWindowImg

我只是开始使用tkinter,所以可能有些东西我没有到达这里。 在Windows 10上使用Python 3.8.3

1 个答案:

答案 0 :(得分:1)

您将number的值用作popup_window()的参数,但是number为零,因为它是在创建条目后立即分配的。

您应该使用numberVar.get()作为参数:

initialPlotBtn.config(command =lambda:
    popup_window(numberOfEntries=numberVar.get(), storageDict=mainStorage)
)