Форум сайта python.su
0
Здравствуйте, помогите, пжт, разобраться с 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)
Офлайн
72
Во первых, 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)
Офлайн
0
Спасибо! А как сформировать в основном окне переменную со значением радиокнопки из всплывающего окна?
Офлайн
72
Можно использовать переменную 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)
Офлайн
0
Спасибо! Но не сработало у меня. 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()
Офлайн
72
ramiНужно было перенести переменную selected из функции clicked(), а вы её оставили и добавили ещё одну с таким именем, получилось локальная переменная selected работает с радиокнопками во втором окне, а новая переменная selected их не видит.
Можно использовать переменную selected, но её нужно перенести из функции clicked(), чтобы она стала видна
Офлайн
0
Помогите, пожалуйста получить переменную 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()
Офлайн
72
Для начала нужно кое-что исправить.
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)
Офлайн
0
ramiСпасибище! До этого, мне казалось, что я немного понимаю, что делаю (что откуда берется). Теперь чисто магия! Буду разбираться, мне интересен сам процесс.
Для начала нужно кое-что исправить.
Офлайн
0
Можно Вас попросить разъяснить эту строку кода?
text_prisurstv.config(text="{} {:.4f}, коэффициент: {}".format(VER, vremy / 24, selected.get()[0]), bg="#abc")
Офлайн