#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]: