2016-09-27 651 views
0

我在堆棧溢出處理過這裏的主題,但無法理解任何內容。 (是的,我已經看到答案已經回答,但真的不明白。)tkinter - python 3 - 清除屏幕

所以,這是事情。 我正在構建一個小型應用程序,可以將來自團隊的夫婦配對我們正在參加的比賽。我成功地建立了配對玩家的算法,並且我決定讓每個人都更容易接受,並開始研究ktinker。

我設法讓我的應用程序,以顯示是這樣的:

Title 
info 
info 
info 
info 
info 
Button 

按鈕想重新運行整個事情(下一輪)和它的作品。我設法使用適當的標題,甚至在屏幕末尾添加了一個新按鈕。我遇到的唯一問題是我想擺脫上面的所有文字。摧毀它,只是畫一個新的頁面。

現在,代碼:

from tkinter import * 

root = Tk() 

root.title("Tournament") 
root.geomerty("50x180") 

app = Frame(root) 
app.grid() 

run_application() # my pairings 
#inside the code i'm pairing the players and then: 
for players in player_paired: 
    label=Label(app, text=players[0]+' vs. '+players[1] # its a tuple 
    label.grid() 
button=Button(app,text="Next Round", command=run_application) 
button.grid() 

#end of run_application 

root.mainloop() 

所以,我嘗試添加到我的 「run_application」 開始的下一行:

app.destroy() 
app = Frame(root) 
app.grid() 

,並得到「UnboundLocalError:局部變量「應用程序'參考之前「

會有人幫忙嗎?我無法弄清楚這一點。 (如果能夠寫例子,這將有很大幫助)

Ofek。

+0

不,我不能使用run_application(app),因爲當我聲明按鈕「button = Button(app,text =」Next Round「,command = run_application)」並添加(app)時,它會自動運行它,結束了無盡的遞歸。所以,這不是這裏的解決方案。 –

+0

我不確定您是否閱讀過重複內容。這不是它所暗示的。你有同樣的錯誤,同樣的問題,同樣的解決方案將起作用。 – jonrsharpe

+0

我想我是。 python中的作用域不允許我在聲明它的函數之前「銷燬」應用程序。現在,如果我想用「app」作爲參數來調用函數,它會以無窮遞歸結束。 –

回答

1

最簡單的解決方案是將想要銷燬的所有東西放在一個框架中,然後您可以簡單地銷燬並重新創建框架,或者銷燬框架中的所有子項。

在您的具體情況下,使button的父項爲root,然後您可以在每次按下按鈕時銷燬並重新創建app的內容。

這裏是一個例子。我冒昧地切換你導入的方式,以符合PEP8:

import tkinter as tk 
from random import shuffle 

participants = [ 
    "Fred Flintstone", "Barney Rubble", "Wilma Flintstone", "Betty Rubble" 
] 

def get_pairings(): 
    '''for simulation purposes, this simply randomizes the participants''' 
    global participants 

    # see http://stackoverflow.com/a/23286332/7432 
    shuffle(participants) 
    return zip(*[iter(participants)]*2) 


def reset(): 
    '''Reset the list of participants''' 
    for child in app.winfo_children(): 
     child.destroy() 

    for players in get_pairings(): 
     label = tk.Label(app, text="%s vs. %s" % players) 
     label.grid() 

root = tk.Tk() 

root.title("Tournament") 

app = tk.Frame(root) 
app.grid() 

button=tk.Button(root,text="Next Round", command=reset) 
button.grid() 

# this sets up the first round 
reset() 

root.mainloop() 
0

根據我的經驗,我發現刪除元素更容易。這是你可以做的事情。我並沒有太多時間,所以我將使用我的代碼中的示例,而不是編輯代碼。

因此,對於您的標籤,您可以做到這一點。

labels = [] 
for players in player_paired: 
    label=Label(app, text=players[0]+' vs. '+players[1] # its a tuple 
    label.grid() 
    labels.append(label) 

然後刪除文本有一個方法,做這樣的事情。

for label in labels: 
     label.destroy() 

然後回到開始之後。