首先,我知道 .get() 無法正常作業存在很多問題,我已經閱讀了其中的許多問題。我的問題是我的程式有一個按鈕,每次按下它時,它都會為要添加的新播放器添加一個新的輸入框,然后我想創建一個播放器物件(我在另一個檔案中定義了播放器類)并將 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 是視窗,因為它正在創建一個玩家團隊。Team 類也在另一個檔案中定義)經過一些研究,我意識到 mainloop 將終止該代碼塊(據我所知)。所以,當我運行程式時,條目回傳''。我知道這是一個非常常見的問題,但對我來說這很奇怪,因為我無法找到解決它的方法。我已經為帶有單個輸入框的單個玩家提供了 tkinter 視窗的作業部分,所以我知道 .get() 是如何作業的。我試過使用 .update() 和 .update_idletasks()。
- 我嘗試將 player_list.append 移到 mainloop 之前,因為我知道之后的代碼無法訪問,但是如果我將它移到之前,那么它什么也不回傳
. 如果我嘗試在另一個函式中或在代碼終止后執行此操作,則它將不起作用,因為如果多次按下按鈕,每個條目將具有相同的變數名稱。我認為這意味著它必須在這個函式中完成,但不知道如何用 mainloop 做到這一點。這是創建視窗以便它運行的代碼。我所需要的只是它能夠列印或回傳包含玩家物件的串列,無論有多少玩家(取決于按下按鈕的次數)。我已經提供了運行程式所需的代碼,并洗掉了所有會導致錯誤的內容。謝謝
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 StackOverflow 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()
uj5u.com熱心網友回復:
你應該只有一個mainloop()。main()
您可以使用您的串列來保留小部件Entry- 不使用.get()- 您應該.get()在列印串列時使用。
最少的作業代碼。
我Frame以前保留LabelandEntry并以這種方式添加Entry之前Buttons。
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()
uj5u.com熱心網友回復:
一旦您的程式到達該team_wind.mainloop()命令,它下面的任何內容都不會執行,因為 python 將永遠繼續運行 mainloop()。這意味著該函式將永遠無法運行player_list.append(Player(new_player_entry.get()))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430241.html
上一篇:設計模式-代理模式
下一篇:根據其他串列中的條件列舉串列
