Форум сайта python.su
Может еще поможешь?
У мну опять затык какой-то.
Смотри: Мне надо присвоить переменной в variable некой радиокнопки значение. Я не знаю имя переменной, но я знаю имя виджета.
чего ставить перед .set(n)? =)
Думаю хороший мануальчик по всяким winfo_ мне поможет очень сильно, желательно на русском… с англицким у меня ваще все плохо..
Отредактировано Steerch (Ноя. 12, 2012 19:05:43)
Офлайн
Задача размыта, но я думаю ты имеешь ввиду следующее:
Смотри, если тебе нужно из базы вынять данные и расскидать их по твоему GUI, то есть следующее решение.
Отдельные группы радиокнопок (радиокнопка сама по себе - это ересь) назначаешь IntVar (что ты и сделал в примере под кодовым названием “выколите мне глаза”). Только там ты допустил ошибку, ты кодировал каждую кнопочку отдельно. Этого делать было не надо. Надо было кодировать всю группу (каждому id кнопочки одной группы соответствовал бы один и тот же IntVar) в виде словаря {id: IntVar_группы}.
Расскидываешь значения из базы в соответсвии по рассписанным IntVar. Например, если тебе нужно, чтобы в второй группе радиокнопок активной стала кнопка 2, то пишешь IntVar_второй_группы.set(1) (Предполагаю, что нумерация происходит от 0 до …).
Если же тебе после выбора пользователем одной радиокнопки нужно изменить значение в другой, есть другое решение….
При изменении кнопок тебе нужно узнать, какая кнопка была нажати и какой IntVar использовать???
Узнаешь, какой id нажат и какой группе он принадлежит. Пользуешься словарем var = dict.get(id_другой_группы), и полученному var назначаешь непросредственно новое значение var.set(3), т.е. поставить группе радиокнопок под кодовым названием id значение выбора равное 4…
Но здесь есть один нюанс. Эсли ты хочешь менять данные с той группы, которая и была нажата, то такой фокус не пройдет. Поясню почему. Выбор кнопки и функция bind происходит в следующей последовательности: функци bind, потом нажатие… Поэтому, если изменение произойдет, но поверх него опять выберется явный выбор пользователя. В этом случае лучше блокировать кнопки, изменяя их состояние… Хотя есть один способ. Но если нужен именно он я напишу о нем завтра… Бо больно много писать и пояснять придется.
Желательно показывать упрощенный код с затыком.. Или более подробно описывать задачу и проблемы. Приходится догадываться…
Отредактировано 4kpt (Ноя. 12, 2012 23:18:14)
Офлайн
Упрощенный код, блин. Проблема в том, что я чайник полный =) - когда я начал писать программу я был вооружен школьными знаниями Бейсика, полученными 15 лет назад, и названием языка Питон. В процессе написания программы учил Питон и ТСЛ. У меня просто зияющие провалы в знаниях, оттого код уже настолько запутанный, что приходится извращаться =) Советы типа: “учи все по порядку”, давать не надо, я так не умею, на второй день от всяких hello world мну станет тошно.
могу весь код показать, не коммерческая тайна, однако… Посмеешься за одно =)
упрощенный код:
рб_ур - рисует группы, рб_а проверяет и закрывает-открывает группы.
Мне надо, в рб_а, при дизактивации группы, скидывать значение ее переменной в 0, иначе значение все равно учавствует в расчетах несмотря на невозможность поменять значение, (калькулятор все-таки) а не должна. я в данном коде не могу назначить значение, потому что не знаю ИМЯ переменной которая назначенна как variable у той группы, которую я сейчас изменяю. Рб_а вызывается по ходу программы там и тут, и не всегда есть откуда взять имя переменной.
Я могу, конечно, закидывать имя переменной группы в список в котором ИД радиокнопок. Но тут всплывает вторая проблема. А как использовать строковое значение одной переменной как ИМЯ другой переменной? =)
Так понятнее?
Отредактировано Steerch (Ноя. 13, 2012 07:28:58)
Офлайн
Если я правильно понял, не видя кода, то привожу пример.
Суть примера в следующем. Создается две панели с радиокнопками. Последняя радиокнопка отвечает за отключение панели и переход значения в нулевой уровень. Но мы не знаем, какя панель активирована, и какой v_group_1 нужно обнулять? Для этого я создал два словаря, хотя можно было и один… Если пример не понятен или не тот, тогда нужна еще информация.
import Tkinter
root = Tkinter.Tk()
root.geometry("400x400+0+0")
root.focus_force()
v_group_1 = Tkinter.IntVar()
v_group_2 = Tkinter.IntVar()
v_group_1.set(1)
v_group_2.set(2)
Frame1 = Tkinter.Frame(root)
Frame1.pack(side = "left")
Frame2 = Tkinter.Frame(root)
Frame2.pack(side = "right")
def state_new(event = None):
name = event.widget.winfo_id()
var = code_all.get(name)[1]
var.set(0)
name_group = code_all.get(name)[0]
for nm in wid_name.get(name_group):
root.nametowidget(root.winfo_pathname(nm)) ["state"] = "disabled"
group1 = [("Метод 1-1", 0),("Метод 1-2", 1),("Метод 1-3", 2), ("Блокировка", 3)]
group2 = [("Метод 2-1", 0),("Метод 2-2", 1),("Метод 2-3", 2), ("Блокировка", 3)]
code_all = {}
wid_name = {}
r1 = []
r2 = []
for name1, pos1 in group1:
rb1 = Tkinter.Radiobutton(Frame1, text = name1, variable = v_group_1, value = pos1)
code_all[rb1.winfo_id()] = ["gr1", v_group_1]
r1 = r1 + [rb1.winfo_id()]
rb1.pack()
rb1.bind("<ButtonRelease-1>", state_new)
wid_name["gr1"] = r1
for name2, pos2 in group2:
rb2 = Tkinter.Radiobutton(Frame2, text = name2, variable = v_group_2, value = pos2)
code_all [rb2.winfo_id()] = ["gr2", v_group_2]
r2 = r2 + [rb2.winfo_id()]
rb2.pack()
rb2.bind("<ButtonRelease-1>", state_new)
wid_name["gr2"] = r2
root.mainloop()
Офлайн
Steerch, настоятельно рекомендую перестать разрушать психику форумчан. Оформляйте код в тегах. Выкладывать код скриншотами Вы, по-моему, первый кто догадался.
Офлайн
4kpt: Посмотрю позже, со смены - ноч не спал.. смотрю код, нихрена не понимаю =)
FishHook: Пасиб, искал - не нашел, невнимателен. К тому-же сделать скрин и отправить его на сервер хранения для меня проблема нажатия 1 кнопки. =)
Офлайн
SteerchА прикинь, сколько кнопок надо нажать, чтобы перенести твой код себе в IDE и потестить, и кто вообще будет это делать?
4kpt: Посмотрю позже, со смены - ноч не спал.. смотрю код, нихрена не понимаюFishHook: Пасиб, искал - не нашел, невнимателен. К тому-же сделать скрин и отправить его на сервер хранения для меня проблема нажатия 1 кнопки.
Офлайн
4kpt: Просьба. Модешь переписать код так, чтоб при выборе “блокировка” блокировалась со сбросом другая группа, ну и чтоб разблочивалась при выборе любого другого значения кроме “блокировка”.
Не могу всосать код, он для меня сложноват еще.
Офлайн
Сделаю через 40 минут…
Офлайн
Лови…
import Tkinter root = Tkinter.Tk() root.geometry("400x400+0+0") root.focus_force() v_group_1 = Tkinter.IntVar() v_group_2 = Tkinter.IntVar() v_group_1.set(1) v_group_2.set(2) Frame1 = Tkinter.Frame(root) Frame1.pack(side = "left") Frame2 = Tkinter.Frame(root) Frame2.pack(side = "right") def state_new(event = None): name = event.widget.winfo_id() name_group = code_all.get(name)[0] if name_group == "gr1": block = "gr2" else: block = "gr1" var = code_all.get(wid_name.get(block)[0])[1] if event.widget.cget("text") == u"Блокировка": var.set(0) for nm in wid_name.get(block): root.nametowidget(root.winfo_pathname(nm)) ["state"] = "disabled" else: for nm in wid_name.get(block): root.nametowidget(root.winfo_pathname(nm)) ["state"] = "normal" group1 = [("Метод 1-1", 0),("Метод 1-2", 1),("Метод 1-3", 2), ("Блокировка", 3)] group2 = [("Метод 2-1", 0),("Метод 2-2", 1),("Метод 2-3", 2), ("Блокировка", 3)] code_all = {} wid_name = {} r1 = [] r2 = [] for name1, pos1 in group1: rb1 = Tkinter.Radiobutton(Frame1, text = name1, variable = v_group_1, value = pos1) code_all[rb1.winfo_id()] = ["gr1", v_group_1] r1 = r1 + [rb1.winfo_id()] rb1.pack() rb1.bind("<ButtonRelease-1>", state_new) wid_name["gr1"] = r1 for name2, pos2 in group2: rb2 = Tkinter.Radiobutton(Frame2, text = name2, variable = v_group_2, value = pos2) code_all [rb2.winfo_id()] = ["gr2", v_group_2] r2 = r2 + [rb2.winfo_id()] rb2.pack() rb2.bind("<ButtonRelease-1>", state_new) wid_name["gr2"] = r2 root.mainloop()
Офлайн