python-3.x - 我可以压缩此代码以根据变量制作多个标签和条目吗?

标签 python-3.x tkinter

我创建了一个比例来选择有多少玩家,然后按一个按钮,它会将您发送到输入每个玩家姓名的页面,并将其放入列表中以供以后使用。

问题是,它占用了大量空间,而且我觉得肯定有一种方法可以压缩它。

def playerset():
    title.configure(text="Set amount of players:", font=("Arial", 20))
    eir.grid_remove()
    pit.grid_remove()
    playerbut.grid_remove()
    player = IntVar()
    playerscale = Scale(window, from_=1, to=12, width=30, length=300, orient=HORIZONTAL, variable=player)
    playerscale.grid(column=0, row=1)

    def playernext():
        players=int(player.get())
        title.configure(text="Name each player:", font=("Arial", 20))
        playernextbut.grid_forget()
        playerscale.grid_forget()
        if (players > 0):
            player1dis = Label(window, text="Player 1", font=("Arial", 15))
            player1dis.grid(column=0, row=1)
            player1 = StringVar()
            p1 = Entry(window, width=20, textvariable=player1, font=("Arial", 15))
            p1.grid(column=1, row=1)
            if (players > 1):
                player2dis = Label(window, text="Player 2", font=("Arial", 15))
                player2dis.grid(column=0, row=2)
                player2 = StringVar()
                p2 = Entry(window, width=20, textvariable=player2, font=("Arial", 15))
                p2.grid(column=1, row=2)
                if (players > 2):
                    player3dis = Label(window, text="Player 3", font=("Arial", 15))
                    player3dis.grid(column=0, row=3)
                    player3 = StringVar()
                    p3 = Entry(window, width=20, textvariable=player3, font=("Arial", 15))
                    p3.grid(column=1, row=3)
                    if (players > 3):
                        player4dis = Label(window, text="Player 4", font=("Arial", 15))
                        player4dis.grid(column=0, row=4)
                        player4 = StringVar()
                        p4 = Entry(window, width=20, textvariable=player4, font=("Arial", 15))
                        p4.grid(column=1, row=4)
                        if (players > 4):
                            player5dis = Label(window, text="Player 5", font=("Arial", 15))
                            player5dis.grid(column=0, row=5)
                            player5 = StringVar()
                            p5 = Entry(window, width=20, textvariable=player5, font=("Arial", 15))
                            p5.grid(column=1, row=5)
                            if (players > 5):
                                player6dis = Label(window, text="Player 6", font=("Arial", 15))
                                player6dis.grid(column=0, row=6)
                                player6 = StringVar()
                                p6 = Entry(window, width=20, textvariable=player6, font=("Arial", 15))
                                p6.grid(column=1, row=6)
                                if (players > 6):
                                    player7dis = Label(window, text="Player 7", font=("Arial", 15))
                                    player7dis.grid(column=0, row=7)
                                    player7 = StringVar()
                                    p7 = Entry(window, width=20, textvariable=player7, font=("Arial", 15))
                                    p7.grid(column=1, row=7)
                                    if (players > 7):
                                        player8dis = Label(window, text="Player 8", font=("Arial", 15))
                                        player8dis.grid(column=0, row=8)
                                        player8 = StringVar()
                                        p8 = Entry(window, width=20, textvariable=player8, font=("Arial", 15))
                                        p8.grid(column=1, row=8)
                                        if (players > 8):
                                            player9dis = Label(window, text="Player 9", font=("Arial", 15))
                                            player9dis.grid(column=0, row=9)
                                            player9 = StringVar()
                                            p9 = Entry(window, width=20, textvariable=player9, font=("Arial", 15))
                                            p9.grid(column=1, row=9)
                                            if (players > 9):
                                                player10dis = Label(window, text="Player 10", font=("Arial", 15))
                                                player10dis.grid(column=0, row=10)
                                                player10 = StringVar()
                                                p10 = Entry(window, width=20, textvariable=player10, font=("Arial", 15))
                                                p10.grid(column=1, row=10)
                                                if (players > 10):
                                                    player11dis = Label(window, text="Player 11", font=("Arial", 15))
                                                    player11dis.grid(column=0, row=11)
                                                    player11 = StringVar()
                                                    p11 = Entry(window, width=20, textvariable=player11, font=("Arial", 15))
                                                    p11.grid(column=1, row=11)
                                                    if (players > 11):
                                                        player12dis = Label(window, text="Player 12", font=("Arial", 15))
                                                        player12dis.grid(column=0, row=12)
                                                        player12 = StringVar()
                                                        p12 = Entry(window, width=20, textvariable=player12, font=("Arial", 15))
                                                        p12.grid(column=1, row=12)

        def playersubmit():
            title.configure(text="-----Welcome to the Rottot Games Interface!-----", font=("Arial", 30))
            eir.grid()
            pit.grid()
            playerbut.grid()
            playersubmitbut.grid_forget()
            if (players > 0):
                p1name=str(player1.get())
                plist = [p1name]
                player1dis.grid_forget()
                p1.grid_forget()
                if (players > 1):
                    p2name=str(player2.get())
                    plist = [p1name, p2name]
                    player2dis.grid_forget()
                    p2.grid_forget()
                    if (players > 2):
                        p3name=str(player3.get())
                        plist = [p1name, p2name, p3name]
                        player3dis.grid_forget()
                        p3.grid_forget()
                        if (players > 3):
                            p4name=str(player4.get())
                            plist = [p1name, p2name, p3name, p4name]
                            player4dis.grid_forget()
                            p4.grid_forget()
                            if (players > 4):
                                p5name=str(player5.get())
                                plist = [p1name, p2name, p3name, p4name, p5name]
                                player5dis.grid_forget()
                                p5.grid_forget()
                                if (players > 5):
                                    p6name=str(player6.get())
                                    plist = [p1name, p2name, p3name, p4name, p5name, p6name]
                                    player6dis.grid_forget()
                                    p6.grid_forget()
                                    if (players > 6):
                                        p7name=str(player7.get())
                                        plist = [p1name, p2name, p3name, p4name, p5name, p6name, p7name]
                                        player7dis.grid_forget()
                                        p7.grid_forget()
                                        if (players > 7):
                                            p8name=str(player8.get())
                                            plist = [p1name, p2name, p3name, p4name, p5name, p6name, p7name, p8name]
                                            player8dis.grid_forget()
                                            p8.grid_forget()
                                            if (players > 8):
                                                p9name=str(player9.get())
                                                plist = [p1name, p2name, p3name, p4name, p5name, p6name, p7name, p8name, p9name]
                                                player9dis.grid_forget()
                                                p9.grid_forget()
                                                if (players > 9):
                                                    p10name=str(player10.get())
                                                    plist = [p1name, p2name, p3name, p4name, p5name, p6name, p7name, p8name, p9name, p10name]
                                                    player10dis.grid_forget()
                                                    p10.grid_forget()
                                                    if (players > 10):
                                                        p11name=str(player11.get())
                                                        plist = [p1name, p2name, p3name, p4name, p5name, p6name, p7name, p8name, p9name, p10name, p11name]
                                                        player11dis.grid_forget()
                                                        p11.grid_forget()
                                                        if (players > 11):
                                                            p12name=str(player12.get())
                                                            plist = [p1name, p2name, p3name, p4name, p5name, p6name, p7name, p8name, p9name, p10name, p11name, p12name]
                                                            player12dis.grid_forget()
                                                            p12.grid_forget()

            import pickle
            with open("Players.txt", "wb") as playersave:
                pickle.dump(plist, playersave)

        playersubmitbut = Button(window, text="Submit", command=playersubmit, font=("Arial", 15), bg="green", fg="black")
        playersubmitbut.grid(column=4, row=0)

    playernextbut = Button(window, text="Next", command=playernext, font=("Arial", 20), bg="green", fg="black")
    playernextbut.grid(column=4, row=1)

playerbut = Button(window, text="Set Players", command=playerset, font=("Arial", 20), bg="gray", fg="black")
playerbut.grid(column=1, row=2)

对所有代码表示歉意,谢谢!

最佳答案

无需过多了解 tkinter 细节,看起来这可以通过循环和字典来完成。

更强大的方法可能是使用 Player 的类,它将存储所有相关信息。

下面的示例包含玩家名称和playerdis 标签,但不包含其他任何内容。您可以将其扩展以包含您需要跟踪的任何信息/小部件。

def playerset():

    ### CONFIG STUFF HERE ###

    def playernext():
        players=int(player.get())
        ### CONFIG STUFF ### 
        player_info = {} # dictionary of dictionaries to store references to stringvars, pidsgrids etc for each player id
        for player_index in range(players):
            playerdis = Label(window, text="Player "+str(player_index)) # change formatting as necessary
            player_info[player_index] = {}  # make an empty subdictionary for this player
            player_info[player_index]['label'] = playerdis  # store reference to the label
            player_info[player_index]['name'] = StringVar() # store reference to the stringvar
            name_entry = Entry(window, width=20, textvariable= player_info[player_index]['name'])

            ### MORE CONFIG STUFF ###   
    return player_info  # return the populated dictionary of references for later use

然后当您需要使用此信息时:

def playersubmit(player_info):
            ### CONFIG STUFF ###
            playersubmitbut.grid_forget()
            for player_index in player_info.keys():
                pname=str(player_info[player_index]['name'].get()) # get the name from the StringVar reference
                plist = [pname]
                player_info[player_index]['label'].grid_forget()  # access the label and forget
                ### CONFIG STUFF ###

关于python-3.x - 我可以压缩此代码以根据变量制作多个标签和条目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62172537/

相关文章:

Python Tkinter 绑定(bind)子部件

python - 二维数组中的 Tkinter 按钮绑定(bind)到相同的命令

django - 删除字符串列表周围的双引号

python - 属性错误 : 'numpy.ndarray' object has no attribute 'get_shape' ?

python - 在字符串上使用 .translate() 去除数字 [Python 3]

python - Tkinter 可以部分点击吗? (仅限 Windows)

python - 在 Tkinter 中导入图像作为背景

python - 需要替换几个文本文件中每一行的第一个单词

linux - 无法在 Amazon Linux 2 机器上安装 libsasl2-devel

python - python 图像错误