Сообщение об ошибке не отображается, даже если не выбрана кнопка Radiobutton — что не так с моим кодом?

#python #python-3.x #tkinter #radio-button

#python #python-3.x #tkinter #переключатель

Вопрос:

Итак, у меня есть две функции:

 def Driver_Form():
    canvas.delete("all")
    root.configure(bg="cornflower blue")
    canvas.config(width=root.winfo_screenwidth(), height=root.winfo_screenheight(),
                  bg="sky blue") 
...

myvar1 = StringVar() #IntVar()
Male = Radiobutton(canvas, text = "Male", variable = myvar1, value = 1)
canvas.create_window(734, 265, window = Male, height = 25, width = 70)

Female = Radiobutton(canvas, text="Female", variable=myvar1, value = 2)
canvas.create_window(825, 265, window=Female, height=25, width=90)

Other = Radiobutton(canvas, text="Rather not say", variable=myvar1, value = 3)
canvas.create_window(940, 265, window=Other, height=25, width=120)

Next_button = Button(root, text="Next", anchor=CENTER, command=lambda: check_Driver(FName_Entry, LName_Entry,
                                                                                        day_combobox, month_combobox,
                                                                                        year_combobox, myvar1, Email_Entry, Phone_Entry))
    Next_button.configure(width=10, bg="black", fg="blue", border=10)
    canvas.create_window(920, 450, anchor=NW, window=Next_button)
  

Next_button приводит к другой функции:

 def check_Driver(FName_Entry, LName_Entry, day_combobox, month_combobox, year_combobox,  myvar1, Email_Entry,
                 Phone_Entry, event=None):
...

if myvar1 != 1 or 2 or 3:
    error_blank2 = Message(root, text="Please don't leave any field/s blank", anchor=CENTER, bg="red", width=1000)
    canvas.create_window(600, 450, anchor=NW, window=error_blank2)
  

Я пытаюсь убедиться, что сообщение об ошибке отображается, если ни одна из переключателей не нажата из мужских, женских и других. Однако я не знаю, что не так, но, похоже, это не работает, и сообщение об ошибке не отображается, даже если ни одна из радиокнопок не нажата.

Ответ №1:

У вас как минимум две большие проблемы. Во-первых, myvar1 никогда не будет 1, 2 или 3, потому что myvar1 не является целым числом. Это экземпляр StringVar . Итак, первое, что вам нужно изменить, это то, что вам нужно использовать int(myvar1.get()) в ваших if операторах, чтобы вы сравнивали значение, хранящееся в переменной, а не в самом экземпляре StringVar .

Когда вы это исправите, у вас возникнет другая проблема. if myvar1 != 1 or 2 or 3 делает не то, что вы думаете. Логически это то же самое, что if (myvar != 1) or (bool(2)) or (bool(3)) . Поскольку bool(2) всегда будет возвращаться True , тело if инструкции всегда будет выполняться.

Если вы хотите проверить, что myvar1 это не одно из значений 1, 2 или 3, вы можете сделать это одним из следующих способов:

 if int(myvar1.get()) not in (1, 2, 3):
  

-или-

 value = int(myvar1.get())
if value != 1 and value != 2 and value != 3:
  

Ответ №2:

Ваше условие неверно. Условие, которое вы написали, не проверяет, равно ли значение 1, 2 или 3, но оно проверяет, не равно ли оно 1 или 2 и 3 являются числами, отличными от 0.

Чтобы проверить, является ли myvar чем-то иным, чем 1, 2 или 3, используйте:

 if myvar1.get() not in [1, 2, 3]: