簡體   English   中英

Tkinter 在多個標簽中更改編號

[英]Tkinter change number in multiple labels

我正在制作一個程序,讓用戶輸入花卉類型,它將創建一個新行,其中包含行號、名稱和死亡前剩余的天數。 目前用戶界面有點混亂,代碼可以改進很多,但這不是重點。 我想知道我將如何制作多個新標簽,我可以通過單擊按鈕更改剩余天數。

到目前為止,這是我的代碼:

它運行正常,但只能更改最新制作的行,這是因為每次制作時,最后一行都無法再編輯,這就是我想要更改的內容。

from tkinter import *

#Flower Types

flowers_days = {
    "peony": 1,
    "rose": 2,
    "daffodil": 3,
    "dandelion": 4,
    "lavender": 5
}
day_change = {}

#Variables
day = 1
days_left = 5
row_Num = 0
name = ""

#Commands


def new_flower():
    #make a new line with the new flower
    global row_Num
    global days_left
    global name
    global new_row

    row_Num += 1

    name = str(clicked.get())
    print("Test:" + name)

    days_left = flowers_days[clicked.get()]

    day_change[days_left] = int(row_Num)

    new_row = Label(main_Frame, text=str(row_Num)+"    "+name+"    " + str(days_left))
    new_row.pack()

    return new_row


def next_day():
    global days_left
    global name
    days_left -= 1
    new_row.config(text=str(row_Num)+"    "+name+"    " + str(days_left))


root = Tk()

new_row = Label()

clicked = StringVar()
clicked.set("No option Selected")

#FLOWER TYPE
flower_Type_Frame = LabelFrame(root, text="New Flowers", padx=5, pady=5)
flower_Type_Frame.grid(row=0, rowspan=4, column=0, columnspan=2, padx=10, pady=10)
flower_Type_Label = Label(flower_Type_Frame, text="Flower Type:")
flower_Type_Label.grid(row=0, column=0, columnspan=2, padx=5, pady=5)

flower_Type_Drop = OptionMenu(flower_Type_Frame, clicked, """
No option Selected
""", "peony", "rose", "daffodil", "dandelion", "lavender")
flower_Type_Drop.grid(row=1, column=0, columnspan=2, pady=5, padx=5)

flower_Type_Submit = Button(flower_Type_Frame, text="Submit", padx=10, pady=10, command=new_flower)
flower_Type_Submit.grid(row=2, column=0, columnspan=2, rowspan=2)


#Empty slot
space_Frame = LabelFrame(root, text="Empty", padx=5, pady=5)
space_Frame.grid(row=0, rowspan=4, column=3, columnspan=2, padx=10, pady=10)
space_Fill = Label(space_Frame, text="Space          ").grid(row=0, column=0)


#Day Pass
day_Pass_Frame = LabelFrame(root, text="Day Pass", padx=5, pady=5)
day_Pass_Frame.grid(row=0, rowspan=2, column=6, columnspan=4, padx=10, pady=10)
day_Pass = Button(day_Pass_Frame, text="Next Day", padx=10, pady=10, command=next_day)
day_Pass.grid(row=0, rowspan=2, column=3, columnspan=2)


#Row Delete


#Main stuff
main_Frame = LabelFrame(root, text="Flowers In Stock", padx=5, pady=5)
main_Frame.grid(row=5, column=0, columnspan=7, padx=10, pady=10)
header = Label(main_Frame, text="   Row #   /   Flower Type   /   Days Remaining   ", padx=5, pady=5)
header.pack(padx=5, pady=5)


root.mainloop()

排序完成后,我還計划讓它有一個刪除行按鈕,因此如果可能的話,行號也需要能夠更改。

謝謝你的幫助。

您只保留一個“days_left”信息(在全局變量中),但您需要為每朵花保留一個。 因此,您的主要數據結構需要是花列表,並且您應該刪除 days_left、name、new_row 的“全局”語句,因為這些信息需要對每朵花都是特定的。

將此添加到全局 scope (就在 new_flower() 定義之前):

# List of [name, days_left, label], one per flower
flowers = []

在 new_flower() function 中,使用 'append' 將新創建的花添加到列表中:

new_row = Label(main_Frame, text=str(row_Num)+"    "+name+"    " + str(days_left))
new_row.pack()
flowers.append([name, days_left, new_row])

next_day function 應該如下所示:

def next_day():
    for i, f in enumerate(flowers):
        # f is a 3-element list [name, days_left, label]
        f[1] -= 1
        name, days_left, label = f
        label.config(text=str(i+1)+"    "+name+"    " + str(days_left))

'enumerate' 調用遍歷列表,返回列表中的當前索引(在 'i' 中)和當前列表項(在 'f' 中)。 索引為您提供行號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM