2016-12-08 4 views
0

Так что я сейчас делаю приложение с графическим интерфейсом с Tkinter и независимо от количества я ставлю в верхнем окне, графический интерфейс автоматически добавит еще entry rowзапись Tkinter Update

Когда я поставил 1, а затем я пытаюсь большего числа таких в 3 или 5 она работает просто отлично, запись строка будет отображаться, проблема в том, когда я ставлю число, например, 5 и попробовать поставить число меньше 5, то запись будет по-прежнему отображаться вместо removed

Есть ли способ, что, когда я ставлю большее число, например 4, а затем меньше таких, как 2 и, запись из 5 будет удалена ??

Edit: добавить код

def choiceone(self): 
    self.labeln1 = ttk.Label(self, text="1", justify="center") 
    self.labeln1.grid(row=7, column=1) 

    self.entry1 = ttk.Entry(self, width=15) 
    self.entry1.grid(row=7, column=2) 

    self.entry2 = ttk.Entry(self, width=15) 
    self.entry2.grid(row=7, column=3) 

    self.entry3 = ttk.Entry(self, width=15) 
    self.entry3.grid(row=7, column=4) 

    self.entry4 = ttk.Entry(self, width=15) 
    self.entry4.grid(row=7, column=5) 


def choicetwo(self): 
    self.labeln2 = ttk.Label(self, text="2", justify="center") 
    self.labeln2.grid(row=9, column=1) 

    self.entry5 = ttk.Entry(self, width=15) 
    self.entry5.grid(row=9, column=2) 

    self.entry6 = ttk.Entry(self, width=15) 
    self.entry6.grid(row=9, column=3) 

    self.entry7 = ttk.Entry(self, width=15) 
    self.entry7.grid(row=9, column=4) 

    self.entry8 = ttk.Entry(self, width=15) 
    self.entry8.grid(row=9, column=5) 


def choicethree(self): 
    self.labeln3 = ttk.Label(self, text="3", justify="center") 
    self.labeln3.grid(row=11, column=1) 

    self.entry9 = ttk.Entry(self, width=15) 
    self.entry9.grid(row=11, column=2) 

    self.entry10 = ttk.Entry(self, width=15) 
    self.entry10.grid(row=11, column=3) 

    self.entry11 = ttk.Entry(self, width=15) 
    self.entry11.grid(row=11, column=4) 

    self.entry12 = ttk.Entry(self, width=15) 
    self.entry12.grid(row=11, column=5) 


class MultiLevel(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = ttk.Label(self, text="Fatigue Failure", font=LARGE_FONT) 
     label.grid(columnspan=3, sticky="w") 

     labele1 = ttk.Label(self, text="METHOD 1", font=LARGE_FONT) 
     labele1.grid(row=1, column=1) 

     ttk.Separator(self, orient=tk.HORIZONTAL).grid(row=2, columnspan=5, sticky="EW") 

     labele0 = ttk.Label(self, text="") 
     labele0.grid(row=3, column=1) 

     label0 = ttk.Label(self, text="Number of \nStress Level: ", font=MEDIUM_FONT, justify="center") 
     label0.grid(row=4, column=1) 
     self.entry0 = ttk.Entry(self, width=15) 
     self.entry0.grid(row=4, column=2) 

     button0 = ttk.Button(self, text="OK ", command=lambda: self.ok()) 
     button0.grid(row=4, column=3) 

    def ok(self): 
     try: 
      float(self.entry0.get()) 

     except ValueError: 
      errormsg("INPUT YOUR NUMBER") 

     else: 
      if float(self.entry0.get()) == 1: 
      choiceone(self) 

     elif float(self.entry0.get()) == 2: 
      choiceone(self) 
      choicetwo(self) 

     elif float(self.entry0.get()) == 3: 
      choiceone(self) 
      choicetwo(self) 
      choicethree(self) 
+2

Мы не можем помочь вам, если вы не разместите свой код. – acw1668

+0

спасибо, я добавил свой код – KaraiKare

ответ

0

Как сказал @furas, вам нужно уничтожить существующие виджеты первый:

def ok(self): 
    try: 
     float(self.entry0.get()) 

    except ValueError: 
     errormsg("INPUT YOUR NUMBER") 

    else: 
     # remove existing widgets start from row 7 
     for widget in self.grid_slaves(): 
      if int(widget.grid_info()["row"]) >= 7: 
       widget.destroy() 

     if float(self.entry0.get()) == 1: 
      choiceone(self) 
     ... 

PS: Как из вашего кода, беспокойство виджеты помещаются в строке 7 и выше.

Данное предложение основано на вашем коде, но я думаю, что вам лучше реорганизовать ваш код.

1

Everytime вы положили Numer вы непрестанно создавать новые записи в сетке, но вы никогда не удалить предыдущие записи, поэтому не ожидаем, что они будут волшебным образом исчезают.

Чтобы скрыть виджет (но не удалить из памяти), вы должны использовать grid_forget() или grid_remove() для удаления из сетки и из памяти.

Теперь, когда вы помещаете 1, вы создаете записи в первой строке, а когда вы помещаете 3, вы создаете снова записи в первой строке, так что у вас есть две записи в каждой ячейке в первой строке - одна над другой - предыдущие записи не исчезают.

BTW: Это может быть проще, если вы сохраните записи в списке - self.entries[0], self.entries[1] и т. Д. Или как 2-мерный список self.entries[row][col].

+0

И 'grid_forget()', и 'grid_remove()' не будут уничтожать виджет. Они оба просто удаляют виджет из сетки. 'grid_remove()' будет хранить информацию о сетке виджета, а затем просто вызывать 'grid()', чтобы вернуть виджет в ту же позицию в сетке, что и раньше. 'grid_forget()' будет 'забывать 'информацию о сетке. – acw1668

+0

Прохладный Я на самом деле пробовал grid_forget(), и он работает, спасибо много .... Кстати, что вы имеете в виду, сохраняя мои записи в списке? – KaraiKare

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