2014-11-14 39 views
-2

下面是我的Tkinter窗口之一作爲入口表單設計。它有許多行(通常由另一個函數定義)和一組由len(self.names)定義的列。TkInter發送字符串到IntVar

Tkinter Int和String變量正在被正確創建,但是當根據條目窗口小部件中的值設置Int的值時,它將拋出一個錯誤,指出int()的基數爲10的無效字面值:''。我知道你不能將一個字符串設置爲一個int,但即使在我嘗試設置該值之前,很明顯文本變量沒有正確鏈接到IntVar,因爲在其他窗口中,入口小部件具有默認值IntVar支持它的值爲0,在這種情況下,這不會發生。

你應該能夠運行下面的代碼,它是一個(主要)工作班級。

任何有識之士將不勝感激。

from Tkinter import * 

class app: 

    def __init__(self): 

     self.getFiles() 

    def getFiles(self): 
     self.numHelidays = 2 
     root=Tk() 
     self.master=root 

     self.files = [] 
     self.names = ("HELI", "DAY", "DATE (yyyymmdd)", "type or browse for group shapefiles", "type or browse for route shapefiles") 

     i = 0 
     for f in self.names: 
      self.fileLabel=Label(self.master,text=f) 
      self.fileLabel.grid(column=i, row=0) 
      i = i+1 

     for heliday in range(self.numHelidays): 
      self.files.append([]) 
      col = 0 
      for column in self.names: 
       if col == 3 or col == 4: 
        self.fileEntry=Entry(self.master,width=60, textvariable = self.files[heliday].append(StringVar())) 
       else: 
        self.fileEntry=Entry(self.master,width=60, textvariable = self.files[heliday].append(IntVar())) 
       #self.files[heliday][col].set(self.fileEntry) 
       self.fileEntry.grid(column = col, row=heliday+1) 

       col = col+1 

#now for 'next' button 
     self.submit = Button(self.master, text="Finish...", command=self.fileManager, fg="red") 
     self.submit.grid(row=(self.numHelidays)+2, column=0) 

     # self.quit = Button(self.master, text="Quit...", command=self.deleteData, fg="red") 
     # self.quit.grid(row=(self.numHelidays)+2, column=1) 

    def fileManager(self): 
     print self.files 
     for i in self.files: 
      for l in i: 
       print l.get() 

app() 

編輯:

現在是以這種形式。似乎試圖將字符串/ intvar追加到列表中,同時也試圖將其分配給textvariable不起作用,我必須在將其分配給textvariable之前創建字符串/ intvar,然後將其追加。我不明白爲什麼這應該工作,但上面沒有,因爲肯定它做同樣的事情。我猜Python只是在上面的腳本中以錯誤的順序執行操作。

  if col == 3 or col == 5: 
       txt = StringVar() 
       self.fileEntry=Entry(self.master,width=60, textvariable = txt) 
       self.fileEntry.grid(column = col, row=heliday+1) 
      else col == 2: 
       txt = IntVar() 
       self.fileEntry=Entry(self.master,width=20, textvariable = txt) 
       self.fileEntry.grid(column = col, row=heliday+1) 

      self.files[heliday].append(txt) 
      self.files[heliday][col].set(txt.get()) 
      col = col+1 
+1

這段代碼是如何解釋這個問題的?你在哪裏設置「相關IntVar的價值」?當它拋出錯誤時,錯誤是什麼? – 2014-11-14 13:33:39

回答

0

顧名思義,textvariable應該是一個StringVar實例。你必須將你得到的字符串轉換爲任何其他類,就像int一樣。

因爲tcl與字符串一起工作,所以即使您將非字符串對象傳遞給.set(),Vars也會設置爲字符串。但是,Intvar.get()在字符串上調用int,因此如果它不能轉換爲int,則會引發ValueError。

>>> root=tk.Tk() 
>>> i = tk.IntVar(root) 
>>> i.set(11) 
>>> i.get() 
11 
>>> i.set('11') 
>>> i.get() 
11 
>>> i.set(11.3) 
>>> i.get() 
11 
>>> i.set('abc') 
>>> i.get() 
Traceback (most recent call last): 
    File "<pyshell#15>", line 1, in <module> 
    i.get() 
    File "C:\Programs\Python34\lib\tkinter\__init__.py", line 358, in get 
    return getint(self._tk.globalgetvar(self._name)) 
ValueError: invalid literal for int() with base 10: 'abc' 
>>> i.set([1]) 
>>> i.get() 
... 
ValueError: invalid literal for int() with base 10: '[1]' 

如果您有任何疑問,實驗是這樣確定的事情是如何工作的。