2013-05-14 2 views
1

У меня возникли некоторые проблемы со следующим кодом. Это первый раз, когда я работаю с графическим интерфейсом, и прошло некоторое время с тех пор, как я работал с python. Когда я пытаюсь выполнить функцию solfield с помощью кнопки, она не выводит результат.Порядок выполнения Python с графическим интерфейсом

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

Вы должны использовать другое имя переменной, чем 'solfield' в вашей функции' solfield'. Это, вероятно, вызовет у вас проблемы. – SethMMorton

+0

Как примечание, 'n = float()' такое же, как 'n = 0.0', и в действительности нет веских оснований для этого. Я не думаю, что вам нужна глобальная переменная. Если вы это сделаете, вы, вероятно, не хотите, чтобы оно было 0 (иначе 'solfield()' всегда будет печатать '0' ...). Итак, предположительно вы собираетесь установить «реальную ценность» в какой-то момент. Если это так, вам не нужно сначала устанавливать его в 'float()', а затем устанавливать его на реальное значение. Python не требует, чтобы вы «объявляли переменные наверху», как C. – abarnert

ответ

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 функций. Удалите пустую функцию (ту, которая имеет проход), и используйте другое имя переменной в оставшейся функции.

Это не вызывает у вас актуальная проблема, но это, конечно, добавив к путанице, что делает его более трудным для вас, чтобы найти проблему. (Например, если вы не включили лишнее пустое определение solfield на всех, вы получили бы в неправильной линии в NameError, которая сделала бы вещи легче отлаживать.)


Собирает все вместе, что вы должны сделать, это:

  1. Избавьтесь от пустого (pass -только) определения solfield.
  2. Переместите реальную реализацию solfield над точкой, где вы создаете графический интерфейс.
  3. Не указывайте локальную переменную solfield внутри функции.
  4. Простой только solfield, а не solfield() как command для calculate_button.
+0

Это часть проблемы. Другая часть состоит в том, что они не определяют 'solfield' до тех пор, пока не покинет mainlop. –

+1

Он определил 'solfield' * после * он использовал его. Вероятно, он думал, что ему нужно объявление функции, как в 'C'. Я думаю, что переместить определение туда, где поможет «декларация». – SethMMorton

+0

@BryanOakley: Извините, я быстро переписал свой ответ, чтобы получить все очки Сета в мой ответ (так как он удалил и свой комментарий, и ответ, но они были важны). Хорошая ли текущая версия? – abarnert

Смежные вопросы