2014-09-13 4 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

Ok, закончил код для вас, жаль, что потребовалось некоторое время, и это не очень удивительно, но вы можете легко персонализировать его! – W1ll1amvl

+0

Спасибо, это здорово! не волнуйся, ты сделал мне одолжение. Я вечно благодарен. – user2456977

ответ

1

Проблема является переменной i, что вы используете, не то, что он заменяет метку каждый раз, но он ставит метку в том же месте каждый раз, эффективно покрывая старую этикетку вверх. Это происходит из-за вас установку i=0внутри функции add_letter, вы должны принять его и при использовании глобал, global i в обоих местах, то есть

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

Однако, это не является идеальным либо как пространство между буквами довольно велико (из-за нижних виджетов). Я рекомендую использовать .place(x=..., y=...), чтобы преодолеть это, но это означает, что вам нужно будет использовать .place() везде, поэтому потребуется большое изменение кода.

Edit: здесь переработан код с.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

+0

кажется, что место() может быть опцией bc, я хочу поместить буквы в определенные области. Могли бы вы его изменить? Еще раз спасибо за ваш вклад. – user2456977

+0

Да, плохо сделайте это и опубликуйте позже, (с .place()) :) – W1ll1amvl

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