<p>下面是另一种方法(函数式编程方法):</p>
<pre class="lang-py prettyprint-override"><code>from tkinter import Tk, Frame, Button, Label, StringVar, Toplevel
from functools import partial
stored_data = {'Lionel Notmessi': {'Games Played': 340, 'Goals': 102, 'Assists': 223}, 'Firstname Lastname': {'Games Played': 279, 'Goals': 84, 'Assists': 56}}
def open_edit_window(player):
tp = Toplevel(root)
tp.focus_force()
def del_n_refresh(event=None):
tp.destroy()
pack_all_players()
tp.bind('<FocusOut>', del_n_refresh)
tp.protocol('WM_DELETE_WINDOW', del_n_refresh)
total_length = len(stored_data[player])
def change(variable, stat_name, sign):
current = int(variable.get())
if sign == '-':
stored_data[player][stat_name] = current - 1
variable.set(current - 1)
elif sign == '+':
stored_data[player][stat_name] = current + 1
variable.set(current + 1)
stats_edit_frame = Frame(tp)
stats_edit_frame.pack()
Label(stats_edit_frame, text=player).grid(row=0, column=0, columnspan=total_length)
value_list = []
counter = 0
for stats, values in stored_data[player].items():
var = StringVar()
var.set(values)
value_list.append(var)
edit_data_frame = Frame(stats_edit_frame)
edit_data_frame.grid(row=1, column=counter, padx=5, pady=5)
for i in range(3):
edit_data_frame.columnconfigure(i, minsize=50)
Label(edit_data_frame, text=stats).grid(row=0, column=0, columnspan=3)
Button(edit_data_frame, text='-', command=partial(change, value_list[counter], stats, '-')).grid(row=1, column=0, sticky='nsew')
Label(edit_data_frame, textvariable=value_list[counter]).grid(row=1, column=1)
Button(edit_data_frame, text='+', command=partial(change, value_list[counter], stats, '+')).grid(row=1, column=2, sticky='nsew')
counter += 1
done = Button(stats_edit_frame, text='Done', command=del_n_refresh)
done.grid(row=3, column=0, columnspan=total_length, sticky='nsew', pady=5, padx=5)
def pack_all_players():
# this for loop is for refreshing the data
for widget in all_player_frame.winfo_children():
widget.destroy()
for player in stored_data:
player_frame = Frame(all_player_frame, width=100)
player_frame.pack(side='left', pady=20, padx=20)
Label(player_frame, text=player, font='default 12 normal').pack(side='top', pady=5)
stats_frame = Frame(player_frame)
stats_frame.pack(side='top', pady=10)
for stats, values in stored_data[player].items():
Label(stats_frame, text=f'{stats}: {values}').pack()
Button(player_frame, text='Edit', width=15, command=partial(open_edit_window, player)).pack(side='bottom', pady=5)
root = Tk()
all_player_frame = Frame(root)
all_player_frame.pack()
pack_all_players()
root.mainloop()
</code></pre>
<p>所以这个过程已经在另一个答案中解释过了,在这里它几乎是一样的,几乎是相同的循环,几乎是相同的调用,但是使用函数而不是类。如果你问这是否可以实现:那么如果你的意思是仅仅将这些函数添加到你的代码(你发布的那一个)中,那么这些函数就可以做所有事情,从字面上说,因此唯一的实现就是复制粘贴到你的代码上,那么你也可以更改一些函数,修改它们等等,因为它们根据需要创建小部件,所以字典中的玩家数量基本上就是它将创建的相应小部件数量(您的方法似乎是硬编码信息)。如果你想保存到我在另一个答案中提到的文件中</p>