Найти - Пользователи
Полная версия: Проблемы управления Radiobutton (tcl-tkinter)
Начало » GUI » Проблемы управления Radiobutton (tcl-tkinter)
1 2
Steerch
Может еще поможешь?

У мну опять затык какой-то.

Смотри: Мне надо присвоить переменной в variable некой радиокнопки значение. Я не знаю имя переменной, но я знаю имя виджета.
чего ставить перед .set(n)? =)

Думаю хороший мануальчик по всяким winfo_ мне поможет очень сильно, желательно на русском… с англицким у меня ваще все плохо..
4kpt
Задача размыта, но я думаю ты имеешь ввиду следующее:

Смотри, если тебе нужно из базы вынять данные и расскидать их по твоему 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, потом нажатие… Поэтому, если изменение произойдет, но поверх него опять выберется явный выбор пользователя. В этом случае лучше блокировать кнопки, изменяя их состояние… Хотя есть один способ. Но если нужен именно он я напишу о нем завтра… Бо больно много писать и пояснять придется.

Желательно показывать упрощенный код с затыком.. Или более подробно описывать задачу и проблемы. Приходится догадываться…
Steerch
Упрощенный код, блин. Проблема в том, что я чайник полный =) - когда я начал писать программу я был вооружен школьными знаниями Бейсика, полученными 15 лет назад, и названием языка Питон. В процессе написания программы учил Питон и ТСЛ. У меня просто зияющие провалы в знаниях, оттого код уже настолько запутанный, что приходится извращаться =) Советы типа: “учи все по порядку”, давать не надо, я так не умею, на второй день от всяких hello world мну станет тошно.

могу весь код показать, не коммерческая тайна, однако… Посмеешься за одно =)

упрощенный код:



рб_ур - рисует группы, рб_а проверяет и закрывает-открывает группы.

Мне надо, в рб_а, при дизактивации группы, скидывать значение ее переменной в 0, иначе значение все равно учавствует в расчетах несмотря на невозможность поменять значение, (калькулятор все-таки) а не должна. я в данном коде не могу назначить значение, потому что не знаю ИМЯ переменной которая назначенна как variable у той группы, которую я сейчас изменяю. Рб_а вызывается по ходу программы там и тут, и не всегда есть откуда взять имя переменной.

Я могу, конечно, закидывать имя переменной группы в список в котором ИД радиокнопок. Но тут всплывает вторая проблема. А как использовать строковое значение одной переменной как ИМЯ другой переменной? =)

Так понятнее?
4kpt
Если я правильно понял, не видя кода, то привожу пример.
Суть примера в следующем. Создается две панели с радиокнопками. Последняя радиокнопка отвечает за отключение панели и переход значения в нулевой уровень. Но мы не знаем, какя панель активирована, и какой 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()
FishHook
Steerch, настоятельно рекомендую перестать разрушать психику форумчан. Оформляйте код в тегах. Выкладывать код скриншотами Вы, по-моему, первый кто догадался.
Steerch
4kpt: Посмотрю позже, со смены - ноч не спал.. смотрю код, нихрена не понимаю =)

FishHook: Пасиб, искал - не нашел, невнимателен. К тому-же сделать скрин и отправить его на сервер хранения для меня проблема нажатия 1 кнопки. =)
FishHook
Steerch
4kpt: Посмотрю позже, со смены - ноч не спал.. смотрю код, нихрена не понимаю FishHook: Пасиб, искал - не нашел, невнимателен. К тому-же сделать скрин и отправить его на сервер хранения для меня проблема нажатия 1 кнопки.
А прикинь, сколько кнопок надо нажать, чтобы перенести твой код себе в IDE и потестить, и кто вообще будет это делать?
Steerch
4kpt: Просьба. Модешь переписать код так, чтоб при выборе “блокировка” блокировалась со сбросом другая группа, ну и чтоб разблочивалась при выборе любого другого значения кроме “блокировка”.

Не могу всосать код, он для меня сложноват еще.
4kpt
Сделаю через 40 минут…
4kpt
Лови…
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()
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