2016-11-19 3 views
1

У меня есть следующий код, и я хочу инициализировать виджеты значением по умолчанию, но они настаивают на том, чтобы этого не делать. Я устанавливаю переменные StringVar(), я назначаю их, и он все еще не работает. Какие-либо предложения?Установка значений по умолчанию в окне Toplevel()

import tkinter as tk 
from tkinter import ttk 

class popup(): 

    def __init__(self): 
     edit_window=tk.Toplevel() 

     works_checkbutton_val=[tk.IntVar()]*7 
     start_time_combo_val=[tk.StringVar()]*7 
     end_time_combo_val=[tk.StringVar()]*7 

     datapoint=['Joe Blow','8 AM to 5 PM','8 AM to 5 PM','8 AM to 5 PM','8 AM to 5 PM','8 AM to 5 PM','8 AM to 5 PM','8 AM to 5 PM','3foobarIID'] 
     headings =['Employee Name','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'] 

     for row in range(1,len(datapoint)-1): 
      ttk.Label(edit_window, text=headings[row]).grid(row=row+1, column=0, sticky='e', pady=((7.5,0),(7.5,7.5))[row==len(datapoint)-2], padx=5) 

      ttk.Label(edit_window, text=headings[0]).grid(row=0, column=0, sticky='e', pady=(7.5,0), padx=5) 
      employee_name_entry = ttk.Entry(edit_window) 
      employee_name_entry.insert(0, datapoint[0]) 
      employee_name_entry.grid(row=0, column=1, columnspan=4, pady=(7.5,0), padx=5, sticky='ew') 

     works_checkbutton=[] 
     start_time_combo=[] 
     end_time_combo=[] 
     for row in range(1,len(datapoint)-1): 
      split_time=datapoint[row].split(' to ') 
      if len(split_time)==1: 
       works_checkbutton_val[row-1].set(0) 
       start_time_combo_val[row-1].set('0 AM') 
       end_time_combo_val[row-1].set('0 AM') 
      else: 
       works_checkbutton_val[row-1].set(1) 
       start_time_combo_val[row-1].set(split_time[0]) 
       end_time_combo_val[row-1].set(split_time[1]) 

      works_checkbutton.append(ttk.Checkbutton(edit_window, variable = works_checkbutton_val[row-1])) 
      works_checkbutton[row-1].grid(row=row+1, column=1, padx=2.5, pady=(0,(0,7.5))[row==len(datapoint)-2], sticky='s') 

      start_time_combo.append(ttk.Combobox(edit_window, values=["%s AM"%(x+1) for x in range(12)] + ["%s PM"%(x+1) for x in range(12)],textvariable=start_time_combo_val[row-1])) 
      start_time_combo[row-1].grid(row=row+1, column=4, pady=((7.5,0),(7.5,7.5))[row==len(datapoint)-2], padx=5) 

      end_time_combo.append(ttk.Combobox(edit_window, values=["%s AM"%(x+1) for x in range(12)] + ["%s PM"%(x+1) for x in range(12)],textvariable=end_time_combo_val[row-1])) 
      end_time_combo[row-1].grid(row=row+1, column=3, pady=((7.5,0),(7.5,7.5))[row==len(datapoint)-2], padx=5) 


main_window=tk.Tk() 
b1 = ttk.Button(main_window,text='here',command=lambda:popup()) 
b1.pack() 
main_window.mainloop() 
+0

вам нужно '[tk.IntVar() для х в диапазоне (7)],' [tk.StringVar() для х в диапазоне (7)] ' – furas

+0

Спасибо, что решается еще одна проблема у меня была со всеми связанными параметрами. Но я все еще не получаю инициализацию значения. – Vedvart1

ответ

1

IntVar, StringVar переменные хранятся в локальных переменных. Они исчезнут после возвращения функции popup.

Вам необходимо сохранить их (по крайней мере, до тех пор, пока не будет установлен верхний уровень). Например, следующие строки сохраняют переменные как переменные экземпляра edit_window, так что они выживут, пока значение edit_window будет действительным.

edit_window.vals1 = works_checkbutton_val = [tk.IntVar() for i in range(7)] 
edit_window.vals2 = start_time_combo_val = [tk.StringVar() for i in range(7)] 
edit_window.vals3 = end_time_combo_val = [tk.StringVar() for i in range(7)] 
+0

Это сработало, спасибо. – Vedvart1

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