簡體   English   中英

在 Tkinter 中打開新窗口時出現錯誤消息

[英]Error message when opening new window in Tkinter

我是 Tkinter 的初學者,我試圖了解如何打開一個新窗口來計算一些變量。

在這個例子中,出現了一個帶有按鈕的第一個窗口(“輸入”)。 按“開始”后,將創建一個新窗口,我可以在其中導入周長值以按“轉換”按鈕轉換為直徑。

當我按下這個按鈕時,控制台中會出現一個錯誤:

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.")

您應該在引用函數之前定義它。

>>> 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)

更新

convert_c2d接受一個參數。 但是 tkinter 不會使用參數調用命令回調。 您應該使用另一個函數(或 lambda 如下)傳遞它:

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

或者您可以更改convert_c2d不接受任何參數,並使函數直接訪問entry_c (嵌套函數可以從封閉范圍訪問變量)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM