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().
- 我试过将 player_list.append 移动到主循环之前
因为我知道后面的代码是无法访问的,但是如果我把它移到
以前,然后 return没什么
。如果我尝试在另一个函数中或在代码终止后执行此操作,那么它将不起作用,因为如果多次按下按钮,每个条目将具有相同的变量名称。我认为这意味着它必须在此函数中完成,但不确定如何使用 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
来保留 Label
和 Entry
,这样它会在 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()
首先,我知道有很多关于 .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().
- 我试过将 player_list.append 移动到主循环之前 因为我知道后面的代码是无法访问的,但是如果我把它移到 以前,然后 return没什么
。如果我尝试在另一个函数中或在代码终止后执行此操作,那么它将不起作用,因为如果多次按下按钮,每个条目将具有相同的变量名称。我认为这意味着它必须在此函数中完成,但不确定如何使用 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
来保留 Label
和 Entry
,这样它会在 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()