2017-07-25 62 views
1

我正在處理我的第一個Tkinter項目,並且已經使用了幾個stackoverflow答案和解釋(以及它們導致的其他鏈接)作爲試圖瞭解如何構建我的應用程序的基礎。在循環中創建的Tkinter複選框

我結構性我的應用程序閱讀這個問題後(大多數來自接受答案的鏈接):Switch between two frames in tkinter

在我的幀中的一個,我需要創建使用for循環複選框。我發現這個頁面有幫助:How do I create multiple checkboxes from a list in a for loop in python tkinter

我很難得到默認情況下(我想要的行爲)最初選中的所有複選框。

我的代碼的相關部分如下(python2.7):

import Tkinter as tk 

class Main(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     ... 
     ## gets set on a different frame in the application 
     self.files_list = [] 

class A(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     ... 
     ## self.f_list contains the values (a list of dictionaries) that I am expecting on this frame 
     self.f_list = controller.files_list 

     for f in self.f_list: 
      self.file_name = tk.StringVar() 
      self.file_name.set(f['file']) 
      self.run_file = tk.IntVar() 
      self.run_file.set(1) 
      cb = tk.Checkbutton(self, text=self.file_name.get(), variable=self.run_file) 
      cb.pack() 

這將產生列表,我期望的「文件名」,每一個複選框。但是,運行時僅檢查循環產生的最後一個複選框。

之前調用pack方法,我把打印語句通過循環打印self.run_file.get(),每次它打印我試圖改變我的循環幾種不同的方法1.

值:

## same behavior 
self.run_file = tk.Variable() 
self.run_file.set(1) 

## same behavior 
self.run_file = tk.IntVar(value=1) 

## no checkboxes set 
cb = tk.Checkbutton(self, text=self.file_name.get(), variable=self.run_file.get()) 

我覺得自self.file_name的值每次通過循環都是不同的,這裏沒有問題。由於最後一個複選框是默認選中的,它讓我覺得值在前面的複選框中丟失了,但是我不知道如何構造我的複選框或self.run_file變量,以便默認情況下檢查每個框。在閱讀此問題後,我正在使用for循環中的變量:Python, Tkinter : if there a way to check checkboxes by default?

我已經查看了圍繞此主題的許多不同問題,但仍無法得出正確的答案。有人能指引我朝着正確的方向嗎?

回答

0

您的問題是在for循環中每次迭代都會覆蓋self.run_file。爲了確保每個複選框的IntVar不會被覆蓋,存儲它們分別,例如在一個列表:

self.run_file_IntVars = [] 

for i, f in enumerate(self.f_list): 
    self.run_file_IntVars.append(tk.IntVar(value=1)) 
    cb = tk.Checkbutton(self, text=f['file'], 
         variable=self.run_file_IntVars[i]) 
    cb.pack() 
+1

使完整意義上的。謝謝,像魅力一樣工作。有點覺得這就是發生了什麼事情,但甚至沒有考慮列入清單。再次感謝。 – avaholic