Дублирование опций в OptionMenu из SQL-запроса - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь создать tk.OptionMenu, в котором результаты поискового запроса SQL хранятся в виде параметров в его меню, однако при переходе пользователя на страницу появляется дополнительный набор параметров, идентичный первому.

Я создал пример кода:

Attendance.grid(row=0,column=0,sticky="nsew")
Menu=tk.Frame(root)
Menu.grid(row=0,column=0,sticky="nsew")
EventList=[]
# Connect MySQL
mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="#####",
    database="scoutsdatabase"
)
#Outputs Connection Object
print(mydb)
mycursor = mydb.cursor()
def CheckAttendance():
    return
#Define Trace Var
AttendanceEvent = tk.StringVar()
AttendanceEvent.trace("w", CheckAttendance)

def AttendanceRaiseFrame():
    mycursor.execute("SELECT eventname FROM events")
    myresults = mycursor.fetchall()
    if len(myresults)==0:
        tk.messagebox.showinfo("No Events","You Have Not Created Any Events to Take Attendance From.")
        return
    for i in myresults:
        EventList.append(i)

    AttendanceOptionMenu = tk.OptionMenu(Attendance, AttendanceEvent, *EventList)
    AttendanceOptionMenu.grid(row=2, column=2)
    Attendance.tkraise()
    return
def Back():
    Menu.tkraise()

StartButton=tk.Button(Menu,text="Start",command=AttendanceRaiseFrame)
StartButton.grid(row=1,column=0)
BackButton=tk.Button(Attendance,text="Back",command=Back)
BackButton.grid(row=2,column=0)
Menu.tkraise()
root.mainloop()

Вот пример того, что происходит.

Пользователь запускает программу и встречается с этим интерфейсом:

1

Пользователь нажимает кнопку «Пуск», перемещает кадр:

2

См. Параметры, доступные вМеню параметров.

3

Пользователь нажимает «Назад», возвращается к исходному кадру

4

Пользователь нажимает кнопку «Пуск», см. Опции, доступные в меню параметров

5

Далее, если они являются дополнительными или удаляются из имени событияВ колонке я хотел бы, чтобы изменение отображалось в меню параметров.

Например, я удаляю «Кемпинг».В моем меню опций у меня останутся «Узловая привязка», «Боулдер-трип», «Трек-трек».

Если вам нужно просмотреть мою базу данных или таблицы, просто спросите.Заранее спасибо!

PS: Не уверен, почему {} заключает в себе каждый вариант, кроме первого.Это не преднамеренно.

1 Ответ

2 голосов
/ 16 марта 2019

Вы добавляете результаты запроса к EventList, но EventList уже содержит результаты предыдущего выполнения запроса.

Простое решение - очистить EventList перед добавлением нового запроса.результаты.

EventList.clear()
for i in myresults:
    EventList.append(i)

Фактически, и, как заметил Мартино, коренная причина проблемы заключается в том, что EventList является глобальной переменной, то есть определяется в коде верхнего уровня.Он используется только внутри функции AttendanceRaiseFrame, поэтому лучшим решением является перемещение объявления верхнего уровня EventList = [] внутрь функции:

def AttendanceRaiseFrame():
    mycursor.execute("SELECT eventname FROM events")
    myresults = mycursor.fetchall()
    # cursor.fetchall returns an empty list if no rows are
    # found, so check if myresults is falsey
    if not myresults:
        tk.messagebox.showinfo("No Events","You Have Not Created Any Events to Take Attendance From.")
        return
    EventList = [i for i in myresults]

    AttendanceOptionMenu = tk.OptionMenu(Attendance, AttendanceEvent, *EventList)
    AttendanceOptionMenu.grid(row=2, column=2)
    Attendance.tkraise()
    return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...