Tkinter 函数创建无法使用 .get() 从条目添加到列表的变量

Tkinter function creates variable that can't be added to list with .get() from entry

首先,我知道有很多关于 .get() 无法正常工作的问题,我已经通读了其中的许多问题。 我的问题是我的程序有一个按钮,每次按下它时,它都会为要添加的新播放器添加一个新的输入框,然后我想创建一个播放器对象(我定义了播放器 class在另一个文件中)并将 Player 对象添加到列表中。 这是“添加播放器”按钮的功能:

def add_player():
    new_player = Label(team_wind, text='Enter an NBA Player:')
    new_player_entry = Entry(team_wind, width=30)
    new_player.pack()
    new_player_entry.pack()
    team_wind.mainloop()
    player_list.append(new_player_entry.get())

(team_wind 是 window 因为它正在创建一个 Team of Players。Team class 也在另一个文件中定义) 经过一些研究,我意识到 mainloop 将终止该代码块(据我所知)。所以,当我 运行 程序时,条目 returns ''。我知道这是一个非常普遍的问题,但对我来说很奇怪,因为我想不出解决它的方法。我已经有一个 tkinter window 的工作部分,适用于具有单个输入框的单个玩家,所以我知道 .get() 是如何工作的。我试过使用 .update() 和 .update_idletasks().

。如果我尝试在另一个函数中或在代码终止后执行此操作,那么它将不起作用,因为如果多次按下按钮,每个条目将具有相同的变量名称。我认为这意味着它必须在此函数中完成,但不确定如何使用 mainloop 来完成。这是创建 window 的代码,因此它将 运行。我所需要的只是让它能够打印或 return 带有播放器对象的列表,无论有多少播放器(取决于按下按钮的次数)。 我已经提供了 运行 程序所需的代码,并删除了所有其他可能导致错误的代码。谢谢

     from tkinter import *
    player_list = []    
    def add_player():
        new_player = Label(team_wind, text='Enter an NBA Player:')
        new_player_entry = Entry(team_wind, width=30)
        new_player.pack()
        new_player_entry.pack()
        team_wind.mainloop()
        player_list.append(new_player_entry.get())
    
    def main():
        #setup
        global team_name
        global team_wind
        global player_entry
        global player_entry2
        team_wind = Tk()
        team_wind.title('Team')
        team_wind.geometry('800x500')
    
        #Text entries
        team_mode_title = Label(team_wind, text='Make a team of NBA Players and find their stats')
        player = Label(team_wind, text='Enter an NBA Player:')
        player2 = Label(team_wind, text='Enter an NBA Player:')
        
        #Text Box Entries
        player_entry = Entry(team_wind, width=30)
        player_entry2 = Entry(team_wind, width=30)
    
        #BUTTONS
        add_player_button = Button(team_wind, text='Add player', command=add_player)
    

        #Button for Whosebug question to print the list of players
            print_list_button = Button(team_wind, text='Print List', command=print_list)
            #Pack
            team_mode_title.pack()
            #avg_button.pack()
            add_player_button.pack()
            print_list_button.pack()
            player.pack()
            player_entry.pack()
       

 player2.pack()
        player_entry2.pack()
    
        team_wind.mainloop()
    

def print_list():
    player_list.append(player_entry.get())
    player_list.append(player_entry2.get())
    print(player_list)

if __name__ == "__main__":
    main()

一旦您的程序到达 team_wind.mainloop() 命令,它下面的任何内容都不会执行,因为 python 将永远继续 运行 mainloop()。这意味着函数永远不会到达 运行 player_list.append(Player(new_player_entry.get())).

你应该只有一个 mainloop() - 在 main().

您可以使用列表来保留小部件 Entry - 无需使用 .get() - 打印列表时应使用 .get()


最少的工作代码。

我使用 Frame 来保留 LabelEntry,这样它会在 Buttons.

之前添加 Entry
import tkinter as tk  # PEP8: `import *` is not preferred

def add_player():
    label = tk.Label(frame, text='Enter an NBA Player:')
    label.pack()
    
    entry = tk.Entry(frame, width=30)
    entry.pack()
    
    entry_list.append( entry )  # add full widget, not value from widget

def print_list():
    for number, entry in enumerate(entry_list, 1):
        print( number, entry.get() )

def main():
    global team_wind
    global frame

    team_wind = tk.Tk()
    team_wind.title('Team')
    team_wind.geometry('800x500')

    team_mode_title = tk.Label(team_wind, text='Make a team of NBA Players and find their stats')
    team_mode_title.pack()

    # frame to keep all Entries
    frame = tk.Frame(team_wind)
    frame.pack()
    
    # at start add Entries for two players
    add_player()    
    add_player()
    
    # button to add Entry for next player
    add_player_button = tk.Button(team_wind, text='Add player', command=add_player)
    add_player_button.pack()

    # button to print values from all Entries
    print_list_button = tk.Button(team_wind, text='Print List', command=print_list)
    print_list_button.pack()

    team_wind.mainloop()

# --- main ---

entry_list = []

main()