2016-11-19 3 views
1

Ich habe den folgenden Code, und ich möchte die Widgets auf einen Standardwert initialisieren, aber sie bestehen darauf, dies nicht zu tun. Ich setze die StringVar() Variablen, die ich ihnen zuweise, und es funktioniert immer noch nicht. Irgendwelche Vorschläge?Festlegen von Standardwerten in einem Toplevel() - Fenster

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

Sie müssen '[tk.IntVar() für x in Bereich (7)]', '[tk.StringVar() für x in Bereich (7)]' – furas

+0

Danke, das ein anderes Problem gelöst hatte ich mit allen Optionen verknüpft werden. Aber ich bekomme immer noch keine Wert Initialisierung. – Vedvart1

Antwort

1

Die IntVar werden StringVar Variablen in lokalen Variablen gespeichert. Sie werden weg sein, sobald die popup Funktion zurückkehrt.

Sie müssen sie behalten (zumindest bis der Toplevel gültig ist). Zum Beispiel speichern folgende Zeilen die Variablen als edit_windows Instanzvariablen, so dass sie überleben, während der edit_window Toplevel gültig ist.

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

Das hat funktioniert, danke. – Vedvart1

Verwandte Themen