2014-09-13 84 views
0

我一直在這個很長一段時間,我已經做了大量的研究,但沒有發現任何有用的東西。tkinter標籤在框架使用網格

我想放置標籤 - 由字母'a' - 'j'組成的框架中。每隔幾秒鐘,我想讓下一個字母出現在前一個字母的旁邊。但是會發生的是,每隔幾秒鐘,新字母就會替代之前的字母 - 這意味着我再也看不到舊字母了。我試過很多東西,沒有任何工作。有人可以幫忙嗎?

我試過在父框架內的框架內製作所有標籤的網格佈局,但它對我來說太複雜了。有沒有辦法來解決這個問題?

from tkinter import * 
from ttk import * 
import random 

root = Tk() 

# there are 10 tiles 
tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

tiles_make_word = [] 

content = Frame(root) 
frame = Frame(content, borderwidth=5, relief="ridge", width=200, height=300) 
namelbl = Label(content, text="Enter words: ") 
name = Entry(content) 

ok = Button(content, text="Okay") 
cancel = Button(content, text="Cancel") 

content.grid(column=0, row=0) 
frame.grid(column=0, row=0, columnspan=12, rowspan=12) 
namelbl.grid(column=0, row=12) 
name.grid(column=1, row=12, columnspan=2) 

ok.grid(column=12, row=0) 
cancel.grid(column=13, row=0) 

def add_letter(): 
    global i 
    i=0 
    if not tiles_letter: 
     return 
    rand = random.choice(tiles_letter) 
    tiles_make_word.append(rand) 
    tile_frame_column = Label(content, text=rand) 
    tile_frame_column.grid(column=i, row=0) 
    tiles_letter.remove(rand) # remove that tile from list of tiles 
    i=i+1 
    root.after(2000, add_letter) 

root.after(2000, add_letter) 

root.mainloop() 
+0

好,已經完成了代碼,抱歉過了好一會兒,它不是超級驚人,但你可以很容易地個性化它! – W1ll1amvl 2014-09-15 07:36:49

+0

非常感謝!不要擔心你對我有利。我永遠感激。 – user2456977 2014-09-15 08:34:53

回答

1

的問題是變量i您正在使用,而不是它每次替換標籤,但它每次都放置標籤在同一個地方,將有效地覆蓋舊的標籤了。出現這是由於你設置i=0功能add_letter裏面,你需要把它拿出來,如果使用全局變量,global i在這兩個地方,即

global i 
i=0 
def add_letter(): 
    global i 
    i+=1 

然而,這是不理想或者作爲字母之間的空格很大(由於底部的小部件)。我建議使用.place(x=..., y=...)來克服這個問題,但這意味着您必須在任何地方都使用.place(),因此需要對代碼進行大的更改。

編輯:這裏是重新加工代碼.place()使用:

from tkinter import * 
import random 

root = Tk() 

root.geometry("350x300") 
# there are 10 tiles 
tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

tiles_make_word = [] 

namelbl = Label(root, text="Enter words: ") 
name = Entry(root) 

ok = Button(root, text="Okay") 
cancel = Button(root, text="Cancel") 

namelbl.place(x=35, y=200) 
name.place(x=110, y=200, width=100) 

ok.place(x=200, y=100) 
cancel.place(x=250, y=100) 

global i 
i=35 

def add_letter(): 
    global i  
    if not tiles_letter: 
     return 
    rand = random.choice(tiles_letter) 
    tiles_make_word.append(rand) 
    tile_frame_column = Label(root, text=rand) 
    tile_frame_column.place(x=i, y=50) 
    tiles_letter.remove(rand) # remove that tile from list of tiles 
    i+=10 
    root.after(2000, add_letter) 

root.after(2000, add_letter) 
+0

感謝您的幫助!你認爲在我的情況下使用地點,網格或包裹更容易嗎?我認爲網格在我的情況下是最簡單的 – user2456977 2014-09-14 02:55:37

+0

它看起來像place()可能是選項BC我想把字母放在特定區域。你能改變它嗎?再次感謝您的輸入。 – user2456977 2014-09-14 03:45:00

+0

是的,生病了,之後再發佈一個編輯(使用.place()):) – W1ll1amvl 2014-09-14 04:42:30