【问题标题】:Tkinter "Add New Player" functionTkinter“添加新玩家”功能
【发布时间】:2021-05-24 01:28:18
【问题描述】:

我有一个按钮来编辑球员的球员统计数据,但我正在努力添加一个名为 Add New Player 的按钮,该按钮将允许用户输入新球员的姓名并输入他们进入系统。我对编码很陌生,我真的不知道这是否可能,因为对于其他玩家,我添加了单独的功能,甚至能够编辑他们的统计数据。

# import what is necessary
from tkinter import Tk, Label, Button, IntVar, Toplevel
 
main_account_screen()

# create a dictionary to store data
stored_data = {'Daniel Keelagher': {'Matches Played': 10, 'Goals': 4, 'Assists': 4, 'YC': 0, 'RC': 0},
               'Joseph Keelagher': {'Matches Played': 10, 'Goals': 2, 'Assists': 2, 'YC': 1, 'RC': 0},
               'Benjamin Miller': {'Matches Played': 10, 'Goals': 0, 'Assists': 0, 'YC': 1, 'RC': 0},
               'Jordan Terlato': {'Matches Played': 8, 'Goals': 1, 'Assists': 1, 'YC': 3, 'RC': 1},
               'Arki Gantzos': {'Matches Played': 9, 'Goals': 3, 'Assists': 2, 'YC': 0, 'RC': 0},
               'Billy Houndalas': {'Matches Played': 10, 'Goals': 0, 'Assists': 0, 'YC': 0, 'RC': 0},
               'Hayato Uematsu': {'Matches Played': 9, 'Goals': 2, 'Assists': 3, 'YC': 0, 'RC': 0},
               'Mark Boccari': {'Matches Played': 10, 'Goals': 1, 'Assists': 1, 'YC': 2, 'RC': 0},
               'Oliver Gibson': {'Matches Played': 7, 'Goals': 1, 'Assists': 2, 'YC': 0, 'RC': 0},
               'Zaid Khaleqi': {'Matches Played': 9, 'Goals': 2, 'Assists': 0, 'YC': 0, 'RC': 0}}

# define function change which will be responsible for changing data in stored_data dictionary
def change(player, stat, value, operator):  # set required arguments for the function which will be the: player (key in the dictionary, i.e. 'Daniel Keelagher'); stat (key in the player dictionary i.e. 'Goals', 'Assists'); value (refers to the IntVar associated with the respective Label); operator (determines whether value will be subtracted or added)
    # getting the current value of the associated IntVar
    cur_value = value.get()
    # eval to determine the operation if/elif
    if operator == '-':
        # accessing the stored_data key and dictionary key under the stored_data[key]
        stored_data[player][stat] = cur_value - 1
        # setting the IntVar value
        value.set(cur_value - 1)
    elif operator == '+':
        # same as previous but adding value
        stored_data[player][stat] = cur_value + 1
        value.set(cur_value + 1)


# Edit function for "Daniel Keelagher"
def edit_dk():
    # Creating a new window for data editing
    tp = Toplevel(root)

    # Packing a label to display name
    Label(tp, text='Daniel Keelagher').grid(row=0, column=0, columnspan=15)

    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Daniel Keelagher', 'Matches Played', dk_matches_var, '-')).grid(row=1, column=0)
    Label(tp, textvariable=dk_matches_var).grid(row=1, column=1)
    Button(tp, text='+', command=lambda: change('Daniel Keelagher', 'Matches Played', dk_matches_var, '+')).grid(row=1, column=2)

    Button(tp, text='-', command=lambda: change('Daniel Keelagher', 'Goals', dk_goals_var, '-')).grid(row=1, column=3)
    Label(tp, textvariable=dk_goals_var).grid(row=1, column=4)
    Button(tp, text='+', command=lambda: change('Daniel Keelagher', 'Goals', dk_goals_var, '+')).grid(row=1, column=5)

    Button(tp, text='-', command=lambda: change('Daniel Keelagher', 'Assists', dk_assists_var, '-')).grid(row=1, column=6)
    Label(tp, textvariable=dk_assists_var).grid(row=1, column=7)
    Button(tp, text='+', command=lambda: change('Daniel Keelagher', 'Assists', dk_assists_var, '+')).grid(row=1, column=8)

    Button(tp, text='-', command=lambda: change('Daniel Keelagher', 'YC', dk_yc_var, '-')).grid(row=1, column=9)
    Label(tp, textvariable=dk_yc_var).grid(row=1, column=10)
    Button(tp, text='+', command=lambda: change('Daniel Keelagher', 'YC', dk_yc_var, '+')).grid(row=1, column=11)

    Button(tp, text='-', command=lambda: change('Daniel Keelagher', 'RC', dk_rc_var, '-')).grid(row=1, column=12)
    Label(tp, textvariable=dk_rc_var).grid(row=1, column=13)
    Button(tp, text='+', command=lambda: change('Daniel Keelagher', 'RC', dk_rc_var, '+')).grid(row=1, column=14)

# Edit function for "Joseph Keelagher"
def edit_jk():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Joseph Keelagher').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Joseph Keelagher', 'Matches Played', jk_matches_var, '-')).grid(row=2, column=0)
    Label(tp, textvariable=jk_matches_var).grid(row=2, column=1)
    Button(tp, text='+', command=lambda: change('Joseph Keelagher', 'Matches Played', jk_matches_var, '+')).grid(row=2, column=2)

    Button(tp, text='-', command=lambda: change('Joseph Keelagher', 'Goals', jk_goals_var, '-')).grid(row=2, column=3)
    Label(tp, textvariable=jk_goals_var).grid(row=2, column=4)
    Button(tp, text='+', command=lambda: change('Joseph Keelagher', 'Goals', jk_goals_var, '+')).grid(row=2, column=5)

    Button(tp, text='-', command=lambda: change('Joseph Keelagher', 'Assists', jk_assists_var, '-')).grid(row=2, column=6)
    Label(tp, textvariable=jk_assists_var).grid(row=2, column=7)
    Button(tp, text='+', command=lambda: change('Joseph Keelagher', 'Assists', jk_assists_var, '+')).grid(row=2, column=8)

    Button(tp, text='-', command=lambda: change('Joseph Keelagher', 'YC', jk_yc_var, '-')).grid(row=2, column=9)
    Label(tp, textvariable=jk_yc_var).grid(row=2, column=10)
    Button(tp, text='+', command=lambda: change('Joseph Keelagher', 'YC', jk_yc_var, '+')).grid(row=2, column=11)

    Button(tp, text='-', command=lambda: change('Joseph Keelagher', 'RC', jk_rc_var, '-')).grid(row=2, column=12)
    Label(tp, textvariable=jk_rc_var).grid(row=2, column=13)
    Button(tp, text='+', command=lambda: change('Joseph Keelagher', 'RC', jk_rc_var, '+')).grid(row=2, column=14)

# Edit function for "Benjamin Miller"
def edit_bm():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Benjamin Miller').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Benjamin Miller', 'Matches Played', bm_matches_var, '-')).grid(row=3, column=0)
    Label(tp, textvariable=bm_matches_var).grid(row=3, column=1)
    Button(tp, text='+', command=lambda: change('Benjamin Miller', 'Matches Played', bm_matches_var, '+')).grid(row=3, column=2)

    Button(tp, text='-', command=lambda: change('Benjamin Miller', 'Goals', bm_goals_var, '-')).grid(row=3, column=3)
    Label(tp, textvariable=bm_goals_var).grid(row=3, column=4)
    Button(tp, text='+', command=lambda: change('Benjamin Miller', 'Goals', bm_goals_var, '+')).grid(row=3, column=5)

    Button(tp, text='-', command=lambda: change('Benjamin Miller', 'Assists', bm_assists_var, '-')).grid(row=3, column=6)
    Label(tp, textvariable=bm_assists_var).grid(row=3, column=7)
    Button(tp, text='+', command=lambda: change('Benjamin Miller', 'Assists', bm_assists_var, '+')).grid(row=3, column=8)

    Button(tp, text='-', command=lambda: change('Benjamin Miller', 'YC', bm_yc_var, '-')).grid(row=3, column=9)
    Label(tp, textvariable=bm_yc_var).grid(row=3, column=10)
    Button(tp, text='+', command=lambda: change('Benjamin Miller', 'YC', bm_yc_var, '+')).grid(row=3, column=11)

    Button(tp, text='-', command=lambda: change('Benjamin Miller', 'RC', bm_rc_var, '-')).grid(row=3, column=12)
    Label(tp, textvariable=bm_rc_var).grid(row=3, column=13)
    Button(tp, text='+', command=lambda: change('Benjamin Miller', 'RC', bm_rc_var, '+')).grid(row=3, column=14)

# Edit function for "Jordan Terlato"
def edit_jt():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Jordan Terlato').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Jordan Terlato', 'Matches Played', jt_matches_var, '-')).grid(row=4, column=0)
    Label(tp, textvariable=jt_matches_var).grid(row=4, column=1)
    Button(tp, text='+', command=lambda: change('Jordan Terlato', 'Matches Played', jt_matches_var, '+')).grid(row=4, column=2)

    Button(tp, text='-', command=lambda: change('Jordan Terlato', 'Goals', jt_goals_var, '-')).grid(row=4, column=3)
    Label(tp, textvariable=jt_goals_var).grid(row=4, column=4)
    Button(tp, text='+', command=lambda: change('Jordan Terlato', 'Goals', jt_goals_var, '+')).grid(row=4, column=5)

    Button(tp, text='-', command=lambda: change('Jordan Terlato', 'Assists', jt_assists_var, '-')).grid(row=4, column=6)
    Label(tp, textvariable=jt_assists_var).grid(row=4, column=7)
    Button(tp, text='+', command=lambda: change('Jordan Terlato', 'Assists', jt_assists_var, '+')).grid(row=4, column=8)

    Button(tp, text='-', command=lambda: change('Jordan Terlato', 'YC', jt_yc_var, '-')).grid(row=4, column=9)
    Label(tp, textvariable=jt_yc_var).grid(row=4, column=10)
    Button(tp, text='+', command=lambda: change('Jordan Terlato', 'YC', jt_yc_var, '+')).grid(row=4, column=11)

    Button(tp, text='-', command=lambda: change('Jordan Terlato', 'RC', jt_rc_var, '-')).grid(row=4, column=12)
    Label(tp, textvariable=jt_rc_var).grid(row=4, column=13)
    Button(tp, text='+', command=lambda: change('Jordan Terlato', 'RC', jt_rc_var, '+')).grid(row=4, column=14)

# Edit function for "Arki Gantzos"
def edit_ag():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Arki Gantzos').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Arki Gantzos', 'Matches Played', ag_matches_var, '-')).grid(row=5, column=0)
    Label(tp, textvariable=ag_matches_var).grid(row=5, column=1)
    Button(tp, text='+', command=lambda: change('Arki Gantzos', 'Matches Played', ag_matches_var, '+')).grid(row=5, column=2)

    Button(tp, text='-', command=lambda: change('Arki Gantzos', 'Goals', ag_goals_var, '-')).grid(row=5, column=3)
    Label(tp, textvariable=ag_goals_var).grid(row=5, column=4)
    Button(tp, text='+', command=lambda: change('Arki Gantzos', 'Goals', ag_goals_var, '+')).grid(row=5, column=5)

    Button(tp, text='-', command=lambda: change('Arki Gantzos', 'Assists', ag_assists_var, '-')).grid(row=5, column=6)
    Label(tp, textvariable=ag_assists_var).grid(row=5, column=7)
    Button(tp, text='+', command=lambda: change('Arki Gantzos', 'Assists', ag_assists_var, '+')).grid(row=5, column=8)

    Button(tp, text='-', command=lambda: change('Arki Gantzos', 'YC', ag_yc_var, '-')).grid(row=5, column=9)
    Label(tp, textvariable=ag_yc_var).grid(row=5, column=10)
    Button(tp, text='+', command=lambda: change('Arki Gantzos', 'YC', ag_yc_var, '+')).grid(row=5, column=11)

    Button(tp, text='-', command=lambda: change('Arki Gantzos', 'RC', ag_rc_var, '-')).grid(row=5, column=12)
    Label(tp, textvariable=ag_rc_var).grid(row=5, column=13)
    Button(tp, text='+', command=lambda: change('Arki Gantzos', 'RC', ag_rc_var, '+')).grid(row=5, column=14)

# Edit function for "Billy Houndalas"
def edit_bh():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Billy Houndalas').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Billy Houndalas', 'Matches Played', bh_matches_var, '-')).grid(row=6, column=0)
    Label(tp, textvariable=bh_matches_var).grid(row=6, column=1)
    Button(tp, text='+', command=lambda: change('Billy Houndalas', 'Matches Played', bh_matches_var, '+')).grid(row=6, column=2)

    Button(tp, text='-', command=lambda: change('Billy Houndalas', 'Goals', bh_goals_var, '-')).grid(row=6, column=3)
    Label(tp, textvariable=bh_goals_var).grid(row=6, column=4)
    Button(tp, text='+', command=lambda: change('Billy Houndalas', 'Goals', bh_goals_var, '+')).grid(row=6, column=5)

    Button(tp, text='-', command=lambda: change('Billy Houndalas', 'Assists', bh_assists_var, '-')).grid(row=6, column=6)
    Label(tp, textvariable=bh_assists_var).grid(row=6, column=7)
    Button(tp, text='+', command=lambda: change('Billy Houndalas', 'Assists', bh_assists_var, '+')).grid(row=6, column=8)

    Button(tp, text='-', command=lambda: change('Billy Houndalas', 'YC', bh_yc_var, '-')).grid(row=6, column=9)
    Label(tp, textvariable=bh_yc_var).grid(row=6, column=10)
    Button(tp, text='+', command=lambda: change('Billy Houndalas', 'YC', bh_yc_var, '+')).grid(row=6, column=11)

    Button(tp, text='-', command=lambda: change('Billy Houndalas', 'RC', bh_rc_var, '-')).grid(row=6, column=12)
    Label(tp, textvariable=bh_rc_var).grid(row=6, column=13)
    Button(tp, text='+', command=lambda: change('Billy Houndalas', 'RC', bh_rc_var, '+')).grid(row=6, column=14)

# Edit function for "Hayato Uematsu"
def edit_hu():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Hayato Uematsu').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Hayato Uematsu', 'Matches Played', hu_matches_var, '-')).grid(row=7, column=0)
    Label(tp, textvariable=hu_matches_var).grid(row=7, column=1)
    Button(tp, text='+', command=lambda: change('Hayato Uematsu', 'Matches Played', hu_matches_var, '+')).grid(row=7, column=2)

    Button(tp, text='-', command=lambda: change('Hayato Uematsu', 'Goals', hu_goals_var, '-')).grid(row=7, column=3)
    Label(tp, textvariable=hu_goals_var).grid(row=7, column=4)
    Button(tp, text='+', command=lambda: change('Hayato Uematsu', 'Goals', hu_goals_var, '+')).grid(row=7, column=5)

    Button(tp, text='-', command=lambda: change('Hayato Uematsu', 'Assists', hu_assists_var, '-')).grid(row=7, column=6)
    Label(tp, textvariable=hu_assists_var).grid(row=7, column=7)
    Button(tp, text='+', command=lambda: change('Hayato Uematsu', 'Assists', hu_assists_var, '+')).grid(row=7, column=8)

    Button(tp, text='-', command=lambda: change('Hayato Uematsu', 'YC', hu_yc_var, '-')).grid(row=7, column=9)
    Label(tp, textvariable=hu_yc_var).grid(row=7, column=10)
    Button(tp, text='+', command=lambda: change('Hayato Uematsu', 'YC', hu_yc_var, '+')).grid(row=7, column=11)

    Button(tp, text='-', command=lambda: change('Hayato Uematsu', 'RC', hu_rc_var, '-')).grid(row=7, column=12)
    Label(tp, textvariable=hu_rc_var).grid(row=7, column=13)
    Button(tp, text='+', command=lambda: change('Hayato Uematsu', 'RC', hu_rc_var, '+')).grid(row=7, column=14)

# Edit function for "Mark Boccari"
def edit_mb():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Mark Boccari').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Mark Boccari', 'Matches Played', mb_matches_var, '-')).grid(row=8, column=0)
    Label(tp, textvariable=mb_matches_var).grid(row=8, column=1)
    Button(tp, text='+', command=lambda: change('Mark Boccari', 'Matches Played', mb_matches_var, '+')).grid(row=8, column=2)

    Button(tp, text='-', command=lambda: change('Mark Boccari', 'Goals', mb_goals_var, '-')).grid(row=8, column=3)
    Label(tp, textvariable=mb_goals_var).grid(row=8, column=4)
    Button(tp, text='+', command=lambda: change('Mark Boccari', 'Goals', mb_goals_var, '+')).grid(row=8, column=5)

    Button(tp, text='-', command=lambda: change('Mark Boccari', 'Assists', mb_assists_var, '-')).grid(row=8, column=6)
    Label(tp, textvariable=mb_assists_var).grid(row=8, column=7)
    Button(tp, text='+', command=lambda: change('Mark Boccari', 'Assists', mb_assists_var, '+')).grid(row=8, column=8)

    Button(tp, text='-', command=lambda: change('Mark Boccari', 'YC', mb_yc_var, '-')).grid(row=8, column=9)
    Label(tp, textvariable=mb_yc_var).grid(row=8, column=10)
    Button(tp, text='+', command=lambda: change('Mark Boccari', 'YC', mb_yc_var, '+')).grid(row=8, column=11)

    Button(tp, text='-', command=lambda: change('Mark Boccari', 'RC', mb_rc_var, '-')).grid(row=8, column=12)
    Label(tp, textvariable=mb_rc_var).grid(row=8, column=13)
    Button(tp, text='+', command=lambda: change('Mark Boccari', 'RC', mb_rc_var, '+')).grid(row=8, column=14)

# Edit function for "Oliver Gibson"
def edit_og():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Oliver Gibson').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Oliver Gibson', 'Matches Played', og_matches_var, '-')).grid(row=9, column=0)
    Label(tp, textvariable=og_matches_var).grid(row=9, column=1)
    Button(tp, text='+', command=lambda: change('Oliver Gibson', 'Matches Played', og_matches_var, '+')).grid(row=9, column=2)

    Button(tp, text='-', command=lambda: change('Oliver Gibson', 'Goals', og_goals_var, '-')).grid(row=9, column=3)
    Label(tp, textvariable=og_goals_var).grid(row=9, column=4)
    Button(tp, text='+', command=lambda: change('Oliver Gibson', 'Goals', og_goals_var, '+')).grid(row=9, column=5)

    Button(tp, text='-', command=lambda: change('Oliver Gibson', 'Assists', og_assists_var, '-')).grid(row=9, column=6)
    Label(tp, textvariable=og_assists_var).grid(row=9, column=7)
    Button(tp, text='+', command=lambda: change('Oliver Gibson', 'Assists', og_assists_var, '+')).grid(row=9, column=8)

    Button(tp, text='-', command=lambda: change('Oliver Gibson', 'YC', og_yc_var, '-')).grid(row=9, column=9)
    Label(tp, textvariable=og_yc_var).grid(row=9, column=10)
    Button(tp, text='+', command=lambda: change('Oliver Gibson', 'YC', og_yc_var, '+')).grid(row=9, column=11)

    Button(tp, text='-', command=lambda: change('Oliver Gibson', 'RC', og_rc_var, '-')).grid(row=9, column=12)
    Label(tp, textvariable=og_rc_var).grid(row=9, column=13)
    Button(tp, text='+', command=lambda: change('Oliver Gibson', 'RC', og_rc_var, '+')).grid(row=9, column=14)

# Edit function for "Zaid Khaleqi"
def edit_zk():
    # Creating a new window for data editing
    tp = Toplevel(root)
    # Packing a label to display name
    Label(tp, text='Zaid Khaleqi').grid(row=0, column=0, columnspan=15)
    # Edit buttons and value label for data editing
    Button(tp, text='-', command=lambda: change('Zaid Khaleqi', 'Matches Played', zk_matches_var, '-')).grid(row=10, column=0)
    Label(tp, textvariable=zk_matches_var).grid(row=10, column=1)
    Button(tp, text='+', command=lambda: change('Zaid Khaleqi', 'Matches Played', zk_matches_var, '+')).grid(row=10, column=2)

    Button(tp, text='-', command=lambda: change('Zaid Khaleqi', 'Goals', zk_goals_var, '-')).grid(row=10, column=3)
    Label(tp, textvariable=zk_goals_var).grid(row=10, column=4)
    Button(tp, text='+', command=lambda: change('Zaid Khaleqi', 'Goals', zk_goals_var, '+')).grid(row=10, column=5)

    Button(tp, text='-', command=lambda: change('Zaid Khaleqi', 'Assists', zk_assists_var, '-')).grid(row=10, column=6)
    Label(tp, textvariable=zk_assists_var).grid(row=10, column=7)
    Button(tp, text='+', command=lambda: change('Zaid Khaleqi', 'Assists', zk_assists_var, '+')).grid(row=10, column=8)

    Button(tp, text='-', command=lambda: change('Zaid Khaleqi', 'YC', zk_yc_var, '-')).grid(row=10, column=9)
    Label(tp, textvariable=zk_yc_var).grid(row=10, column=10)
    Button(tp, text='+', command=lambda: change('Zaid Khaleqi', 'YC', zk_yc_var, '+')).grid(row=10, column=11)

    Button(tp, text='-', command=lambda: change('Zaid Khaleqi', 'RC', zk_rc_var, '-')).grid(row=10, column=12)
    Label(tp, textvariable=zk_rc_var).grid(row=10, column=13)
    Button(tp, text='+', command=lambda: change('Zaid Khaleqi', 'RC', zk_rc_var, '+')).grid(row=9, column=14)

# initiating Tk class which also creates a window
root = Tk()

# Labels
Label(text="Chelsea FC Player Statistics", font=('bold', 15), fg="blue",).grid(row=0, column=1)

# Player Names Labels
Label(text="Player Names", font='Helvetica 13 bold').grid(columnspan=1, row=1, column=1)
Label(text="Daniel Keelagher").grid(columnspan=1, row=2, column=1)
Label(text="Joseph Keelagher").grid(columnspan=1, row=3, column=1)
Label(text="Benjamin Miller").grid(columnspan=1, row=4, column=1)
Label(text="Jordan Terlato").grid(columnspan=1, row=5, column=1)
Label(text="Arki Gantzos").grid(columnspan=1, row=6, column=1)
Label(text="Billy Houndalas").grid(columnspan=1, row=7, column=1)
Label(text="Hayato Uematsu").grid(columnspan=1, row=8, column=1)
Label(text="Mark Boccari").grid(columnspan=1, row=9, column=1)
Label(text="Oliver Gibson").grid(columnspan=1, row=10, column=1)
Label(text="Zaid Khaleqi").grid(columnspan=1, row=11, column=1)

# Matches Played Labels
Label(text="Matches Played", font='Helvetica 13 bold').grid(columnspan=1, row=1, column=2)
# setting up an IntVar for matches
dk_matches_var = IntVar()
Label(textvariable=dk_matches_var).grid(columnspan=1, row=2, column=2)
jk_matches_var = IntVar()
Label(textvariable=jk_matches_var).grid(columnspan=1, row=3, column=2)
bm_matches_var = IntVar()
Label(textvariable=bm_matches_var).grid(columnspan=1, row=4, column=2)
jt_matches_var = IntVar()
Label(textvariable=jt_matches_var).grid(columnspan=1, row=5, column=2)
ag_matches_var = IntVar()
Label(textvariable=ag_matches_var).grid(columnspan=1, row=6, column=2)
bh_matches_var = IntVar()
Label(textvariable=bh_matches_var).grid(columnspan=1, row=7, column=2)
hu_matches_var = IntVar()
Label(textvariable=hu_matches_var).grid(columnspan=1, row=8, column=2)
mb_matches_var = IntVar()
Label(textvariable=mb_matches_var).grid(columnspan=1, row=9, column=2)
og_matches_var = IntVar()
Label(textvariable=og_matches_var).grid(columnspan=1, row=10, column=2)
zk_matches_var = IntVar()
Label(textvariable=zk_matches_var).grid(columnspan=1, row=11, column=2)


# Goals Labels
Label(text="Goals", font='Helvetica 13 bold').grid(row=1, column=3)
# setting up an IntVar for goals
dk_goals_var = IntVar()
Label(textvariable=dk_goals_var).grid(columnspan=1, row=2, column=3)
jk_goals_var = IntVar()
Label(textvariable=jk_goals_var).grid(columnspan=1, row=3, column=3)
bm_goals_var = IntVar()
Label(textvariable=bm_goals_var).grid(columnspan=1, row=4, column=3)
jt_goals_var = IntVar()
Label(textvariable=jt_goals_var).grid(columnspan=1, row=5, column=3)
ag_goals_var = IntVar()
Label(textvariable=ag_goals_var).grid(columnspan=1, row=6, column=3)
bh_goals_var = IntVar()
Label(textvariable=bh_goals_var).grid(columnspan=1, row=7, column=3)
hu_goals_var = IntVar()
Label(textvariable=hu_goals_var).grid(columnspan=1, row=8, column=3)
mb_goals_var = IntVar()
Label(textvariable=mb_goals_var).grid(columnspan=1, row=9, column=3)
og_goals_var = IntVar()
Label(textvariable=og_goals_var).grid(columnspan=1, row=10, column=3)
zk_goals_var = IntVar()
Label(textvariable=zk_goals_var).grid(columnspan=1, row=11, column=3)

# Assists Labels
Label(text="Assists", font='Helvetica 13 bold').grid(columnspan=1, row=1, column=4)
# setting up an IntVar for assists
dk_assists_var = IntVar()
Label(textvariable=dk_assists_var).grid(columnspan=1, row=2, column=4)
jk_assists_var = IntVar()
Label(textvariable=jk_assists_var).grid(columnspan=1, row=3, column=4)
bm_assists_var = IntVar()
Label(textvariable=bm_assists_var).grid(columnspan=1, row=4, column=4)
jt_assists_var = IntVar()
Label(textvariable=jt_assists_var).grid(columnspan=1, row=5, column=4)
ag_assists_var = IntVar()
Label(textvariable=ag_assists_var).grid(columnspan=1, row=6, column=4)
bh_assists_var = IntVar()
Label(textvariable=bh_assists_var).grid(columnspan=1, row=7, column=4)
hu_assists_var = IntVar()
Label(textvariable=hu_assists_var).grid(columnspan=1, row=8, column=4)
mb_assists_var = IntVar()
Label(textvariable=mb_assists_var).grid(columnspan=1, row=9, column=4)
og_assists_var = IntVar()
Label(textvariable=og_assists_var).grid(columnspan=1, row=10, column=4)
zk_assists_var = IntVar()
Label(textvariable=zk_assists_var).grid(columnspan=1, row=11, column=4)

# YellowCards Labels
Label(text="YC", font='Helvetica 13 bold').grid(columnspan=1, row=1, column=5)
# setting up an IntVar for yellow cards
dk_yc_var = IntVar()
Label(textvariable=dk_yc_var).grid(columnspan=1, row=2, column=5)
jk_yc_var = IntVar()
Label(textvariable=jk_yc_var).grid(columnspan=1, row=3, column=5)
bm_yc_var = IntVar()
Label(textvariable=bm_yc_var).grid(columnspan=1, row=4, column=5)
jt_yc_var = IntVar()
Label(textvariable=jt_yc_var).grid(columnspan=1, row=5, column=5)
ag_yc_var = IntVar()
Label(textvariable=ag_yc_var).grid(columnspan=1, row=6, column=5)
bh_yc_var = IntVar()
Label(textvariable=bh_yc_var).grid(columnspan=1, row=7, column=5)
hu_yc_var = IntVar()
Label(textvariable=hu_yc_var).grid(columnspan=1, row=8, column=5)
mb_yc_var = IntVar()
Label(textvariable=mb_yc_var).grid(columnspan=1, row=9, column=5)
og_yc_var = IntVar()
Label(textvariable=og_yc_var).grid(columnspan=1, row=10, column=5)
zk_yc_var = IntVar()
Label(textvariable=zk_yc_var).grid(columnspan=1, row=11, column=5)


# RedCards Labels
Label(text="RC", font='Helvetica 13 bold').grid(columnspan=1, row=1, column=6)
# setting up an IntVar for red cards
dk_rc_var = IntVar()
Label(textvariable=dk_rc_var).grid(columnspan=1, row=2, column=6)
jk_rc_var = IntVar()
Label(textvariable=jk_rc_var).grid(columnspan=1, row=3, column=6)
bm_rc_var = IntVar()
Label(textvariable=bm_rc_var).grid(columnspan=1, row=4, column=6)
jt_rc_var = IntVar()
Label(textvariable=jt_rc_var).grid(columnspan=1, row=5, column=6)
ag_rc_var = IntVar()
Label(textvariable=ag_rc_var).grid(columnspan=1, row=6, column=6)
bh_rc_var = IntVar()
Label(textvariable=bh_rc_var).grid(columnspan=1, row=7, column=6)
hu_rc_var = IntVar()
Label(textvariable=hu_rc_var).grid(columnspan=1, row=8, column=6)
mb_rc_var = IntVar()
Label(textvariable=mb_rc_var).grid(columnspan=1, row=9, column=6)
og_rc_var = IntVar()
Label(textvariable=og_rc_var).grid(columnspan=1, row=10, column=6)
zk_rc_var = IntVar()
Label(textvariable=zk_rc_var).grid(columnspan=1, row=11, column=6)

# Buttons
Button(root, text="Edit", command=edit_dk).grid(columnspan=1, row=2, column=7)
Button(root, text="Edit", command=edit_jk).grid(columnspan=1, row=3, column=7)
Button(root, text="Edit", command=edit_bm).grid(columnspan=1, row=4, column=7)
Button(root, text="Edit", command=edit_jt).grid(columnspan=1, row=5, column=7)
Button(root, text="Edit", command=edit_ag).grid(columnspan=1, row=6, column=7)
Button(root, text="Edit", command=edit_bh).grid(columnspan=1, row=7, column=7)
Button(root, text="Edit", command=edit_hu).grid(columnspan=1, row=8, column=7)
Button(root, text="Edit", command=edit_mb).grid(columnspan=1, row=9, column=7)
Button(root, text="Edit", command=edit_og).grid(columnspan=1, row=10, column=7)
Button(root, text="Edit", command=edit_zk).grid(columnspan=1, row=11, column=7)

# Main loop of tkinter
root.mainloop()

【问题讨论】:

  • 由于所有玩家都有相同的信息集,您可以使用单个通用函数来编辑信息,而不是为每个玩家单独使用函数。
  • 请尝试将此代码缩减为minimal reproducible example。那里有很多与问题没有直接关系的代码。
  • 您可以使用tkinter.simpledialog.askstring()获取新玩家名称。
  • @acw1668 好吧,我实际上给了他 3 个选项(包括这个,因为他显然不理解另一个)关于如何在另一个答案 here 中更好地编辑玩家,所以我会说他缺乏能够做到这一点的基础知识(在当前问题中),所以最好的办法是观看关于 tkinter 的教程,实际上是基本的 python 和顺便说一句,我会说,从我在该答案中给出的编辑选项中它是制作add new player 函数也很容易
  • @Matiiss 这只是针对学校评估的任务。所以我想知道如何才能添加新的播放器功能。我知道我不擅长编码,我只是想要一些帮助。

标签: python tkinter


【解决方案1】:

我修改了你的代码:

  • 使用单个通用函数来编辑玩家统计数据,而不是为每个玩家创建函数
  • 将这些 IntVar 移动到 stored_data 以替换 int
  • 添加Add New Player函数
import tkinter as tk
from tkinter.simpledialog import askstring

KEYS = ("Matches Played", "Goals", "Assists", "YC", "RC")

# create a player and save into "stored_data"
def create_player(name, matches=0, goals=0, assists=0, yc=0, rc=0):
    statistics = {}
    for key, val in zip(KEYS, (matches, goals, assists, yc, rc)):
        statistics[key] = tk.IntVar(value=val)
    stored_data[name] = statistics


# a generic function to edit player statistics
def edit_player(parent, name):
    def change(var, delta):
        value = var.get() + delta
        if value >= 0:
            var.set(value)

    def create_form(parent, key, var):
        f = tk.Frame(parent, bd=1, relief="sunken")
        f.pack(side="left")
        tk.Label(f, text=key, width=12, fg="white", bg="blue").grid(row=0, column=0, columnspan=3)
        tk.Button(f, text="-", command=lambda: change(var, -1)).grid(row=1, column=0, sticky="ew")
        tk.Label(f, textvariable=var, width=3).grid(row=1, column=1)
        tk.Button(f, text="+", command=lambda: change(var, +1)).grid(row=1, column=2, sticky="ew")

    tp = tk.Toplevel(parent)
    tp.title("Edit Player Statistics")
    tk.Label(tp, text=name, font="Helvetica 14 bold").pack()
    frame = tk.Frame(tp)
    frame.pack()
    statistics = stored_data[name]
    for col, (key, var) in enumerate(statistics.items(), 1):
        create_form(frame, key, var)
    # make this toplevel like a modal dialog
    tp.grab_set()
    tp.wait_window()


# show player statistics
def add_player_row(parent, row, name):
    tk.Label(parent, text=name, anchor="w").grid(row=row, column=0, sticky="ew")
    statistics = stored_data[name]
    for col, key in enumerate(KEYS, 1):
        tk.Label(parent, textvariable=statistics[key]).grid(row=row, column=col)
    tk.Button(parent, text="Edit", command=lambda: edit_player(root, name)).grid(row=row, column=col+1)


# ask for new player name and create the player
def new_player(parent):
    # get player name
    name = askstring("New Player", "Player Name")
    if name:
        create_player(name)
        add_player_row(parent, len(stored_data), name)


# main block

root = tk.Tk()

stored_data = {}
# create dummy players, better to load from external source
create_player('Daniel Keelagher', 10, 4, 4, 0, 0)
create_player('Joseph Keelagher', 10, 2, 2, 1, 0)
create_player('Benjamin Miller', 10, 0, 0, 1, 0)
create_player('Joran Terlato', 8, 1, 1, 3, 1)
create_player('Arki Gantzos', 9, 3, 2, 0, 0)
create_player('Billy Houndalas', 10, 0, 0, 0, 0)
create_player('Hayato Uematsu', 9, 2, 3, 0, 0)
create_player('Mark Boccari', 10, 1, 1, 2, 0)
create_player('Oliver Gibson', 7, 1, 2, 0, 0)
create_player('Zaid Khaleqi', 9, 2, 0, 0, 0)

# Application title
tk.Label(text="Chelsea FC Player Statistics", font=(None, 15, 'bold'), fg="blue",).pack(pady=5)

# a frame for showing player statistics
table_frame = tk.Frame(root)
table_frame.pack()

# table headings
font="Helvetica 13 bold"
tk.Label(table_frame, text="Player Name", font=font, anchor="w", width=20, fg="white", bg="blue").grid(row=0, column=0, sticky="ew")
for col, key in enumerate(KEYS, 1):
    tk.Label(table_frame, text=key, font=font, width=12, fg="white", bg="blue").grid(row=0, column=col)
tk.Label(table_frame, font=font, anchor="w", fg="white", bg="blue").grid(row=0, column=col+1, sticky="ew")

# player statistics table
for row, name in enumerate(stored_data, 1):
    add_player_row(table_frame, row, name)

# add new player button
tk.Button(root, text="Add New Player", command=lambda: new_player(table_frame)).pack(pady=5)
# Main loop of tkinter
root.mainloop()

最好有从外部来源加载和保存玩家统计数据的功能。下面是使用 JSON 文件的示例:

import json

DATAFILE = "player_statistics.json"

def load_player_statistics():
    with open(DATAFILE) as f:
        data = json.load(f)
    for name in data:
        #stored_data[name] = {key:tk.IntVar(value=val) for key, val in data[name].items()}
        create_player(name, *data[name].values())

def save_player_statistics():
    data = {}
    for name, statistics in stored_data.items():
        data[name] = {key:var.get() for key, var in statistics.items()}
    with open(DATAFILE, "w") as f:
        json.dump(data, f)

您也可以使用sqlite3 等简单的数据库。

【讨论】:

  • 有没有办法添加一个登录系统,你可以在其中注册一个新的团队,然后将球员添加到一个新的数据库中。然后在退出时保存并在重新登录时恢复。@acw1668
  • @Volted 你提出了额外的要求,最好再创建一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2020-09-25
相关资源
最近更新 更多