2016-01-23 2 views
0

Я пытаюсь создать графический интерфейс с неопределенным количеством таблиц с циклом for. количество таблиц должно быть изменено с помощью функции func, запускаемой кнопкой. Вот мой код:Обновление диапазона для цикла с кнопкой

from tkinter import * 


def change1(): 
    print(days) 
    in1 = input('how many days?') 
    for a in range(0, len(days)): 
     days.remove(days[0]) 
    for a in range(0, int(in1)): 
     in2 = input('type in another day: ') 
     days.append(in2) 
    krofl = (days[0], '-', days[len(days)-1]) 
    firstlast.set(krofl) 

Fenster = Tk() 
Fenster.title("some title") 
Fenster.minsize(width=800, height=900) 
Fenster.resizable(width=FALSE, height=FALSE) 

presetdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] 

days = [] 

for a in range(0, len(presetdays)): 
    days.append(presetdays[a]) 

firstlast = StringVar() 
firstlast.set(str("preset value")) 

lab1_1 = Label(Fenster, text='Zeitspanne:') 
lab1_1.grid(row=0, column=0) 

lab1_2 = Label(Fenster, textvariable = firstlast) 
lab1_2.grid(row=0, column=1) 

but1 = Button(Fenster, text='Change', command=change1) 
but1.grid(row=0, column=2) 


for a in range(0, len(days)): 
    karamel = Label(Fenster, text = days[a]) 
    karamel.grid(row=a, column=6) 

Fenster.mainloop() 

Моя проблема заключается в том, что список ярлыках, лейблах будет пн, вт ..... даже после нажатия на кнопку & изменения списка дней. Я попытался следующие:

number_days = IntVar() 
number_days.set(7) 

и добавить это в четкости change1:

sth = int(len(days)) 
number_days.set(sth) 

и изменения для цикла в конце концов это:

for a in range(0, number_days): 
karamel = Label(Fenster, text = days[a]) 
karamel.grid(row=a, column=6) 

но он возвращает этот error: ТипError: 'IntVar' объект не может быть интерпретирован как целое число

Есть ли способ получить эту работу, чтобы все обновления lables после def change1()?

ответ

1

number_days не является нормальной целочисленной переменной. Объект IntVar. Вы должны использовать number_days.get()


Чтобы изменить ярлыки вы должны помнить karamel для всех наклеек в списке (например all_labels), а затем использовать all_labels[number].config(text='new text') или all_labels [число] [ «текст»] = «нового текст» `

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

from tkinter import * 


def change_labels(): 
    print(days) 

    in1 = int(input('how many days?')) 

    # remove all old days 
    days.clear() 

    for a in range(in1): 
     in2 = input('type in another day: ') 
     days.append(in2) 

    krofl = (days[0], '-', days[-1]) 
    firstlast.set(krofl) 

    # it is simpler to remove all labels and create new labels 

    # remove all old labels 
    for l in labels:  
     l.grid_forget() 

    # create new labels 
    for number, name in enumerate(days): 
     karamel = Label(Fenster, text=name) 
     karamel.grid(row=number, column=6) 
     labels.append(karamel) 


# --- 

presetdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] 

# copy list 
days = presetdays[:] 

# --- 

Fenster = Tk() 
Fenster.title("some title") 
Fenster.minsize(width=800, height=900) 
Fenster.resizable(width=FALSE, height=FALSE) 

firstlast = StringVar() 
firstlast.set(str("preset value")) 

lab1_1 = Label(Fenster, text='Zeitspanne:') 
lab1_1.grid(row=0, column=0) 

lab1_2 = Label(Fenster, textvariable = firstlast) 
lab1_2.grid(row=0, column=1) 

but1 = Button(Fenster, text='Change', command=change_labels) 
but1.grid(row=0, column=2) 

# --- create labels first time 

labels = [] 

for number, name in enumerate(days): 
    karamel = Label(Fenster, text=name) 
    karamel.grid(row=number, column=6) 
    labels.append(karamel) 

Fenster.mainloop() 
+0

вы имеете в виду изменения для цикла в конце концов: для в диапазоне (0, number_days.get():? ...... –

+0

вы попробовать его – furas

+0

да оно не возвращать но не обновлять lables ... –

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