2015-10-09 1 views
1

Я создал около 5 ящиков ввода и связал их также. Примите это как модель:Python Tkinter - ящик с несколькими входами с одинаковой проверкой

def makeEntry(self, master, data): 
    self.entry = Entry(master, width=8, textvariable=data) 
    self.entry.bind("<Leave>", lambda event, value=data: self.validate(event, value)) 

Теперь я также способ проверки того, что проверить, если вход был строка (и если да, то изюминкой фон входа изменится на красный). Проблема, которая все еще требует много времени, заключается в том, что мне понадобится, чтобы метод мог проверять каждую запись, и если хотя бы один из них имеет красный фон, тогда конечная кнопка должна быть отключена (button.configure(state=DISABLED)) ,

С одной записью было бы намного проще, я бы просто проверил, был ли фон красным (status = str(self.myOneEntry.cget("highlightbackground"))), но как насчет большего количества записей?

+1

Знаете ли вы, что виджет ввода имеет встроенную функцию проверки, которая не требует использования привязок? –

+0

Ваш вопрос немного неясен. Вы хотите, чтобы одна функция работала с каждой записью, или вы хотите, чтобы одна функция проверяла все записи одновременно? –

+0

@ Брайан Оукли, да, я знаю это, хотя я еще не использовал его. Я знаю, что это на самом деле немного неясно, но это из-за того, что мне не удается его реализовать. Во всяком случае, я попытался выполнить одну функцию для проверки всех записей (которые работали, но я использовал разные имена для разных записей и делал некоторые элементы управления, не используя вышеперечисленное _makeEntry_), как это сделать (второй выбор) с помощью _makeEntry_? –

ответ

0

Если вы хотите проверить все свои записи, сохраните их в списке. Затем напишите функцию, которая выполняет итерацию над списком и устанавливает состояние кнопки в состояние «отключено», если у какого-либо виджета есть красный фон. Затем вы можете вызвать это, когда что-то изменится, например, в вашей функции проверки для каждого виджета.

Пример:

class Example(...): 
    def __init__(...): 
     self.entries = [] 
     for data in ("one","two","three"): 
      entry = makeEntry(...) 
      self.entries.append(entry) 

    def _update_button(self): 
     for entry in self.entries: 
      if entry.cget("background") == "red": 
       self.button.configure(state="disabled") 
       return 
     self.button.configure(state="normal") 

Примечание: вы должны убедиться, что makeEntry(...) возвращает ссылку на созданный виджет.

Кроме того, вам не нужно использовать makeEntry. Вы можете создавать свои виджеты, как хотите. Дело в том, чтобы сохранить ссылки на виджеты в структуре данных, которые вы можете перебрать. Неважно, как создаются виджеты.

+0

Является ли это решение хорошим, если заголовок _makeEntry_ будет похож на 'def makeEntry (self, master, data, i, field, x, y, x1, y1):'? –

+0

до тех пор, пока 'makeEntry' возвращает ссылку на виджет ввода, он будет работать независимо от аргументов. –

+0

Извините, но первый цикл меня не убеждает. Если я объявляю 'self.value1 = StringVar()', и одна из записей, которую я должен иметь, похожа на 'entry = makeEntry (master, self.value1, 0," Test ", 10, 300, 90, 300)' и почти все аргументы изменяются для каждой записи, все равно 'entry = makeEntry (...)' right? Я мог бы потеряться ... –

Смежные вопросы