Форум сайта python.su
Можно попробовать накапливать ссылки на чекбоксы в списке или в чем другом, а потом пустить цикл с eval() либо exec(). Недавно столкнулся с подобной проблемой, только вместо чекбоксов - LineEdit, причем их количество динамически меняется в зависимости от заполнения предыдущих форм и я пошел по описанному выше пути и все получилось.
Офлайн
exec() - это последнее средство. Вечером выложу два скрипта и можно будет убедиться в этом :)
Офлайн
Как и обещал. Первый пример. С использованием чекбоксов.
# -*- coding: utf-8 -*- import Tkinter # Создается главное окно root = Tkinter.Tk() root.geometry("400x400+100+100") choise = [u"Первый показатель", u"Второй показатель", u"Третий показатель"] variants = dict.fromkeys(choise, 0) values = {} # Функция для вывода общих результатов выбора def print_all_choise(event): chek = event.widget variants[chek.cget("text")] = values[chek.winfo_id()].get() print repr(variants).decode("unicode_escape") # Построение списка чекбоксов for i in xrange(len(variants)): chek = Tkinter.Checkbutton(root, text=choise[i], font=14) chek.bind("<space>", print_state) chek.bind("<ButtonRelease-1>", print_state) chek.bindtags(("Checkbutton", chek)) chek.grid(row=i, column=1, sticky="w") # Особое внимание на эту строку. Здесть определеяется # "ящичек" для хранения результатов каждого чекбокса # и формируется элементы словаря в котором по # уникальному имени виджета (ключу) хранится нужный # "ящичек" (значение). chek["variable"] = values[chek.winfo_id()] = Tkinter.IntVar() root.mainloop()
Отредактировано 4kpt (Март 13, 2013 22:03:27)
Офлайн
Выкладываю второй вариант. Для настоящих мужчин :) С точки зрения дизайна пользовательского интерфейса - более правильный (и единственно возможный, если количество вариантов выбора больше 8 - я уже об этом писал).
# -*- coding: utf-8 -*- import Tkinter root = Tkinter.Tk() root.geometry("500x200+100+100") choise = [u"Первый показатель", u"Второй показатель", u"Третий показатель", u"Четвертый показатель"] result = [] # Реакция на получение фокуса... def focus_in(event): listbox_work = event.widget if listbox_work.size != 0: listbox_work.activate(0) listbox_work.selection_set(0) def change_choise(event): # Выбор вариантов из всех возможных и запись их в список result # паралельно выбранные варианты удаляются из списка choise if event.widget.master.cget("text") == u"Все варианты" and choise: selection = int(event.widget.curselection()[0]) result.append(choise[selection]) Listbox_fr.delete(selection) Listbox_to.insert("end", choise.pop(selection)) print repr(result).decode("unicode_escape") # Отказ от выбранных вариантом и удаление их из списка result # паралельно удаленные варианты добавляются в список choise elif event.widget.master.cget("text") == u"Выбранные варианты" and result: selection = int(event.widget.curselection()[0]) choise.append(result[selection]) Listbox_to.delete(selection) Listbox_fr.insert("end", result.pop(selection)) print repr(result).decode("unicode_escape") # Список всех вариантов на выбор Frame_fr = Tkinter.LabelFrame(root, text=u"Все варианты", font=14) Frame_fr.place(relx=0.25, rely=0.5, anchor="center") Listbox_fr = Tkinter.Listbox(Frame_fr, width=20, height=4, font=14) Listbox_fr.insert("end",*choise) Listbox_fr.focus_force() Listbox_fr.pack() Listbox_fr.bind("<space>", change_choise) Listbox_fr.bind("<FocusIn>", focus_in) # Список выбранных вариантов Frame_to = Tkinter.LabelFrame(root, text=u"Выбранные варианты", font=14) Frame_to.place(relx=0.75, rely=0.5, anchor="center") Listbox_to = Tkinter.Listbox(Frame_to, width=20, height=4, font=14) Listbox_to.pack() Listbox_to.bind("<space>", change_choise) Listbox_to.bind("<FocusIn>", focus_in) root.mainloop()
Отредактировано 4kpt (Март 13, 2013 22:04:15)
Офлайн
Представляю Вам мое говнокодерство решение:
1. Создать кортеж такого вида(любое кол-во чекбоксов)
infec = (self.checkBox_4, self.checkBox_5, self.checkBox_6, self.checkBox_7, self.checkBox_8, self.checkBox_9, self.checkBox_10)
for f in infec: if f.isChecked(): str(checkB[f])
Офлайн
infec = (self.checkBox_4, self.checkBox_5, self.checkBox_6, self.checkBox_7, self.checkBox_8, self.checkBox_9, self.checkBox_10)
infec = [ getattr(self, "checkBox_%s" x) for x in range(4,11) ]
Офлайн
А какой виджет является родителем у всех чекбоксов? QListWidget или просто Layout какой-то или ещё что? У Вас есть список или словарь этих чекбоксов?
Офлайн
Какой QListWidget? Речь идет о Tkinter, а не о PyQt.
Офлайн
Топикстартер писал: “Оу. Извиняюсь. Я пишу c помощью PyQt 4.7
Лично для меня отдельный кайф вызывает рисование в Дизайнере.
Отредактировано lotro (Март 10, 2013 17:09:16)”
Так что изначально речь шла именно о PyQt.
Офлайн
Да уже забыли о первом вопросе. Страницы полторы, как забыли :)
Офлайн