2015-08-28 34 views
1

那麼,我將如何刪除我的for循環內生成的所有Tkinter.Label,並在保留我的生成方法的同時生成新標籤?因爲如果我想降低數字,它不會刪除前一個數字的標籤(例如,輸入'6',你會得到[3,4,5],下一個數字'14'會生成[5,12,13]。刪除[5,12,13]如果我的input < 14?),如果有人有更好的方法來生成這些標籤的輸出,將不勝感激,如果你會嘗試教育我一點。 下面的代碼:我將如何刪除我的for循環中的標籤

import Tkinter 
import sys 
from fractions import gcd 


def func(event): 
    x = int(e1.get()) # get max number 
    row = 0 
    column = 0 
    count = 0 
    for a in range(1, x): # loops to get each value in range of x 
     for b in range(a, x): 
      for c in range(b, x): 
       if a**2 + b**2 == c**2 and gcd(a, b) == 1: # if it is a primitive pyth triple, print 
        row += 1 
        l = Tkinter.Label(root, text=('[',a,',',b,',',c,']')) 
        assert isinstance(l, object) 
        l.grid(row=row, column=column, ipadx=5, ipady=5, sticky='W''E') # display each group of triples to root 
        root.title('Primitive Triples') 
        if count > 1: 
         l.destroy() 
        if row == 7: 
         column += 1 
         row -= 8 


def close(): # close program 
    Tkinter.sys.exit(0) 
    sys.exit(0) 


root = Tkinter.Tk() # establish main gui 
root.title('Generator') 
e1 = Tkinter.Entry(root) 
assert isinstance(e1, object) # only method I've found to allow for Entry().grid() 
e1.grid(ipadx=5, ipady=5, sticky='W''E') 
root.bind('<Return>', func) # bind to Enter, cleaner and quicker than a button 
root.mainloop() 
+0

循環之前初始化'list'。在繼續下一次迭代之前,將當前的'Label'附加到這個'list'中。您可以稍後再引用它,以便與'config()','grid_forget()'一起使用,等等。記得在一個不會立即消失的範圍內初始化這個'list'。 – TigerhawkT3

回答

1

在這裏,我想這是你想要的東西:(如果蟒蛇2,用進口的Tkinter作爲Tkinter的替代進口的Tkinter)

import tkinter 
import sys 
from fractions import gcd 

CURRENT_LABELS = [] 

def pythagorean_primitive(a, b, c): 
    """returns True if a,b,c are pythagorean primitives, False otherwise""" 
    return a**2 + b**2 == c**2 and gcd(a, b) == 1 

def generate_results(n): 
    """lists each triplet of distinct integers <n that is a pythagorean primitive""" 
    results = [] 
    for a in range(1, n): 
     for b in range(a, n): 
      for c in range(b, n): 
       if pythagorean_primitive(a, b, c): 
        results.append([a, b, c]) 
    return results 

def generate_labels(sequence): 
    """returns a list of tkinter labels from the sequence provided""" 
    labels = [] 
    for elt in sequence: 
     a, b, c = elt[0], elt[1], elt[2] 
     labels.append(tkinter.Label(root, text='[' + str(a) + ', '+ str(b) + ", " + str(c) + "]")) 
    return labels 

def destroy_old(): 
    """purges the current tkinter labels from root, and destroys them""" 
    global CURRENT_LABELS 
    for elt in CURRENT_LABELS: 
     elt.grid_forget() 
     elt.destroy() 

def show_new_labels(sequence): 
    """assembles a new display of tkinter labels from the sequence provided""" 
    r, c = 1, 0 
    for label in sequence: 
     label.grid(row=r, column=c, ipadx=5, ipady=5, sticky='W''E') 
     r += 1 
     if not r % 10: 
      r = 1 
      c += 1 

def event_handler(event): 
    """deals with the input of a number in the Entry field""" 
    global CURRENT_LABELS 
    x = int(e1.get()) # get max number 
    results = generate_results(x) 
    try: 
     destroy_old() 
    except IndexError: 
     pass 
    CURRENT_LABELS = generate_labels(results) 
    show_new_labels(CURRENT_LABELS) 


def close(): # close program 
    tkinter.sys.exit(0) 
    sys.exit(0) 


root = tkinter.Tk() # establish main gui 
root.title('Generator') 
e1 = tkinter.Entry(root) 
assert isinstance(e1, object) # only method I've found to allow for Entry().grid() 
e1.grid(ipadx=5, ipady=5, sticky='W''E') 
root.bind('<Return>', event_handler) # bind to Enter, cleaner and quicker than a button 
root.mainloop() 

什麼已經從碼本來改變貼如下:

  • 重構每個相干步驟出來的膨鬆函數的成單獨和 大多獨立的功能具有更多口才名稱。變量的名稱也更改爲更易讀。
  • 因此,結果的計算獨立於其顯示格式。
  • 結果彙總在列表中
  • 該列表被傳遞以創建tkinter.Labels以供顯示;這些標籤彙總在一個列表中。
  • 顯示先前計算結果的(舊)​​標籤將從顯示屏上消失,並被銷燬。
  • 然後顯示保存新計算結果的新標籤。

原代碼試圖在一個函數中做所有的事情;它沒有放棄舊的結果;其結果是(1)顯示是新舊結果的奇怪組合(不準確和不精確),(2)丟棄,但從未銷燬的小部件混亂了應用程序空間。

在OSX,小部件看起來是這樣的:

results for entry = 16

results for entry = 200

+1

這是完美的男人,謝謝,我剛剛調整了'show_new_labels(sequence)'如果不是r%20: r = 0 c + = 1' – Bob

+0

太棒了,如果你很高興,請考慮投票:) –

+0

如果您描述了更改,您的答案會更好,否則我們必須逐行比較您的代碼和問題中的代碼。 –