Найти - Пользователи
Полная версия: Не корректно работает Radiobutton
Начало » Python для новичков » Не корректно работает Radiobutton
1 2
Pacifist
Здравствуйте, помогите, пжт, разобраться с Radiobutton, не хочет возвращать указанные значения (возвращает 0,0)

вин 10, питон 3.8.1

 from tkinter import *
from tkinter import messagebox
from tkinter.ttk import Radiobutton
def func():
    try:
        vremy = int(pole_vremy.get())
        text_prisurstv.config(text="Вероятность присутствия людей в здании: {}".format(vremy / 24))
    except ValueError:
        text_prisurstv.config(text="Ошибка введите цифры")
def clicked():
    poj = Tk()
    poj.title("Выбор вероятности пожара")
    poj.geometry("800x400")
    def click():
        lbl.configure(text=selected.get())
    selected = DoubleVar()
    selected.set(0)
    rad1 = Radiobutton(poj, text='Общеобразовательные организации', value=1, variable=selected)
    rad2 = Radiobutton(poj, text='Второй', value=5, variable=selected)
    rad3 = Radiobutton(poj, text='Третий', value=3, variable=selected)
    btn = Button(poj, text="Выбрать", command=click)
    lbl = Label(poj)
    rad1.grid(column=0, row=0)
    rad2.grid(column=1, row=0)
    rad3.grid(column=2, row=0)
    btn.grid(column=3, row=0)
    lbl.grid(column=0, row=1)
    poj.mainloop()
okno_osn = Tk()
okno_osn.title("Расчет пожарного риска")
okno_osn.geometry("1020x620")
butt1 = Button(okno_osn, text='Выбрать тип здания', bg="#00ff00", command=clicked)
butt1.place(x=5, y=5)
text_vremy = Label(text="Время нахождения, в часах:", bg="#00ff00")
text_vremy.place(x=5, y=50)
text_prisurstv = Label(okno_osn, text="Вероятность присутствия людей в здании:")
text_prisurstv.place(x=5, y=80)
pole_vremy = Entry(okno_osn, width=10)
pole_vremy.place(x=250, y=50)
butt = Button(okno_osn, text='Рассчитать', command=func)
butt.place(x=250, y=500)
okno_osn.mainloop()
rami
Во первых, poj = Tk() замените на poj = Toplevel(). Главное окно Tk() должно быть одно. Этого достаточно чтобы ваш код заработал.



Во вторых, можно убрать кнопку “Выбрать” и функцию def click() тоже.

Вместо lbl = Label(poj) напишите lbl = Label(poj, textvariable=selected)

 def clicked():
    poj = Toplevel()
    poj.title("Выбор вероятности пожара")
    poj.geometry("800x400")
    selected = DoubleVar()
    rad1 = Radiobutton(poj, text='Общеобразовательные организации', value=1, variable=selected)
    rad2 = Radiobutton(poj, text='Второй', value=5, variable=selected)
    rad3 = Radiobutton(poj, text='Третий', value=3, variable=selected)
    lbl = Label(poj, textvariable=selected)
    rad1.grid(column=0, row=0)
    rad2.grid(column=1, row=0)
    rad3.grid(column=2, row=0)
    lbl.grid(column=0, row=1)
Pacifist
Спасибо! А как сформировать в основном окне переменную со значением радиокнопки из всплывающего окна?
rami
Можно использовать переменную selected, но её нужно перенести из функции clicked(), чтобы она стала видна (вот последняя часть кода):
 okno_osn = Tk()
okno_osn.title("Расчет пожарного риска")
okno_osn.geometry("1020x620")
 
selected = DoubleVar()       #перенести из функции clicked()
 
butt1 = Button(okno_osn, text='Выбрать тип здания', bg="#00ff00", command=clicked)
butt1.place(x=5, y=5)
 
#добавляем виджет для вывода выбора радиокнопок или используем selected.get() для расчётов
text_value = Label(okno_osn, textvariable=selected)
text_value.place(x=200, y=5)
 
text_vremy = Label(text="Время нахождения, в часах:", bg="#00ff00")
text_vremy.place(x=5, y=50)
text_prisurstv = Label(okno_osn, text="Вероятность присутствия людей в здании:")
text_prisurstv.place(x=5, y=80)
pole_vremy = Entry(okno_osn, width=10)
pole_vremy.place(x=250, y=50)
butt = Button(okno_osn, text='Рассчитать', command=func)
butt.place(x=250, y=500)
okno_osn.mainloop()
Pacifist
Спасибо! Но не сработало у меня. Label выводит 0,0.
А что будет инициирующим событием для selected.get(), кнопка? А где ее разместить в основном или всплывающем окне?
 from tkinter import *
from tkinter.ttk import Radiobutton
def func():
    try:
        vremy = float(pole_vremy.get())
        text_prisurstv.config(text="Вероятность присутствия людей в здании: {}".format(vremy / 24), bg="silver")
    except ValueError:
        text_prisurstv.config(text="Ошибка!! Введите цифры!!", bg="red")
# выбор вероятности пожара
def clicked():
    poj = Toplevel()
    poj.title("Выбор вероятности пожара")
    poj.geometry("650x300")
    selected = DoubleVar()
    rad1 = Radiobutton(poj, text='Общеобразовательные организации', value=1.16 * 10 ** -2, variable=selected)
    rad2 = Radiobutton(poj, text='Организации начального профессионального образования (профессиональное техническое училище)', value=1.98 * 10 ** -2, variable=selected)
    rad3 = Radiobutton(poj, text='Организации среднего профессионального образования (среднее специальное учебное заведение)', value=2.69 * 10 ** -2, variable=selected)
    rad4 = Radiobutton(poj, text='Санатории, дома отдыха, пансионаты', value=2.99 * 10 ** -2, variable=selected)
    rad5 = Radiobutton(poj, text='Амбулатории, поликлиники, диспансеры, медпункты', value=8.88 * 10 ** -3, variable=selected)
    rad6 = Radiobutton(poj, text='Здания розничной торговли', value=2.03 * 10 ** -2, variable=selected)
    rad7 = Radiobutton(poj, text='Здания рыночной торговли', value=1.13 * 10 ** -2, variable=selected)
    rad8 = Radiobutton(poj, text='Здания организаций общественного питания', value=3.88 * 10 ** -2, variable=selected)
    rad9 = Radiobutton(poj, text='Гостиницы, мотели', value=2.81 * 10 ** -2, variable=selected)
    rad10 = Radiobutton(poj, text='Спортивные сооружения', value=1.83 * 10 ** -3, variable=selected)
    rad11 = Radiobutton(poj, text='Здания зрелищных и культурно-просветительных учреждений', value=6.9 * 10 ** -3, variable=selected)
    rad12 = Radiobutton(poj, text='Библиотекии', value=1.16 * 10 ** -3, variable=selected)
    rad13 = Radiobutton(poj, text='Музеи', value=1.38 * 10 ** -2, variable=selected)
    rad14 = Radiobutton(poj, text='ОТСУТСТВИЕ СТАТИСТИЧЕСКОЙ ИНФОРМАЦИИ', value=0.04, variable=selected)
    rad1.place(x=5, y=5)
    rad2.place(x=5, y=25)
    rad3.place(x=5, y=45)
    rad4.place(x=5, y=65)
    rad5.place(x=5, y=85)
    rad6.place(x=5, y=105)
    rad7.place(x=5, y=125)
    rad8.place(x=5, y=145)
    rad9.place(x=5, y=165)
    rad10.place(x=5, y=185)
    rad11.place(x=5, y=205)
    rad12.place(x=5, y=225)
    rad13.place(x=5, y=245)
    rad14.place(x=5, y=265)
    poj_ver = Label(poj, textvariable=selected, bg="#987")
    poj_ver.place(x=500, y=270)
okno_osn = Tk()
okno_osn.title("Расчет пожарного риска")
okno_osn.geometry("1020x620")
selected = DoubleVar()
butt1 = Button(okno_osn, text='Выбрать тип здания', bg="#00ff00", command=clicked)
butt1.place(x=5, y=5)
text_value = Label(okno_osn, textvariable=selected)
text_value.place(x=200, y=5)
print(text_value)
text_vremy = Label(text="Время нахождения, в часах:", bg="#00ff00")
text_vremy.place(x=5, y=50)
text_prisurstv = Label(okno_osn, text="Вероятность присутствия людей в здании:")
text_prisurstv.place(x=5, y=80)
pole_vremy = Entry(okno_osn, width=10)
pole_vremy.place(x=250, y=50)
butt = Button(okno_osn, text='Рассчитать', command=func)
butt.place(x=250, y=500)
okno_osn.mainloop()
rami
rami
Можно использовать переменную selected, но её нужно перенести из функции clicked(), чтобы она стала видна
Нужно было перенести переменную selected из функции clicked(), а вы её оставили и добавили ещё одну с таким именем, получилось локальная переменная selected работает с радиокнопками во втором окне, а новая переменная selected их не видит.

Просто удалите строку кода selected = DoubleVar() из функции clicked(), чтобы не путалась под ногами
Pacifist
Помогите, пожалуйста получить переменную selected. Как я понял для этого нужно использовать selected.get(), но какой функцией ее активировать? На тех примерах, что нашел, нужно создать функцию, а в каком окне? Кнопкой?
 from tkinter import *
from tkinter.ttk import Radiobutton
def func():
    try:
        vremy = float(pole_vremy.get())
        text_prisurstv.config(text="Вероятность присутствия людей в здании: {}".format(vremy / 24), bg="silver")
    except ValueError:
        text_prisurstv.config(text="Ошибка!! Введите цифры  от 1 до 24!!", bg="red")
# выбор вероятности пожара
def clicked():
    poj = Toplevel()
    poj.title("Выбор вероятности пожара")
    poj.geometry("650x300")
    rad1 = Radiobutton(poj, text='Общеобразовательные организации', value=1.16 * 10 ** -2, variable=selected)
    rad2 = Radiobutton(poj, text='Организации начального профессионального образования (профессиональное техническое училище)', value=1.98 * 10 ** -2, variable=selected)
    rad3 = Radiobutton(poj, text='Организации среднего профессионального образования (среднее специальное учебное заведение)', value=2.69 * 10 ** -2, variable=selected)
    rad4 = Radiobutton(poj, text='Санатории, дома отдыха, пансионаты', value=2.99 * 10 ** -2, variable=selected)
    rad5 = Radiobutton(poj, text='Амбулатории, поликлиники, диспансеры, медпункты', value=8.88 * 10 ** -3, variable=selected)
    rad6 = Radiobutton(poj, text='Здания розничной торговли', value=2.03 * 10 ** -2, variable=selected)
    rad7 = Radiobutton(poj, text='Здания рыночной торговли', value=1.13 * 10 ** -2, variable=selected)
    rad8 = Radiobutton(poj, text='Здания организаций общественного питания', value=3.88 * 10 ** -2, variable=selected)
    rad9 = Radiobutton(poj, text='Гостиницы, мотели', value=2.81 * 10 ** -2, variable=selected)
    rad10 = Radiobutton(poj, text='Спортивные сооружения', value=1.83 * 10 ** -3, variable=selected)
    rad11 = Radiobutton(poj, text='Здания зрелищных и культурно-просветительных учреждений', value=6.9 * 10 ** -3, variable=selected)
    rad12 = Radiobutton(poj, text='Библиотекии', value=1.16 * 10 ** -3, variable=selected)
    rad13 = Radiobutton(poj, text='Музеи', value=1.38 * 10 ** -2, variable=selected)
    rad14 = Radiobutton(poj, text='ОТСУТСТВИЕ СТАТИСТИЧЕСКОЙ ИНФОРМАЦИИ', value=0.04, variable=selected)
    rad1.place(x=5, y=5)
    rad2.place(x=5, y=25)
    rad3.place(x=5, y=45)
    rad4.place(x=5, y=65)
    rad5.place(x=5, y=85)
    rad6.place(x=5, y=105)
    rad7.place(x=5, y=125)
    rad8.place(x=5, y=145)
    rad9.place(x=5, y=165)
    rad10.place(x=5, y=185)
    rad11.place(x=5, y=205)
    rad12.place(x=5, y=225)
    rad13.place(x=5, y=245)
    rad14.place(x=5, y=265)
    poj_ver = Label(poj, textvariable=selected, bg="#987")
    poj_ver.place(x=500, y=270)
okno_osn = Tk()
okno_osn.title("Расчет пожарного риска")
okno_osn.geometry("1020x620")
selected = DoubleVar()  # перенести из функции clicked()
butt1 = Button(okno_osn, text='Выбрать тип здания', bg="#00ff00", command=clicked)
butt1.place(x=5, y=5)
# добавляем виджет для вывода выбора радиокнопок или используем selected.get() для расчётов
text_value = Label(okno_osn, textvariable=selected)
text_value.place(x=200, y=5)
ver_poj = selected.get()
if ver_poj == 1.16 * 10 ** -2:
    text_value1 = Label(okno_osn, text='Общеобразовательные организации')
    text_value1.place(x=300, y=5)
elif ver_poj == 1.98 * 10 ** -2:
    text_value1 = Label(okno_osn, text='Организации начального профессионального образования (профессиональное техническое училище)')
    text_value1.place(x=300, y=5)
elif ver_poj == 2.69 * 10 ** -2:
    text_value1 = Label(okno_osn, text='Организации среднего профессионального образования (среднее специальное учебное заведение)')
    text_value1.place(x=300, y=5)
else:
    text_value1 = Label(okno_osn, text='Тип объекта не выбран')
    text_value1.place(x=300, y=5)
text_vremy = Label(text="Время нахождения, в часах:", bg="#00ff00")
text_vremy.place(x=5, y=50)
text_prisurstv = Label(okno_osn, text="Вероятность присутствия людей в здании:")
text_prisurstv.place(x=5, y=80)
pole_vremy = Entry(okno_osn, width=10)
pole_vremy.place(x=250, y=50)
butt = Button(okno_osn, text='Рассчитать', command=func)
butt.place(x=250, y=500)
okno_osn.mainloop()
rami
Для начала нужно кое-что исправить.

1. импортировать звёздочкой в tkinter и tkinter.ttk плохо, в каждом из них есть виджеты с одинаковым именем. Вы импортируете два вида Radiobutton: неявно из tkinter (звёздочкой) и явно из tkinter.ttk. Пока этот фокус проходит без осложнений, но лучше импортировать явно, то что нужно.

2. радиокнопки идут друг за другом и различаются только данными, поэтому, создавать их лучше в цикле, а данные брать из словаря или кортежа (списка, множества). Создавать переменные для радиокнопок обычно не нужно.

3. есть три типа упаковщиков: place, pack и grid, вы используете самый простой и трудоёмкий place, но для батареи радиокнопок лучше использовать pack. Важно учесть, что в одном окне (фрейме) должен быть один тип упаковщика, иначе будет глючить.

4. коэффициенты лучше писать не в сложном виде 1.16 * 10 ** -2, в обычном 0.0116, а то глаза гаснут (проверьте не ошибся ли я в переводе чисел)

С учётом выше сказанного такой вариант:
 from tkinter import Tk, Toplevel, Variable, Button, Label, Entry
from tkinter.ttk import Radiobutton
 
VER = "Вероятность присутствия людей в здании:"
ORGAN = (
    ('Общеобразовательные организации', 0.0116),
    ('Организации начального профессионального образования (профессиональное техническое училище)', 0.0198),
    ('Организации среднего профессионального образования (среднее специальное учебное заведение)', 0.0269),
    ('Санатории, дома отдыха, пансионаты', 0.0299),
    ('Амбулатории, поликлиники, диспансеры, медпункты', 0.00888),
    ('Здания розничной торговли', 0.0203),
    ('Здания рыночной торговли', 0.0113),
    ('Здания организаций общественного питания', 0.0388),
    ('Гостиницы, мотели', 0.0281),
    ('Спортивные сооружения', 0.00183),
    ('Здания зрелищных и культурно-просветительных учреждений', 0.0069),
    ('Библиотекии', 0.00116),
    ('Музеи', 0.0138),
    ('ОТСУТСТВИЕ СТАТИСТИЧЕСКОЙ ИНФОРМАЦИИ', 0.04)
    )
 
def func():
    try:
        vremy = float(pole_vremy.get())
        text_prisurstv.config(text="{} {:.4f}, коэффициент: {}".format(VER, vremy / 24, selected.get()[0]), bg="silver")
    except ValueError:
        text_prisurstv.config(text="Ошибка!! Введите цифры  от 1 до 24!!", bg="red")
 
# выбор вероятности пожара
def clicked():
    poj = Toplevel()
    poj.title("Выбор вероятности пожара")
#    poj.geometry("650x300")        не нужно жёстко задавать размеры
    for t, v in ORGAN:
        Radiobutton(poj, text=t, value=(v, t), variable=selected).pack(fill='both', ipadx=30)
    Label(poj, textvariable=selected, bg="#abc").pack(fill='both')
 
 
okno_osn = Tk()
okno_osn.title("Расчет пожарного риска")
okno_osn.geometry("1020x620")
selected = Variable()       #переменная для кортежа
 
butt1 = Button(okno_osn, text='Выбрать тип здания', bg="#00ff00", command=clicked)
butt1.place(x=5, y=5)
# добавляем виджет для вывода выбора радиокнопок
text_value = Label(okno_osn, textvariable=selected)
text_value.place(x=200, y=5)
 
text_vremy = Label(text="Время нахождения, в часах:", bg="#00ff00")
text_vremy.place(x=5, y=50)
pole_vremy = Entry(okno_osn, width=10)
pole_vremy.place(x=250, y=50)
 
text_prisurstv = Label(okno_osn, text=VER)
text_prisurstv.place(x=5, y=80)
 
butt = Button(okno_osn, text='Рассчитать', command=func)
butt.place(x=250, y=500)
 
okno_osn.mainloop()
Pacifist
rami
Для начала нужно кое-что исправить.
Спасибище! До этого, мне казалось, что я немного понимаю, что делаю (что откуда берется). Теперь чисто магия! Буду разбираться, мне интересен сам процесс.
Pacifist
Можно Вас попросить разъяснить эту строку кода?
 text_prisurstv.config(text="{} {:.4f}, коэффициент: {}".format(VER, vremy / 24, selected.get()[0]), bg="#abc")

В частности:
- что это: {:.4f}?
- откуда эта скобка понимает что взять коэффициент: {}?
- что в этой строчке значит VER, ведь это просто “Текст”, но если VER удалить, код перестает работать
- что такое selected.get()) и ноль в квадратных скобках?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB