Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2020 08:02:57

Pacifist
Зарегистрирован: 2020-01-10
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Здравствуйте, помогите, пжт, разобраться с 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()

Отредактировано Pacifist (Янв. 10, 2020 09:02:22)

Офлайн

#2 Янв. 10, 2020 09:22:40

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Во первых, 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)

Отредактировано rami (Янв. 10, 2020 09:51:45)

Офлайн

#3 Янв. 10, 2020 15:56:56

Pacifist
Зарегистрирован: 2020-01-10
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Спасибо! А как сформировать в основном окне переменную со значением радиокнопки из всплывающего окна?

Офлайн

#4 Янв. 10, 2020 16:33:11

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Можно использовать переменную 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()

Отредактировано rami (Янв. 10, 2020 16:34:36)

Офлайн

#5 Янв. 10, 2020 22:38:18

Pacifist
Зарегистрирован: 2020-01-10
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Спасибо! Но не сработало у меня. 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()

Офлайн

#6 Янв. 10, 2020 23:38:50

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

rami
Можно использовать переменную selected, но её нужно перенести из функции clicked(), чтобы она стала видна
Нужно было перенести переменную selected из функции clicked(), а вы её оставили и добавили ещё одну с таким именем, получилось локальная переменная selected работает с радиокнопками во втором окне, а новая переменная selected их не видит.

Просто удалите строку кода selected = DoubleVar() из функции clicked(), чтобы не путалась под ногами

Офлайн

#7 Янв. 11, 2020 22:22:43

Pacifist
Зарегистрирован: 2020-01-10
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Помогите, пожалуйста получить переменную 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()

Офлайн

#8 Янв. 12, 2020 09:30:15

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Для начала нужно кое-что исправить.

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()

Отредактировано rami (Янв. 12, 2020 15:23:10)

Офлайн

#9 Янв. 13, 2020 17:10:04

Pacifist
Зарегистрирован: 2020-01-10
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

rami
Для начала нужно кое-что исправить.
Спасибище! До этого, мне казалось, что я немного понимаю, что делаю (что откуда берется). Теперь чисто магия! Буду разбираться, мне интересен сам процесс.

Офлайн

#10 Янв. 14, 2020 16:54:32

Pacifist
Зарегистрирован: 2020-01-10
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Не корректно работает Radiobutton

Можно Вас попросить разъяснить эту строку кода?

 text_prisurstv.config(text="{} {:.4f}, коэффициент: {}".format(VER, vremy / 24, selected.get()[0]), bg="#abc")

В частности:
- что это: {:.4f}?
- откуда эта скобка понимает что взять коэффициент: {}?
- что в этой строчке значит VER, ведь это просто “Текст”, но если VER удалить, код перестает работать
- что такое selected.get()) и ноль в квадратных скобках?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version