So the problem I am currently having is that I want to update the second option menu, based on what the user selected in the first. I think I have to use a lambda function here to make it so that the frame updates or something, but I am unsure of how exactly to do this. Here is my code so far:

from tkinter import *
import time
class CustomerEntryForm(Frame):
    def __init__(self):

        Frame.__init__(self)
        self.master.title("Customer Entry form:")
        self.pack()

        execute = True
        thirtyMonthList = [4,6,9,11]
        thirtyOneMonthList = [1,2,6,7,8,10,12]
        monthList = []
        dayList = []

        for i in range(1,13):
            monthList.append(i)

        initialMonth = IntVar(self)
        initialMonth.set(monthList[0])
        initialDay = IntVar(self)

        def resetDayOptionMenu():
            for i in range(1,len(dayList)+1):
                dayList.remove(i)

        def setDayList():
            resetDayOptionMenu()
            if initialMonth.get() == 2:
                for i in range(1, 29):
                    dayList.append(i)
                    initialDay.set(dayList[0])
            elif initialMonth.get() in thirtyMonthList:
                for i in range(1, 31):
                    dayList.append(i)
                    initialDay.set(dayList[0])
            elif initialMonth.get() in thirtyOneMonthList:
                for i in range(1, 32):
                    dayList.append(i)
                    initialDay.set(dayList[0])


        self.om2 = OptionMenu(self, initialMonth, *monthList, command = setDayList())
        self.om2.grid(row=0)
        self.om = OptionMenu(self, initialDay, *dayList)
        self.om.grid(row=1)



root = CustomerEntryForm()
root.mainloop()

I appreciate any help. Thanks.

有帮助吗?

解决方案

It would be easier to remove and then just add the second OptionMenu field after the month changes.

Like this:

    ...

    thirtyMonthList = [4,6,9,11]

    initialMonth = IntVar(self)
    initialMonth.set(1)
    initialDay = IntVar(self)
    initialDay.set(1)

    def removeDayOptionMenu():
        self.om.destroy()

    def setDayList(event):
        removeDayOptionMenu()
        if initialMonth.get() == 2:
            addDayOptionMenu(range(1,29))
        elif initialMonth.get() in thirtyMonthList:
            addDayOptionMenu(range(1,31))
        else:
            addDayOptionMenu(range(1,32))

    def addDayOptionMenu(dayList):
        self.om = OptionMenu(self, initialDay, *dayList)
        self.om.grid(row=1)

    self.om2 = OptionMenu(self, initialMonth, *range(1,12), command = setDayList)
    self.om2.grid(row=0)
    self.om = OptionMenu(self, initialDay, *range(1,32))
    self.om.grid(row=1)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top