2014-05-01 93 views
0

我是Tkinter的初學者,我想了解如何打開一個新窗口來計算某些變量。當在Tkinter中打開新窗口時出現錯誤信息

在這個例子中,出現一個帶有按鈕的第一個窗口(「輸入」)。按「開始」後,創建一個新的窗口,我可以導入一個圓周值,按直徑按鈕「轉換」轉換。

當我按下這個BUTTOM出現在控制檯中的錯誤:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ 
    return self.func(*args) 
    File "C:/Users/samsung/PycharmProjects/test_FirstDensity/openANDread.py", line 55, in convert 
    convert = tk.Button(c2d, text="Convert", command=convert_c2d, activeforeground="red") 
UnboundLocalError: local variable 'convert_c2d' referenced before assignment 

我嘗試了幾種解決方案,而解決我的問題。

我的代碼是:

from __future__ import division 
from Tkinter import * 
from math import pi 
import tkMessageBox 
import Tkinter, Tkconstants, tkFileDialog 
from numpy import nan 
import Tkinter as tk 




class MainWindow(Frame): 
    def __init__(self): 
     Frame.__init__(self) 
     self.filename = None 
     self.master.title("input") 
     self.master.minsize(250, 150) 
     self.grid(sticky=E+W+N+S) 

     top=self.winfo_toplevel() 
     top.rowconfigure(0, weight=1) 
     top.columnconfigure(0, weight=1) 

     for i in range(1): self.rowconfigure(i, weight=1) 
     self.columnconfigure(1, weight=1) 

     self.button0 = Button(self, text="start", command=self.convert, activeforeground="red") 
     self.button0.grid(row=0, column=1, pady=2, padx=2, sticky=E+W+N+S) 

    def convert(self): 
     c2d = Tk() 
     c2d.title("C2DBH converter") 
     c2d.minsize(350, 150) 
     c2d.grid() 

     res = StringVar(c2d) 
     res.set("---") 


     for i in range(3): c2d.rowconfigure(i, weight=1) 
     c2d.columnconfigure(1, weight=1) 

     label_c = tk.Label(c2d, text='Circumference') 
     label_c.grid(row=0, column=0, padx=2, sticky=E+W+N+S) 

     entry_c = Entry(c2d) 
     entry_c.grid(row=0, column=1, padx=2,sticky=E+W+N+S) 

     label_d = tk.Label(c2d, text='Diameter') 
     label_d.grid(row=1, column=0, padx=2, sticky=E+W+N+S) 

     result = tk.Label(c2d, textvariable=res, fg="red") 
     result.grid(row=1, column=1, pady=2, padx=2, sticky=E+W+N+S) 

     convert = tk.Button(c2d, text="Convert", command=convert_c2d, activeforeground="red") 
     convert.grid(row=2, column=0, columnspan=2, pady=2, padx=2, sticky=E+W+N+S) 

     def convert_c2d(n): 
      if not n.get(): 
       return res.set("Insert a numeric value.") 
      try: 
       c = float(n.get()) 
       diameter = c/pi 
       return res.set(str(diameter)) 
      except ValueError: 
       return res.set("Insert a numeric value.") 

回答

2

你應該定義函數就引用它之前。

>>> def f(): 
...  convert_c2d(1) 
...  def convert_c2d(n): 
...   pass 
... 
>>> f() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in f 
UnboundLocalError: local variable 'convert_c2d' referenced before assignment 
>>> def g(): 
...  def convert_c2d(n): 
...   pass 
...  convert_c2d(1) 
... 
>>> g() 
>>> 

如下代碼的簡單變化將解決你的問題:

def convert_c2d(n): 
    if not n.get(): 
     return res.set("Insert a numeric value.") 
    try: 
     c = float(n.get()) 
     diameter = c/pi 
     return res.set(str(diameter)) 
    except ValueError: 
     return res.set("Insert a numeric value.") 

convert = tk.Button(c2d, text="Convert", command=convert_c2d, activeforeground="red") 
convert.grid(row=2, column=0, columnspan=2, pady=2, padx=2, sticky=E+W+N+S) 

UPDATE

convert_c2d需要的參數。但tkinter不會用參數調用命令回調。你應該使用其他功能(或下面拉姆達)傳遞:

convert = tk.Button(c2d, text="Convert", command=lambda: convert_c2d(entry_c), 
        activeforeground="red") 

,或者你可以改變convert_c2d不採取任何參數,並進行功能直接訪問entry_c。 (嵌套函數可以從封閉範圍訪問變量)。

+0

哇謝謝!但我認爲我的代碼仍然是錯誤的,因爲當我插入一個值,我推動轉換我得到另一個消息錯誤(永遠不會結束!) –

+0

異常在Tkinter回調 回溯(最近呼叫最後): 文件「C:\ Python27 \ lib \ tk \ Tkinter.py「,行1470,在__call__ 返回self.func(* args) TypeError:convert_c2d()只需要1個參數(給出0) –

+0

@GianniSpear,我更新了答案。一探究竟。 – falsetru

相關問題