带GUI的Python执行顺序

时间:2013-05-14 23:18:15

标签: python user-interface tkinter execution

我在使用以下代码时遇到了一些问题。这是我第一次使用GUI并且已经有一段时间了,因为我也使用过python。当我尝试使用按钮执行solfield函数时,它不会产生任何输出。

from Tkinter import *
import math

master = Tk()

n = float()
I = float()


def solfield():
    pass



label_coils = Label(text='Number of Coils Per Meter', textvariable=n)
label_coils.grid()
coils = Entry(master)
coils.grid()

label_current = Label(text='Current in Amps', textvariable=I)
label_current.grid()
current = Entry(master)
current.grid()

calculate_button = Button(text='Calculate', command=solfield())
calculate_button.grid()
label_bfield = Label(text='B Field in +z Direction')
label_bfield.grid()
label_result = Label(text='solfield')
label_result.grid()


master.title('Coil Gun Simulation')
master.mainloop()


def solfield():
    mu0 = math.pi*4e-7
    solfield = mu0*n*I
    print solfield

任何其他提示也会受到赞赏,因为最终会有更多代码供我使用。

这已经解决了。如果有人有兴趣,这里是几个修复后的代码:

from Tkinter import *
import math

master = Tk()

label_coils = Label(text='Number of Coils Per Meter')
label_coils.grid()
coils = Entry(master)
coils.grid()

label_current = Label(text='Current in Amps')
label_current.grid()
current = Entry(master)
current.grid()



def solfield():
    mu0 = math.pi*4e-7
    n = float(coils.get())
    I = float(current.get())
    fieldmag = mu0*n*I
    print fieldmag

calculate_button = Button(text='Calculate', command=solfield)
calculate_button.grid()
label_bfield = Label(text='B Field in +z Direction')
label_bfield.grid()
label_result = Label(text='solfield')
label_result.grid()



master.title('Coil Gun Simulation')
master.mainloop()

1 个答案:

答案 0 :(得分:2)

问题在于:

calculate_button = Button(text='Calculate', command=solfield())

要将函数solfield本身作为command传递,只需使用其名称:

calculate_button = Button(text='Calculate', command=solfield)

你正在做的是调用函数,然后将该函数的返回值作为命令传递。

由于您将上面的solfield定义为无效函数,因此返回值为None,因此您告诉calculate_buttoncommand=None,并且它正在执行什么都没有。


与此同时,正如SethMMorton指出的那样(但随后被删除):

  

您有两个名为solfield的函数,并且您在一个solfield函数中命名变量solfield。删除空函数(带有pass的函数),并在剩余函数中使用不同的变量名。

这不会导致您的实际问题,但它肯定会增加混乱,使您更难找到问题。 (例如,如果您根本没有包含solfield的多余空定义,那么您将在错误的行中获得NameError,这会使调试更容易。)


总而言之,你应该做的是:

  1. 摆脱pass
  2. 的空(solfield - 定义)
  3. solfield的实际实现移到高于构建GUI的位置。
  4. 不要在函数中命名局部变量solfield
  5. 只传递solfield而非solfield()作为command的{​​{1}}。